Задать вопрос
gazes12
@gazes12

Как заменить все цифры на странице?

const body = document.body;
function recursy(element){
	element.childNodes.forEach(node => {
		if(element.childNodes.length > 1){
			element.innerText = element.innerText.replace(new RegExp("[0-9]", "g"), 149);
			recursy(node);
		}
	});
}

recursy(body);

Почему-то у меня вcё на сайте заменяется на 149, а должны только цифры, почему работает некорректно?
  • Вопрос задан
  • 125 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Какие есть косяки:
  • Перебираете вложенные узлы, но замену выполняете у того, что передан в функцию.
  • Заменять содержимое надо только у текстовых узлов - чтобы проверить тип, смотрим nodeType.
  • У текстовых узлов нет innerText. Есть textContent и nodeValue.
  • Зачем функции знать заранее, что за замена должна быть выполнена? Что будете делать, если понадобится выполнить другую замену - закопипастите функцию, заменив регулярку? Лучше добавим второй параметр - функцию, принимающую текущий текст и возвращающую новый.

Исправляем:

function replaceText(node, replacer) {
  if (node.nodeType === Node.ELEMENT_NODE) {
    node.childNodes.forEach(n => replaceText(n, replacer));
  } else if (node.nodeType === Node.TEXT_NODE) {
    node.textContent = replacer(node.textContent);
  }
}


replaceText(document.body, str => str.replace(/\d/g, 'hello, world!!'));

Или, долой рекурсию и проверки типов узлов, можно сразу текстовые перебирать:

function replaceText(node, replacer) {
  const iter = document.createNodeIterator(node, NodeFilter.SHOW_TEXT);

  for (let n = null; n = iter.nextNode();) {
    n.nodeValue = replacer(n.nodeValue);
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы