Итак, я знаю window.find (), нестандартный объект js, который находит строку на странице, возвращает true, если найден, и false, если нет.
Есть ли что-то похожее на string.replace (), но есть ли объект окна (например, window.replace ()), который заменит все параллельные элементы на что-то еще (например, заменит все «Hi» на «Hello»)?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не думаю, что есть, но писать легче, чем вы думаете. Вы просто идете по DOM в поисках текстовых узлов и используете replace на их nodeValue:
function replaceAll(element, regex, replacement) {
for (var child = element.firstChild;
child;
child = child.nextSibling) {
if (child.nodeType === 3) { // Text
child.nodeValue = child.nodeValue.replace(regex, replacement);
} else if (child.nodeType === 1) { // Element
replaceAll(child, regex, replacement);
}
}
}
Там я использовал регулярное выражение (которое должно иметь флаг g), чтобы получить «глобальное» поведение при замене и для гибкости.
Живой пример:
function replaceAll(element, regex, replacement) {
for (var child = element.firstChild;
child;
child = child.nextSibling) {
if (child.nodeType === 3) { // Text
child.nodeValue = child.nodeValue.replace(regex, replacement);
} else if (child.nodeType === 1) { // Element
replaceAll(child, regex, replacement);
}
}
}
setTimeout(function() {
replaceAll(document.body, /one/g, "two");
}, 800);<div>
Here's one.
<p>And here's one.</p>
<p>And here's <strong>one</strong>
</div>Если вы хотите использовать простую строку вместо регулярного выражения, просто используйте escape-функцию регулярного выражения (например, те, что указаны в ответах на этот вопрос, и создайте свое регулярное выражение следующим образом:
var regex = new RegExp(yourEscapeFunction(simpleString), "g");
Случай, когда это не обрабатывается, - это когда целевая строка пересекает текстовые узлы, например:
<span>ex<span>ample</span></span>Используя указанную выше функцию поиска "example", вы его не найдете. Я оставляю это в качестве упражнения, чтобы читатель при желании разобрался с этим случаем ... :-)
Спасибо. Я не видел этого до сих пор.