JavaScript: строки поиска в dom и подчеркивают это

я хочу функцию, которая находит некоторые строки, я вошел в массив в DOM и подчеркиваю это.

например.

keywords[0] = 'linux';
keywords[1] = 'suse pro';

<body>
    im a huge fan of <em>linux</em> and at the moment im using <em>suse pro</em> and finds it amazing.
</body>

как я делаю это самым легким способом.заранее спасибо

Править: я нашел очень простой способ выполнить это: плагин выделения jQuery! удачи!

6
задан ajsie 29 December 2009 в 03:20
поделиться

3 ответа

3
ответ дан 10 December 2019 в 00:39
поделиться

Это, вероятно, самый простой способ, но, возможно, не самый лучший: http://www.tizag.com/javascriptT/javascript-string-replace.php (прокрутите вниз, где написано "Заменить функцию": Глобальное регулярное выражение"

Вы бы заменили linux на linux и т.д.

.
0
ответ дан 10 December 2019 в 00:39
поделиться

Мне пришлось сделать это пару месяцев назад. Первоначально кто-то использовал манипуляцию строками innerHTML, как предлагали другие здесь, но эта дорога приводит к безумию. Неприятные случаи на поворотах: Что если ключевое слово помечено как имя класса элемента или его идентификатор. Мы также не хотим искажать встроенный javascript и случайно вызвать некорректную разметку. Также необходимо обрабатывать встроенные стили css. В конце концов, вы пишете текстовый парсер для HTML4.0 + ECMAscript + css, что, даже в ограниченном случае, является большой работой - это написание вашего собственного веб-браузера - в JAVASCRIPT!

Но у нас уже есть HTML+JS+CSS парсер в веб-браузере, который генерирует для нас красивое DOM-дерево. Поэтому я решил использовать его. Вот что я придумал в конце:

keywords = ['hello world','goodbye cruel world'];
function replaceKeywords (domNode) {
    if (domNode.nodeType === Node.ELEMENT_NODE) { // We only want to scan html elements
        var children = domNode.childNodes;
        for (var i=0;i<children.length;i++) {
            var child = children[i];

            // Filter out unwanted nodes to speed up processing.
            // For example, you can ignore 'SCRIPT' nodes etc.
            if (child.nodeName != 'EM') {
                replaceKeywords(child); // Recurse!
            }
        }
    }
    else if (domNode.nodeType === Node.TEXT_NODE) { // Process text nodes
        var text = domNode.nodeValue;

        // This is another place where it might be prudent to add filters

        for (var i=0;i<keywords.length;i++) {
            var match = text.indexOf(keywords[i]); // you may use search instead
            if (match != -1) {
                // create the EM node:
                var em = document.createElement('EM');

                // split text into 3 parts: before, mid and after
                var mid = domNode.splitText(match);
                mid.splitText(keywords[i].length);

                // then assign mid part to EM
                mid.parentNode.insertBefore(em,mid);
                mid.parentNode.removeChild(mid);
                em.appendChild(mid);
            }
        }
    }
}

Пока вы осторожно отфильтровываете вещи, которые не хотите обрабатывать (например, пустые текстовые узлы, которые содержат только пробелы - их много, поверьте мне), это очень быстро.

Дополнительная фильтрация, не реализованная для алгоритмической ясности - оставлено в качестве упражнения для читателя.

.
7
ответ дан 10 December 2019 в 00:39
поделиться
Другие вопросы по тегам:

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