Plum Bum: innerHTML

Hallo, liebe Forum-User,

erst mal großen Dank an das SELFHTML-Team für diese äußerst umfangreiche Website, die mir bereits des öfteren weitergeholfen hat!

Nun zu meinem Problem, das ich auch nach längerm Stöbern auf SELFHTML nicht restlos lösen konnte:

Ich versuche mittels JavaScript-Funktion einen vorgegebenen Text auszutauschen. Dieser (steht in einem span-Tag mit id-Attribut) wird zuerst mit "var text = document.getElementById('text').firstChild.data;" ausgelesen und anschließend mit Texten aus einem Array verglichen, um den darauffolgenden zu ermitteln. Der wiederum wird abschließend mittels  "document.getElementById('text').firstChild.data = text;" anstelle des vorhergehenden Textes eingesetzt.

Die Funktion arbeitet soweit wie gewünscht, doch nun kann es aber vorkommen, daß sich in diesem Text HTML-Entities befinden.
Wie ich bereits herausgefunden habe, interpretiert JavaScript selbst keine HTML-Entities.
Soweit ich ebenfalls herausgefunden habe, muß ich, um eine Interpretierung dennoch zu gewährleisten, die Eigenschaft(...?) "innerHTML" anwenden.

Hierbei stoße ich jedoch auf ein neues Problem: die Texte können nicht mehr verglichen werden.

Daher schlußendlich meine Frage: Gibt es auch eine andere Möglichkeit (Methode oder Funktion?), HTML-Entitities für JavaScript lesbar zu machen, um keine Ausgabe á la " zu erhalten?

Ich hoffe, mein Problem verständlich dargestellt zu haben und bin für jede Antwort dankbar.

Gruß,
Plum Bum

  1. Daher schlußendlich meine Frage: Gibt es auch eine andere Möglichkeit (Methode oder Funktion?), HTML-Entitities für JavaScript lesbar zu machen, um keine Ausgabe á la " zu erhalten?

    Nur in dem du keine erzeugst, bzw. diese umwandelst, es gibt ja nicht viele.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
  2. Hallo,

    Hm, von innerHtml hab ich keine Ahnung, aber das node-Objekt sollte doch ausreichen... frage ab, ob dein Element Kindknoten hat.

    Gruß, Nils

  3. Hallo,

    Vergiß es, ich hab deine Frage oberflächlich gelesen :-)

    Gruß, Nils

  4. Hallo,

    Das scheint mir ziemlich umständlich zu sein. Du durchläufst einen Array und suchst nach einem Text, um dann das nächste Array-Element auszulesen? Warum identifizierst du die Texte im Array nicht z.B. über deren Index? Den Index des Textes, der gerade im span-Element drinsteht, kannst du in einer globalen Variable speichern. Wenn der nächste erscheinen soll, nimmst du einfach das nächste Array-Element (oder am Ende des Arrays wieder Index 0 - ich weiß ja nicht, was du vorhast).

    Sowieso: Wieso setzt du denn auf Entities? Es besteht i.d.R. keine Notwendigkeit, Entities zu notieren. JavaScript hat im übrigen eine eigene Möglickeit, Zeichen zu maskieren, wenn sie z.B. nicht mit der gegenwärtigen Kodierung gespeichert werden können. Die sogenannte Escape-Sequenz, die man beim Notieren eines Strings mit "..." oder '...' verwenden kann, lautet \uXXXX, wobei XXXX die hexadezimale Nummer des Zeichens im Unicode-Standard darstellt. Z.B. \u2192 für den Pfeil »→«. Damit ist Vergleichbarkeit gegeben, weil beim Einmontieren als Textknoten in den DOM-Baum nichts umgewandelt werden muss.

    Mathias

    --
    »No nations, no borders.«
    SELFHTML Weblog
    1. Sowieso: Wieso setzt du denn auf Entities? Es besteht i.d.R. keine Notwendigkeit, Entities zu notieren.

      Es besteht keine Notwendigkeit im HTML Code '&', '<', '>' in Entities umzuwandeln?

      Wenn ich das richtig verstanden habe, geht es hier um's vergleichen. Er hat Text im HTML Code, dort dürfen einige Zeichen nur als Entities dargestellt werden und dann hat er Text in dem diese als "normale" Zeichen enthalten sind. Der vergleich scheitert also.

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. hi,

        Es besteht keine Notwendigkeit im HTML Code '&', '<', '>' in Entities umzuwandeln?

        Wenn ich das richtig verstanden habe, geht es hier um's vergleichen. Er hat Text im HTML Code, dort dürfen einige Zeichen nur als Entities dargestellt werden und dann hat er Text in dem diese als "normale" Zeichen enthalten sind. Der vergleich scheitert also.

        Dann soll er halt nicht .innerHTML, sondern .data eines Textknotens vergleichen.

        <span id="blubb">Achtung, hier folgen &quot;Entities&quot;</span>

        alert(document.getElementById("blubb").innerHTML);
        // gibt 'Achtung, hier folgen &quot;Entities&quot;' aus

        alert(document.getElementById("blubb").firstChild.data);
        // gibt 'Achtung, hier folgen "Entities"' aus

        Ich verstehe auch nicht, wo hier das Problem liegt.
        In der Annahme des OP? Im Gegensatz zu dem, was er laut eigenem Bekunden annimmt, zeigt .innerHTML die Entities so an, wie sie im Quelltext stehen (ggf. abweichend bei Browsern, die hier zu viel Eigeninterpretation reinbringen) - weil das nun mal das "innere HTML" ist.
        .data des Textknotens hingegen zeigt das Ergebnis des geparsten #PCDATA-Inhaltes an.

        Oder liegt das Problem darin, _im Javascript_ die Vergleichstexte zu hinterlegen?
        Dann sollte er in XHTML sein Script, wenn inline, ja sowieso bereits in einem CDATA-Bereich eingebunden haben - keine Notwendigkeit für Entities á la &lt;/&gt; mehr, und die Sonderzeichen " und/oder ' lassen sich auch so maskieren, dass sie den JS-Interpreter nicht mehr stören. Und bei ausgelagertem Script bestünde für &lt;/&gt; ja auch keine Notwendigkeit.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }