2016-06-19 2 views
3

Я получил короткий ответ на этот вопрос, поэтому надеюсь, что есть кто-то, кто может мне помочь.Вставить HTML-код после строки String/String

Я пытаюсь установить Вставить HTML до и после подстроки или позиции в тексте для создания новых встроенных элементов или переноса существующего текста. Я бы просто использовал innerHTML и делал это уже, но мне бы очень хотелось сохранить возможные прослушиватели событий, которые могут быть связаны с этим конкретным DOMNode. Есть ли метод или прототип элемента, который обрабатывает textNodes как отдельные элементы, которые позволят мне добавлять HTML после или до него?

Код может работать следующим образом:

var testParagraph = document.getElementById("TestParagraph"); 

/** 
    text nodes would represent each item 
    that has been seperated by a space, for example 
**/ 

testParagraph.insertBefore(document.createElement("span"), testParagraph.textNodes[3]) 

Спасибо за ваше время!

ответ

2

Если вы хотите вставить элементы DOM в текст, то не будет проблемой обработчиков событий, поскольку обработчики событий не могут быть связаны на сам текст. Возможно, и проще, чем вы могли подумать, изменить содержимое элемента DOM без уничтожения каких-либо обработчиков событий.

function insertAtStringPos(el, pos, insertable) { 
    if(!el.children.length) { 
     var text  = el.outerText; 
     var beginning = document.createTextNode(text.substr(0, pos)); 
     var end  = document.createTextNode(text.substr(pos - text.length)); 

     while (el.hasChildNodes()) { 
      el.removeChild(el.firstChild); 
     } 

     el.appendChild(beginning); 
     el.appendChild(insertable); 
     el.appendChild(end); 
    } 
} 

Пример: http://jsfiddle.net/9a8rxhp4/

+0

.. и вилку для отображения элемента, вставленного с элементами/текстом внутри него: http://jsfiddle.net/jxadjfeo/ – bitten

+0

Это замечательно! Я не смог заставить его работать в FireFox 47.0 как FYI, но в Chrome он работал так же, как и вы сказали. Спасибо за образец кода! – lindsay

+0

Как и в стороне, я заметил, что если в контейнере есть дочерние элементы HTML, они не будут заменены из текста замены. Есть ли обходной путь для этого? – lindsay

1

вы можете использовать split() для разделения текста элемента.

var res = testParagraph.text().split(" "); 
// each word is now in the res[0],res[1] .. 
//and then you can create a textNode 
var textNode1 = document.createTextNode("before"); 
var textNode2 = document.createTextNode(res[0]); 

var spanElement = document.createElement("span");  
spanElement.appendChild(textNode1); 
spanElement.appendChild(textNode2); 
//... 
//then return them into the testParagraph 
testParagraph.appendChild(spanElement); 
+0

Спасибо за ваш ответ. Может ли этот метод позволить мне сделать следующее? Преобразование этой строки из: '

Hello this is a test
' в возможно это '
Hello this is a test
' или даже '
Hello this is a test
'? – lindsay

+0

Да, вы можете это сделать! Вы создадите теги span, как созданный выше элемент spanElement, и затем вставьте его в нужную позицию. –

+0

Отлично! Спасибо вам за код. Я попытался запустить его на https://jsfiddle.net/rfdzgfqm/ (jsfiddle), но он выдает ошибку. Может быть, вы используете функцию jQuery для 'text()'? – lindsay

Смежные вопросы