这样做的方法是遍历文档并在每个文本节点中搜索所需的文本。任何涉及innerHTML 的方式都是无可救药的缺陷。
这是一个适用于所有浏览器的函数,它递归遍历指定节点内的 DOM,并用从提供的模板节点 replacementNodeTemplate 复制的节点替换出现的一段文本:
function replaceText(node, text, replacementNodeTemplate) {
if (node.nodeType == 3) {
while (node) {
var textIndex = node.data.indexOf(text), currentNode = node;
if (textIndex == -1) {
node = null;
} else {
// Split the text node after the text
var splitIndex = textIndex + text.length;
var replacementNode = replacementNodeTemplate.cloneNode(true);
if (splitIndex < node.length) {
node = node.splitText(textIndex + text.length);
node.parentNode.insertBefore(replacementNode, node);
} else {
node.parentNode.appendChild(replacementNode);
node = null;
}
currentNode.deleteData(textIndex, text.length);
}
}
} else {
var child = node.firstChild, nextChild;
while (child) {
nextChild = child.nextSibling;
replaceText(child, text, replacementNodeTemplate);
child = nextChild;
}
}
}
这是一个使用示例:
replaceText(document.body, "cheese", document.createTextNode("CHEESE IS GREAT"));
如果您愿意,您可以创建一个包装函数,以允许您将替换内容指定为 HTML 字符串:
function replaceTextWithHtml(node, text, html) {
var div = document.createElement("div");
div.innerHTML = html;
var templateNode = document.createDocumentFragment();
while (div.firstChild) {
templateNode.appendChild(div.firstChild);
}
replaceText(node, text, templateNode);
}
例子:
replaceTextWithHtml(document.body, "cheese", "cheese <b>is fantastic</b>");
我已将其合并到一个 jsfiddle 示例中:http://jsfiddle.net/timdown/azZsa/