Ответ, представленный Андреасом Джосасом, неплохой. Однако код имел несколько ошибок, когда поисковый запрос несколько раз появлялся в одном текстовом узле. Вот решение с исправленными ошибками, и, кроме того, вставка учитывается в matchText для удобства использования и понимания. Теперь в обратном вызове создается только новый тег и возвращается обратно в matchText по возврату.
Обновлено функция matchText с исправлением ошибок:
var matchText = function(node, regex, callback, excludeElements) {
excludeElements || (excludeElements = ['script', 'style', 'iframe', 'canvas']);
var child = node.firstChild;
while (child) {
switch (child.nodeType) {
case 1:
if (excludeElements.indexOf(child.tagName.toLowerCase()) > -1)
break;
matchText(child, regex, callback, excludeElements);
break;
case 3:
var bk = 0;
child.data.replace(regex, function(all) {
var args = [].slice.call(arguments),
offset = args[args.length - 2],
newTextNode = child.splitText(offset+bk), tag;
bk -= child.data.length + all.length;
newTextNode.data = newTextNode.data.substr(all.length);
tag = callback.apply(window, [child].concat(args));
child.parentNode.insertBefore(tag, newTextNode);
child = newTextNode;
});
regex.lastIndex = 0;
break;
}
child = child.nextSibling;
}
return node;
};
Использование:
matchText(document.getElementsByTagName("article")[0], new RegExp("\\b" + searchTerm + "\\b", "g"), function(node, match, offset) {
var span = document.createElement("span");
span.className = "search-term";
span.textContent = match;
return span;
});
Если вы хотите, чтобы вставить якорь (ссылка) теги вместо пролетных тегов, изменить создать элемент, чтобы быть « «вместо« span »добавьте строку для добавления атрибута href в тег и добавьте« a »в список excludeElements, чтобы ссылки не создавались внутри ссылок.
в этом случае вы должны repace текстовый узел с контентом HTML –
@ArunPJohny Как сделать это? – alt
@ JacksonGariety - вам нужно заменить текстовый узел новым элементом span и текстовыми узлами DOM или изменить свойство innerHTML своего родителя. Пойдите, напишите, что вы попробуете. – RobG