Die Antwort von Andreas Josas ist ziemlich gut. Der Code hatte jedoch mehrere Fehler, wenn der Suchbegriff mehrmals im selben Textknoten erschien. Hier ist die Lösung mit diesen Bugs behoben und zusätzlich ist die Einfügung in matchText für eine einfachere Verwendung und Verständnis berücksichtigt. Jetzt wird nur das neue Tag im Callback erstellt und durch eine Rückgabe an matchText zurückgegeben.
Aktualisiert matchText Funktion mit Fehlerbehebungen:
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;
};
Verbrauch:
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;
});
Wenn Sie Anker einfügen wollen (Link) Tags statt span-Tags, das Element erstellen ändern „a sein "Fügen Sie anstelle von" span "eine Zeile hinzu, um das href-Attribut zum -Tag hinzuzufügen, und fügen Sie der Liste" excludeElements "ein" a "hinzu, damit in den Links keine Links erstellt werden.
in diesem Fall, dass Sie Repace den Textknoten mit HTML-Inhalt –
@ArunPJohny haben Wie kann ich das tun? – alt
@ JacksonGariety - Sie müssen den Textknoten durch ein neues DOM-Bereichselement und Textknoten ersetzen oder die InnerHTML-Eigenschaft des übergeordneten Elements ändern. Probieren Sie aus, was Sie versuchen. – RobG