Способ сделать это состоит в том, чтобы просмотреть документ и найти в каждом текстовом узле нужный текст.Любой способ с участием 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/