I want to add an element to a textNode. For example: I have a function that search for a string within element's textNode. When I find it, I want to replace with a HTML element. Is there some standard for that? Thank you.
问问题
6580 次
1 回答
20
您不能只替换字符串,您必须替换整个 TextNode 元素,因为TextNode 元素不能包含DOM 中的子元素。
所以,当你找到你的文本节点时,生成你的替换元素,然后用类似于以下的函数替换文本节点:
function ReplaceNode(textNode, eNode) {
var pNode = textNode.parentNode;
pNode.replaceChild(textNode, eNode);
}
对于您想要做的事情,您必须将当前的文本节点分解为两个新的文本节点和一个新的 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 会让这件事变得更容易,但很高兴理解为什么所有这些东西都以它的方式工作。
于 2010-10-18T22:28:10.107 回答