Robert Bamler: find() mit highlight

Beitrag lesen

Hallo Knud,

ich habe schon im Archiv gestöbert aber leider keine Lösung für mein Problem gefunden:

Da scheint ja mal jemand die FAQ gelesen zu haben. Lasst uns feiern ;-)

Ich möchte mit der JS-Funktion find() eine HTML-Seite durchsuchen und möchte, dass der gefundene Begriff markiert wird (wie bei Strg+F).

Das geht sehr schön über DOM. Da NC4 allerdings kein DOM unterstützt, solltest du alternativ für diesen Browser noch die find() Methode verwenden (mit einer Browser-Weiche). Für andere Browser kannst du folgenden Code verwenden

<script language="JavaScript">
<!--
/* gibt das erste öffnende oder leere HTML-Element zurück,
   das in ausgeschriebener HTML-Form irgendwie hinter dem
   Element element kommt. Immer mit followChildren = true
   aufrufen
*/

function naechstes(element,followChildren) {
  if (followChildren && element.firstChild != null)  return element.firstChild;
  if (element.nextSibling != null)  return element.nextSibling;
  if (element.parentNode != null)  return naechstes(element.parentNode,false);
  return null;
}

/* Sucht in der aktuellen Datei nach Vorkommnissen des
   Suchstrings suchstring und findet diesen auch, wenn
   er über mehrere Text-Nodes reicht. Unterscheidet
   Groß/Kleinschreibung. Wenn das verhindert werden soll,
   muss sowohl suchstring, als auch text mit toLowerCase()
   in Kleinbuchstaben umgewandelt werden.
*/

function finden(suchstring) {
  aktElement = document.getElementsByTagName("body")[0];

gefunden = -1;

do {
    text = "";

while (aktElement != null && aktElement.nodeType != 3) {
      aktElement = naechstes(aktElement,true);
    }

startElement = aktElement;
    KnotenIndizes = new Array();
    i = 0;

while (aktElement != null && aktElement.nodeType == 3) {
      KnotenIndizes[i] = text.length;
      text += aktElement.data;
      aktElement = naechstes(aktElement,true);
      i++;
    }
    KnotenIndizes[i] = text.length;
    gefunden = text.indexOf(suchstring)
  } while (gefunden == -1 && aktElement != null);

if (gefunden != -1) {
    i = 1;
    while (KnotenIndizes[i] < gefunden) {
      i++;
      startElement = naechstes(startElement,true);
    }

var neuB = document.createElement("span");
    neuB.style.color = "#d50000";
    neuB.style.fontWeight = "bold";
    neuB.style.backgroundColor = "#FAF1B1";

/* Hier die Hervorhebung anpassen */

neuB.appendChild(document.createTextNode(suchstring));

vortext = startElement.nodeValue.substr(0,gefunden-KnotenIndizes[i-1]);

startElement.nodeValue = startElement.nodeValue.substr(gefunden-KnotenIndizes[i-1]+suchstring.length,KnotenIndizes[i]-gefunden-suchstring.length);
    startElement.parentNode.insertBefore(neuB,startElement);
    startElement.parentNode.insertBefore(document.createTextNode(vortext),neuB);
  }
}
//-->
</script>

Viel Erfolg,
Robert