Я хочу добавить элемент в textNode. Например: у меня есть функция, которая ищет строку в элементе textNode. Когда я нахожу его, я хочу заменить его на элемент HTML. Есть ли какой-то стандарт для этого? Спасибо.
JavaScript: добавление элементов в textNode
Ответ 1
Вы не можете просто заменить строку, вам придется заменить весь элемент TextNode, поскольку Элементы TextNode не могут содержать дочерние элементы в DOM.
Итак, когда вы найдете текст node, сгенерируйте свой элемент замены, затем замените текст node на функцию, похожую на:
function ReplaceNode(textNode, eNode) {
var pNode = textNode.parentNode;
pNode.replaceChild(textNode, eNode);
}
Для того, что вы хотите сделать, вам нужно разбить текущий текст node на два новых текстовых узла и новый элемент HTML. Вот пример кода, который вы надеетесь в правильном направлении:
function DecorateText(str) {
var e = document.createElement("span");
e.style.color = "#ff0000";
e.appendChild(document.createTextNode(str));
return e;
}
function SearchAndReplaceElement(elem) {
for(var i = elem.childNodes.length; i--;) {
var childNode = elem.childNodes[i];
if(childNode.nodeType == 3) { // 3 => a Text Node
var strSrc = childNode.nodeValue; // for Text Nodes, the nodeValue property contains the text
var strSearch = "Special String";
var pos = strSrc.indexOf(strSearch);
if(pos >= 0) {
var fragment = document.createDocumentFragment();
if(pos > 0)
fragment.appendChild(document.createTextNode(strSrc.substr(0, pos)));
fragment.appendChild(DecorateText(strSearch));
if((pos + strSearch.length + 1) < strSrc.length)
fragment.appendChild(document.createTextNode(strSrc.substr(pos + strSearch.length + 1)));
elem.replaceChild(fragment, childNode);
}
}
}
}
Возможно, jQuery упростит это, но хорошо понять, почему весь этот материал работает так, как он делает.