Ich habe diese Frage und die Antworten gelesen, aber keine passende Lösung für mich gefunden. Obwohl dieser Thread sehr nützlich ist, habe ich beschlossen, meine eigene Lösung von Grund auf zu erstellen. Die Probleme über diese Art von Ersetzen sind:
- Oft reicht es nicht aus, einfach eine Zeichenkette zu finden, die mit Groß-/Kleinschreibung übereinstimmt. Für Suchergebnisse muss ich z. B. Ersetzen Sie es durch das gleiche Gehäuse .
- Wenn ich mich mit innerHTML beschäftige, kann ich leicht HTML-Tags beschädigen (z.B. ein Vorkommen von hr en href Attribut).
- replaceAll()-Methode ist für viele Anwendungsfälle zu unausgereift, und sie löst nicht alle Probleme.
Ich habe also Funktionen geschrieben, um Suchergebnisse in einer Tabelle hervorzuheben, in deren Datenzellen sich Links und andere HTML-Tags befinden können. Und diese Links sollten beibehalten werden, also war innerText nicht genug.
Die Lösung, die ich beschlossen habe, für alle, die die gleichen Probleme haben, bereitzustellen. Sicherlich können Sie sie nicht nur für Tabellen, sondern für alle Elemente verwenden. Hier ist der Code:
/* Iterate over table data cells to insert a highlight tag */
function highlightSearchResults(textFilter) {
textFilter = textFilter.toLowerCase().replace('<', '<').replace('>', '>');
let tds;
tb = document.getElementById('sometable'); //root element where to search
if (tb) {
tds = tb.getElementsByTagName("td"); //sub-elements where to make replacements
}
if (textFilter && tds) {
for (td of tds) {
//specify your span class or whatever you need before and after
td.innerHTML = insertCaseInsensitive(td.innerHTML, textFilter, '<span class="highlight">', '</span>');
}
}
}
/* Insert a highlight tag */
function insertCaseInsensitive(srcStr, lowerCaseFilter, before, after) {
let lowStr = srcStr.toLowerCase();
let flen = lowerCaseFilter.length;
let i = -1;
while ((i = lowStr.indexOf(lowerCaseFilter, i + 1)) != -1) {
if (insideTag(i, srcStr)) continue;
srcStr = srcStr.slice(0, i) + before + srcStr.slice(i, i+flen) + after + srcStr.slice(i+flen);
lowStr = srcStr.toLowerCase();
i += before.length + after.length;
}
return srcStr;
}
/* Check if an ocurrence is inside any tag by index */
function insideTag(si, s) {
let ahead = false;
let back = false;
for (let i = si; i < s.length; i++) {
if (s[i] == "<") {
break;
}
if (s[i] == ">") {
ahead = true;
break;
}
}
for (let i = si; i >= 0; i--) {
if (s[i] == ">") {
break;
}
if (s[i] == "<") {
back = true;
break;
}
}
return (ahead && back);
}