Sergomen
@Sergomen
Просто делай добро и оно вернётся

Почему не находятся\выделяются все слова при поиске на странице?

Я делал скрипт поиска по странице и заметил что при поиске находятся\выделяются не все слова на странице. Допустим, если я буду искать слово "the" то найдутся не все "the" на странице, а лишь часть из них
скриншот
6086d14a34bad282637859.png

Путем не понятно чего деланья, в целях это исправить, я только понял что, возможно, есть какойто лимит на количество найденого текста(понимаю что звучит как ересь), и чтобы выделить все "the" мне пришлось вызвать функцию поиска несколько раз
скрин
6086d21b014f3476480886.png


Как это можно исправить?

Код закинул на jsfiddle (html код не мой, а друга который попросил сделать скрипт поиска)
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
twobomb
@twobomb
Крч походу это происходит из-за node[i].replaceWith(...acc); в функции parseNode, потому-что у вас цикл по фиксированной длинне количества элементов которые вы получили в начале var l = node.childNodes.length;, а из-за того что вы один элемент можете менять на несколько с помощью replaceWith, общее количество элементов в ноде увеличивается и в итоге вы не проходите все. Вам нужно или обновлять каждую итерацию переменную l или заменять только на один элемент типа
такого
function parseNode(node, search, replace) {
    let l = node.childNodes.length;
    node = node.childNodes;
    let reg = new RegExp(search, "gi");
    for(let i = 0; i < l; i++) {
    
        if(node[i].nodeType === Node.ELEMENT_NODE) { 
        
            parseNode(node[i], search, replace);

        } else if(node[i].nodeType === Node.TEXT_NODE) {
            let mas = node[i].textContent.match(reg);
            let parts = node[i].textContent.split(reg);
            if(0 === parts.length) {
                continue;
            }
            let acc = [];
            let span = document.createElement("span");
            for (let j = 0; j < parts.length;j++){
                //acc.push(document.createTextNode(parts[j]));
                    span.append(document.createTextNode(parts[j]));
                if (j < parts.length - 1 ){
                    replace.textContent = mas[j];
                    span.append(replace.cloneNode(true));
                    //acc.push(replace.cloneNode(true));

                }
            }
            node[i].replaceWith(span);
        }
    }
}

Ну всё это какой-то говнокод который нужно переписать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы