@Soft_touch_plastic

Как можно менять контент сайта?

Здравствуйте, есть такая задача менять текстовый контент сайта, например все слова автомобиль заменить на слово самокат. Сейчас написал рекурсивное решение, примерно так:

function recursiveReplace(node, original, replace) {
    const regex = new RegExp(`${original}`, 'i') //регулярное выражение с флагом i для игнорирования регистра
    if(node.innerText.search(regex) > -1) { //если в текстовом контенте блока найдено такое слово
        const childs = node.childs() //хоткей для получения потомков, аналог node.children, уже обернутый в Array.from()
        if(childs.length == 0) { //если детей у блока нет, значит слово находится внутри него, просто меняем на замену
            node.innerText = node.innerText.replace(regex, replace)
        } else { //если у блока есть дети, то слово может быть как в одном из них, так и в текстовой ноде блока
            const completed = childs.map(c => recursiveReplace(c, original, replace)) //к каждому ребенку применяем рекурсивную замену
            if( completed.every(i => !i) ) { //если в каждом ребенке такого слова не нашлось, значит слово в текстовой ноде самого блока
                node.innerHTML = node.innerHTML.replace(regex, replace)
            }
        }
        return true
    } else {
        return false
    }
}


Работает решение так себе, иногда проскакивают не заменённые слова, скорее всего я что-то не учел. Поэтому, возможно кто-нибудь знает решения лучше моего? Реквестую любые способы улучшения текущего алго, заранее спасибо!
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
zkrvndm
@zkrvndm
Архитектор решений
Используй TreeWalker, чтобы получить все нужные тебе узлы с документа.

Например, вот так можно выцепить все текстовые ноды:
function getTextNodes() {
  var n, a=[], walk=document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
  while (n=walk.nextNode()) a.push(n);
  return a;
}

Дальше просто обходи результат в цикле и делай автозамену слов в текстовых нодах.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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