я хочу функцию, которая находит некоторые строки, я вошел в массив в 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! удачи!
есть плагин jquery, который делает это: http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
Это, вероятно, самый простой способ, но, возможно, не самый лучший: http://www.tizag.com/javascriptT/javascript-string-replace.php (прокрутите вниз, где написано "Заменить функцию": Глобальное регулярное выражение"
Вы бы заменили linux
на linux
и т.д.
Мне пришлось сделать это пару месяцев назад. Первоначально кто-то использовал манипуляцию строками 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);
}
}
}
}
Пока вы осторожно отфильтровываете вещи, которые не хотите обрабатывать (например, пустые текстовые узлы, которые содержат только пробелы - их много, поверьте мне), это очень быстро.
Дополнительная фильтрация, не реализованная для алгоритмической ясности - оставлено в качестве упражнения для читателя.
.