ottogal: Seltsamer Fehler mit " in Tabellenzelle

Hallo in die Runde,
der Firefox 2.0.0.14 (unter Vista) zeigt bei dieser kleinen Testseite die Schriftfarbe korrekt schwarz an, weil das Weiß des body im span durch schwarz ersetzt wird:

  
<html>  
<head>  
</head>  
<body style="color: #ffffff;">  
<script language="javascript">  
    t="<table width=400 height=200><tr><td bgcolor=#669933>";  
    t+="<span style=&qout;color:#000000&quot;>foo</span></td></tr></table>";  
    with(document) {  
    write(t);  
    void(close());  
    }  
</script>  
</body>  
</html>  

Soeben erst ist mir aufgefallen (hier sieht mans gleich durch die Syntax-Farben), dass da ein Tippfehler drin ist, da steht style=&qout; statt style=&quot;
Und jetzt das Seltsame: Korrigiert man den, so wirkt die Style-Angabe im span nicht mehr, die Schrift bleibt weiß...

Hat jemand von euch dafür eine Erklärung? Eigentlich müsste man ja das Umgekehrte erwarten.

Dank unf Gruß
ottogal

  1. Hi,

    <html>
    <head>
    </head>
    <body style="color: #ffffff;">
    <script language="javascript">
        t="<table width=400 height=200><tr><td bgcolor=#669933>";
        t+="<span style=&qout;color:#000000&quot;>foo</span></td></tr></table>";
        with(document) {
        write(t);
        void(close());
        }
    </script>
    </body>
    </html>

    
    > Soeben erst ist mir aufgefallen (hier sieht mans gleich durch die Syntax-Farben), dass da ein Tippfehler drin ist, da steht style=&qout; statt style=&quot;  
      
    
    > Und jetzt das Seltsame: Korrigiert man den, so wirkt die Style-Angabe im span nicht mehr, die Schrift bleibt weiß...  
    
    wieso seltsam?  
    Die Regel &qout; ist fehlerhaft und wird ignoriert.  
    Dass der Browser &quot; am Ende ignoriert und am Anfang vielleicht nicht, kann bei invalidem Code schon mal vorkommen. Warum setzt Du die Regel nicht in ""?  
      
    freundliche Grüße  
    Ingo
    
    -- 
    [[barrierefreie Ingo Webdesign](http://www.1ngo.de/web/) » [Suchmaschinenoptimierung](http://www.1ngo.de/web/seo.html) | [em?](http://www.1ngo.de/web/em.html) | [IE7 - Bugs](http://www.1ngo.de/web/ie7.html)]
    
    1. Hi Ingo,

      wieso seltsam?
      Die Regel &qout; ist fehlerhaft und wird ignoriert.

      Es wird ja das "richtige" &quot ignoriert, während mit dem falschen &qout die Farbangabe im span beachtet wird...

      Dass der Browser &quot; am Ende ignoriert und am Anfang vielleicht nicht, kann bei invalidem Code schon mal vorkommen. Warum setzt Du die Regel nicht in ""?

      Ich hatte die Sorge, dass das zweite " in der Zeile

        
      t+="<span style="color:#000000">foo</span></td></tr></table>";  
      
      

      den String beendet und das color:#000000 dann außerhalb desselben steht - und
      verstehe auch jetzt nicht, wieso das kein Fehler ist. Müsste man nicht wenigstens zu einfachen Anführungszeichen greifen?

      Danke
      ottogal

      1. Ich hatte die Sorge, dass das zweite " in der Zeile

        t+="<span style="color:#000000">foo</span></td></tr></table>";

        
        > den String beendet und das color:#000000 dann außerhalb desselben steht - und  
        > verstehe auch jetzt nicht, wieso das kein Fehler ist. Müsste man nicht wenigstens zu einfachen Anführungszeichen greifen?  
          
        das zweite " beendet auch den string - in so einem falle sollte man die quotes umdrehen  
          
        angenommen html, das endprodukt ist deine primäre ausgabe und du sollest hier doppelte anführungszeichen (") verwenden, ist es empfehlenswert, einzelne als stringdelimiter zu verwenden  
          
        ansonsten musst du jedes vorkommen in einem string maskieren  
        str = '<span title="blah">text</span>'  
        str = "<span title=\"blah\">text</span>"  
        str = '<span title=\'blah\#>text</span>'  
          
        in manchen scriptsprachen haben single und double quoteted strings nur eine philisophische bedeutung, manchmal reagiert der parser anders (php zb unterscheidet zwischen single und double quoted strings)  
        
        
        1. ansonsten musst du jedes vorkommen in einem string maskieren
          str = '<span title='blah#>text</span>'

          Escape mit \ geht hier aber gar nicht - hatte das schon probiert...

          1. Escape mit \ geht hier aber gar nicht - hatte das schon probiert...

            kann ich nicht nachvollziehen - kannst du mir bitte erkläre, warum "hier" ein maskieren mit backslash nicht möglich ist

            vielleicht steh ich aber auch nura fu der leitung

            1. Erklären kann ich es nicht - ich hatte es ausprobiert, und es ging nicht.

      2. Mahlzeit,

        Ich hatte die Sorge, dass das zweite " in der Zeile

        t+="<span style="color:#000000">foo</span></td></tr></table>";

        
        > den String beendet und das color:#000000 dann außerhalb desselben steht  
          
        Müsste man. Wenn es denn HTML wäre. Hier geht es aber um Javascript (und um einen String mit beliebigem, in diesem Fall zufällig HTML enthaltenden String).  
          
          
        MfG,  
        EKKi  
        
        -- 
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        
        1. Müsste man. Wenn es denn HTML wäre. Hier geht es aber um Javascript (und um einen String mit beliebigem, in diesem Fall zufällig HTML enthaltenden String).

          Ja, langsam seh ich klarer...

      3. Hi,

        Die Regel &qout; ist fehlerhaft und wird ignoriert.

        Es wird ja das "richtige" &quot ignoriert, während mit dem falschen &qout die Farbangabe im span beachtet wird...

        Du verstehst nicht, dass hier die Javascript-Implementation und Fehlerbehandlung der Browser eine Rolle spielt.
        &qout; erkennt der Browser nicht und setzt diese Zeichenfolge in den Quelltext, so dass
        style=&qout;
        herauskommt. Doppelt fehlerhaft, weil 1. das Anführungszeichen fehlt und 2. &qout keine gültige CSS-Regel ist. Das fehlende Anführungszeichen nehmen Browser nicht krumm und das ";" schließt die ungültige Regel ab, so dass die folgende beachtet werden kann.
        Dass der Browser die Regel
        color:#000000"
        umsetzt, dürfte an der Fehlertoleranz liegen.

        Bei
        style=&quot;
        wird nun aber die Entity umgesetzt, so dass das ";" fehlt - und eine Eigenschaft
        "color
        gibt es natürlich nicht.

        freundliche Grüße
        Ingo

        1. Danke, Ingo, für diese eingehende Analyse!
          Ich verstehe jetzt wirklich, was da abläuft.

          Ich muss dazu sagen, dass ich mich so gut wie nie mit JS beschäftigt habe. Das letzte Mal war 2005, und der Code, den ich hier zitiert habe, stammt aus dem ersten und einzigen JS, das ich je geschrieben habe. Mir ist es bloß grad wieder in die Hände gefallen, wobei mir erstmals dieser Tippfehler auffiel. Und da hat es mich schon irritiert, dass das Skript mit dem Fehler das Richtige anzeigt, und  nach der Korrektur das Falsche. (Damals hat noch kaum jemand auf Validisierung geachtet...)

          Gruß und Dank an alle für die Aufklärung
          ottogal

  2. Mahlzeit,

    Hat jemand von euch dafür eine Erklärung?

    Ja. Du bist der irrigen Annahme, dass

    <span style=&qout;color:#000000&quot;>foo</span></td></tr></table>

    valides HTML sei. Ist es aber nicht. Auch nicht nach der Korrektur in

    <span style=&quot;color:#000000&quot;>foo</span></td></tr></table>

    Der Wert des "http://de.selfhtml.org/html/referenz/attribute.htm#universalattribute@title=style"-Attributs ist vom Typ http://de.selfhtml.org/html/referenz/attribute.htm#cdata@title=#CDATA, wenn Du also &quot; benutzt, wird das als Teil des Werts interpretiert und nicht als den Wert einschließende Anführungszeichen. Richtig wäre einzig und allein

    <span style="color:#000000">foo</span></td></tr></table>

    wobei ich Dir generell empfehlen würde, ALLE Attributwerte von HTML-Elementen in Anführungszeichen zu schreiben.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Mahlzeit,

      Prost EKKi,

      Der Wert des "http://de.selfhtml.org/html/referenz/attribute.htm#universalattribute@title=style"-Attributs ist vom Typ http://de.selfhtml.org/html/referenz/attribute.htm#cdata@title=#CDATA, wenn Du also &quot; benutzt, wird das als Teil des Werts interpretiert und nicht als den Wert einschließende Anführungszeichen.

      Danke für den Hinweis auf http://de.selfhtml.org/html/referenz/attribute.htm#cdata@title=#CDATA. Dort heißt es aber:
      "Benannte Zeichen wie &uuml; sind also ebenso erlaubt ..." - wieso dann nicht &quot; ?

      Richtig wäre einzig und allein

      <span style="color:#000000">foo</span></td></tr></table>

      Siehe meine Antwort an Ingo.

      wobei ich Dir generell empfehlen würde, ALLE Attributwerte von HTML-Elementen in Anführungszeichen zu schreiben.

      Keine Sorge, das mache ich seit Jahren. Der obige Code ist aus einer uralten Schublade... ;-)

      Dank auch dir
      ottogal

      1. Mahlzeit,

        Der Wert des "http://de.selfhtml.org/html/referenz/attribute.htm#universalattribute@title=style"-Attributs ist vom Typ http://de.selfhtml.org/html/referenz/attribute.htm#cdata@title=#CDATA, wenn Du also &quot; benutzt, wird das als Teil des Werts interpretiert und nicht als den Wert einschließende Anführungszeichen.

        Danke für den Hinweis auf http://de.selfhtml.org/html/referenz/attribute.htm#cdata@title=#CDATA. Dort heißt es aber:
        "Benannte Zeichen wie &uuml; sind also ebenso erlaubt ..."

        Ja, die Zeichen sind erlaubt. Als Teil des WERTES des "style"-Attributs. Das sollen sie doch aber nicht sein, oder?

        • wieso dann nicht &quot; ?

        Weil Du den Wert des "style"-Attributs in Anführungsstrichen einschließen musst. Sobald Du &quot; verwendest, werden diese Zeichen als Teil des Werts angesehen. Und ich glaube nicht, dass Du das willst ...

        <span style="color:#000000">foo</span></td></tr></table>

        Siehe meine Antwort an Ingo.

        Du verwechselst HTML- und Javascript-Kontext.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. "Benannte Zeichen wie &uuml; sind also ebenso erlaubt ..."

          Ja, die Zeichen sind erlaubt. Als Teil des WERTES des "style"-Attributs. Das sollen sie doch aber nicht sein, oder?

          Freilich, du hast recht.

          Du verwechselst HTML- und Javascript-Kontext.

          Genau das ist der Knackpunkt. Habs kapiert.
          Danke!