Jürgen Herz: Entities in JS-eingefügtem Text

Hallo zusammen,

wenn Umlaute in einem HTML-Dokument vorkommen, schreibe ich die immer als HTML-Entites.
Was aber soll man tun wenn ein über JS einzufügender Text Umlaute enthält? Ich habe überrascht festgestellt, daß mit sowas hier

var text = document.createTextNode("Mächtig wenüg Text hier.");
var el = document.getElementById("inserttext");
   el.appendChild(text);

der Text zwar eingefügt wird, angezeigt werden aber tatsächlich ä und ü statt der Umlaute.

Mach' ich da einen Fehler? Ist es komplizierter?

Grüße,
Jürgen

  1. Jürgen,

    wenn Umlaute in einem HTML-Dokument vorkommen, schreibe ich die immer als HTML-Entites.

    Und das tust du warum?
    Gunnar

    --
    “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
    1. Gunnar,

      wenn Umlaute in einem HTML-Dokument vorkommen, schreibe ich die immer als HTML-Entites.

      Und das tust du warum?

      Weil es mir dann wurscht sein kann, mit welcher Kodierung der Server die jeweilige Seite ausliefert.
      Ich kann dann Unicode und 8859-1 Zeichen gemischt verwenden, ohne im Editor aufpassen zumüssen, daß mir alles zerhäckselt wird.

      Ist irgendwas falsch an ü? Ich dachte bisher, das wäre sogar ein Muß.

      Jürgen

      1. Jürgen,

        Ich kann dann Unicode und 8859-1 Zeichen gemischt verwenden,

        Da gibt’s nichts zu mischen. Die mit ISO 8859-1 codierbaren Zeichen sind vollständig in Unicode enthalten: U+0000 bis U+00FF.

        ohne im Editor aufpassen zumüssen, daß mir alles zerhäckselt wird.

        Du musst lediglich aufpassen, dass du in der Codierung abspeicherst, die dein Server auch ausliefert.

        Ist irgendwas falsch an ü?

        Nein. Aber es ist nicht nötig und macht den Quelltext schlechter lesbar.

        Ich dachte bisher, das wäre sogar ein Muß.

        Nein, du kannst Umlaute problemlos im Quelltext verwenden – entsprechende Angabe der Zeichencodierung vorausgesetzt.

        Gunnar

        PS. Warum die Entität bei deiner Konstruktion nicht aufgelöst wird, weiß ich auch noch nicht. document.write("ä") ergibt "ä".

        --
        “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
        1. Hallo,

          PS. Warum die Entität bei deiner Konstruktion nicht aufgelöst wird, weiß ich auch noch nicht.

          Entity-Referenzen (nodeType=5) bilden eigene Knoten im Dokumentenbaum. Wenn in einen Textknoten (nodeType=3) die Zeichenkette "ä" geschrieben wird, dann steht eben diese ungeparst im nodeValue.

          MfG, Thomas

  2. Hi,

    Was aber soll man tun wenn ein über JS einzufügender Text Umlaute enthält? Ich habe überrascht festgestellt, daß mit sowas hier
    var text = document.createTextNode("Mächtig wenüg Text hier.");
    var el = document.getElementById("inserttext");
       el.appendChild(text);
    der Text zwar eingefügt wird, angezeigt werden aber tatsächlich ä und ü statt der Umlaute.

    Warum erwartest Du, daß in Javascript Strings auf irgendwelche magische Weise umgewandelt werden?

    Javascript kennt keine Entities. Entities sind in HTML bekannt. Javascript hat aber nicht unbedingt was mit HTML zu tun.

    Der Inhalt von HTML-script-Elementen oder HTML-Event-Handler-Attributen wird aber unbehandelt - d.h. ohne Umwandlung von Entities - an den Javascript-Interpreter weitergereicht.

    Du kannst also entweder die Zeichen direkt angeben oder aber fromCharCode nutzen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo,

      Javascript kennt keine Entities. Entities sind in HTML bekannt. Javascript hat aber nicht unbedingt was mit HTML zu tun.

      Sofern der Browser und seine DOM-Implementierung mitspielt, waere createEntityReference() eine Moeglichkeit. AFAIK wird diese Methode nur von Mozilla-Derivaten unterstuetzt, aber zu einem Ergebnis bin ich im (X)HTML-Kontext noch nicht gekommen.

      Im SVG-Kontext funktioniert es z. B. so (mit ASV 3.0x):

        
      <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>  
      <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"  
        "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [  
        <!ENTITY auml  "&#228;">  
        <!ENTITY ouml  "&#246;">  
        <!ENTITY uuml  "&#252;">  
        <!ENTITY Auml  "&#196;">  
        <!ENTITY Ouml  "&#214;">  
        <!ENTITY Uuml  "&#220;">  
        <!ENTITY szlig "&#223;">  
      ]>  
      <svg xmlns="http://www.w3.org/2000/svg" onload="Text_mit_Entitys(evt)">  
        
      <defs>  
      <script type="text/javascript">  
      <![CDATA[  
        
      function Text_mit_Entitys(evt)  
      {  
        var ae=document.createEntityReference("auml");  
        var oe=document.createEntityReference("ouml");  
        var ue=document.createEntityReference("uuml");  
        var Ae=document.createEntityReference("Auml");  
        var Oe=document.createEntityReference("Ouml");  
        var Ue=document.createEntityReference("Uuml");  
        var sz=document.createEntityReference("szlig");  
        
        var text=document.createElement("text");  
        text.setAttribute("x","10");  
        text.setAttribute("y","30");  
        text.setAttribute("font-size","24");  
        text.setAttribute("fill","#F00");  
        textnode=document.createTextNode("Zeichen: ");  
        text.appendChild(textnode);  
        text.appendChild(ae);  
        text.appendChild(oe);  
        text.appendChild(ue);  
        text.appendChild(Ae);  
        text.appendChild(Oe);  
        text.appendChild(Ue);  
        text.appendChild(sz);  
        
        document.documentElement.appendChild(text);  
      }  
        
      ]]>  
      </script>  
      </defs>  
        
      </svg>
      

      Ansonsten bleibt bei Bedarf wie bereits genannt String.fromCharCode().

      MfG, Thomas