Christoph Schaffhauser: Validator des W3C taugt nichts

Hallo zusammen. Ich hab versucht meine Homepage CSS und Transitional HTML (4.01) konform zu gestalten. Das hat eigentlich ganz gut geklappt (siehe http://www.darkeagle.com/)
jedoch bin ich auf einen bug im Validator gestossen. Hier das testfile:
***************
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
 <TITLE>Untitled</TITLE>
 <meta http-equiv="content-type" content="Mime-Type; charset=ISO-8859-1">
 <script type="text/javascript">
 <!--
 var xyz = "</SPAN>";
 //-->
 </script>
</HEAD>
<BODY>

</BODY>
</HTML>
***************

Diese Testseite gibt folgenden Fehler:

***************
Line 8, column 18:

var xyz = "</SPAN>";
                  ^
Error: end tag for element "SPAN" which is not open; try removing the end tag or check for improper nesting of elements
***************

Anscheinend schnallt es der Validator nicht das der String "</SPAN>" kein Tag ist und demzufolge auch nichts zumachen will, da er ja in ein Javascript eingebungen ist.

Was denkt Ihr darüber?
behelfsmässig hab ich dann das script umgeschrieben dass es so ausschaut:

var xyz = "<" + "/SPAN>";

So schnallt ers dann

Gruss Christoph

  1. hi

    Anscheinend schnallt es der Validator nicht das der String "</SPAN>" kein Tag ist und demzufolge auch nichts zumachen will, da er ja in ein Javascript eingebungen ist.

    tjo.. Das ist aber kein Vali-Bug, sondern eben ein Fehler in der Seite. Beachte, was passiert, wenn da ein Parser gaaaaaaaaaanz stur rübereiert, ohne zu wissen, wofür welches Tag da ist!

    Grüße aus Bleckede

    Kai

    1. Hallo Kai,

      Anscheinend schnallt es der Validator nicht das der String "</SPAN>" kein
      Tag ist und demzufolge auch nichts zumachen will, da er ja in ein
      Javascript eingebungen ist.

      tjo.. Das ist aber kein Vali-Bug, sondern eben ein Fehler in der Seite.

      Das sehe ich etwas anders. Ein SGML-Parser hat Sachen, die in Kommentaren stehen,
      zu ignorieren.

      Beachte, was passiert, wenn da ein Parser gaaaaaaaaaanz stur rübereiert, ohne
      zu wissen, wofür welches Tag da ist!

      Wenn er richtig funktioniert, muss er das, was zwischen <script> und </script>
      steht, ignorieren, da Christoph diesen Teil in <!-- --> gepackt hat.

      Gruesse,
       CK

      1. Wenn er richtig funktioniert, muss er das, was zwischen <script> und </script>
        steht, ignorieren, da Christoph diesen Teil in <!-- --> gepackt hat.

        Nein, ganz und gar nicht. Die Sequenzen <!-- und --> sind mitnichten Kommentar, wenn sie es wären, würde der Browser den Inhalt ignorieren und gar nicht an die JS-Engine weitergeben. script und style sind in HTML 4 als CDATA Elemente deklariert, jegliches Markup (also z.B. <a> oder &) wird dort ignoriert, also auch <!-- oder -->, einizge Ausnahme bildet die Kombination aus < und / und einem Buchstaben, diese Sequenz beendet CDATA-Elemente.

        1. Hi Björn,

          Nein, ganz und gar nicht. Die Sequenzen <!-- und --> sind mitnichten Kommentar, wenn sie es wären, würde der Browser den Inhalt ignorieren und gar nicht an die JS-Engine weitergeben. script und style sind in HTML 4 als CDATA Elemente deklariert, jegliches Markup (also z.B. <a> oder &) wird dort ignoriert, also auch <!-- oder -->, einizge Ausnahme bildet die Kombination aus < und / und einem Buchstaben, diese Sequenz beendet CDATA-Elemente.

          danke für diese einleuchtende Erklärung. Bisher hatte ich mir immer "irgendetwas zusammengereimt", was vielleicht ungefähr in diese Richtung ging, aber wirklich klar war mir die Sache trotzdem nicht.

          Cheatah

    2. Nene :-) wenn der Parser drüberreitet sieht er ein " und weiss aha string.. dann müsste er weitersuchen bis er das abschliessende " findet... dieser Parser macht aber was falsch,...

      hi

      Anscheinend schnallt es der Validator nicht das der String "</SPAN>" kein Tag ist und demzufolge auch nichts zumachen will, da er ja in ein Javascript eingebungen ist.

      tjo.. Das ist aber kein Vali-Bug, sondern eben ein Fehler in der Seite. Beachte, was passiert, wenn da ein Parser gaaaaaaaaaanz stur rübereiert, ohne zu wissen, wofür welches Tag da ist!

      Grüße aus Bleckede

      Kai

      1. Hi,

        Nene :-) wenn der Parser drüberreitet sieht er ein " und weiss aha string.. dann müsste er weitersuchen bis er das abschliessende " findet... dieser Parser macht aber was falsch,...

        aus welchem Grund meinst Du, Anführungszeichen hätten in PCDATA irgendeine Bedeutung, die über das eigentliche Zeichen hinausgeht?

        Ein SGML-Parser beherrscht _kein_ JavaScript. Er beherrscht SGML, also Strukturbeschreibungssprachen. _Keine_ Programmiersprachen. Er weiß nicht mal, dass sowas wie ein String überhaupt existiert. Oder sollte er "<b>hier</b>" etwa meinen, dass "<b>" und "</b>" zum Fließtext gehören? Naja, mal ganz abgesehen davon, dass es hier im Forum zufällig so ist ;-)

        Cheatah

      2. Hallo,

        tu dir mal http://learn.to/quote an.

        Nene :-) wenn der Parser drüberreitet sieht er ein " und weiss aha string..
        dann müsste er weitersuchen bis er das abschliessende " findet...

        Nein. Ein SGML-Parser muss kein JavaScript verstehen.

        dieser Parser macht aber was falsch,...

        Ja, aber nicht das, was du moniert hast. Er hat einfach den Inhalt von
        Kommentaren zu ignorieren.

        Gruesse,
         CK

    3. Hallo Miteinander

      Anscheinend schnallt es der Validator nicht das der String "</SPAN>" kein Tag ist und demzufolge auch nichts zumachen will, da er ja in ein Javascript eingebungen ist.

      tjo.. Das ist aber kein Vali-Bug, sondern eben ein Fehler in der Seite.

      In der Seite von Christoph?*) Das glaube ich nicht. Ich kenne mich mit dem Zeug sicher nicht so gut aus, aber meiner ansicht nach ist die Seite Valide. Weil => Das "</SPAN>" ist ein String im JavaScript, da könnte auch sonst irgend was stehen. Wenn der Vali den JS-Code auch durchgeht und einen String der zufälligerweise etwas enthält, was mit etwas anderem in HTML übereinstimmt ist das sein 'Fehler'.

      Beachte, was passiert, wenn da ein Parser gaaaaaaaaaanz stur rübereiert, ohne zu wissen, wofür welches Tag da ist!

      Bei diesen Bedingungen ist natürlich klar, dass die Seite nicht valide ist. Dann darf man aber IMHO aber auch keine zusätzliche Sprache im HTML-File verwenden. Oder was würde dann der Vali zu dem folgendne Skript sagen?

      <script type="text/javascript">
       <!--
        var a,b;
        a = 3;
        b = 2;

      if( b<a ) {
         alert(b);
        }
        if( b>a ) {
         alert(a);
        }
       //-->
      </script>

      Hier würde er wohl den 'HTML-Tag' <a ) { alert(b); } if ( a> finden.

      Ich würde aber nicht sagen, dass dies ein Bug im Vali sei, schliesslich ist er zum Validieren von HTML- und nicht JS-Dateien da.

      MfG

      Tom2

      *) Vielleicht habe ich dich falsch verstanden und rede nur Müll ;-)

      1. hi

        Bei diesen Bedingungen ist natürlich klar, dass die Seite nicht valide ist. Dann darf man aber IMHO aber auch keine zusätzliche Sprache im HTML-File verwenden. Oder was würde dann der Vali zu dem folgendne Skript sagen?

        genauso arbeitet ein PARSER.

        <script type="text/javascript">
        <!--
          var a,b;
          a = 3;
          b = 2;

        if( b<a ) {
           alert(b);
          }
          if( b>a ) {
           alert(a);
          }
        //-->
        </script>

        Hier würde er wohl den 'HTML-Tag' <a ) { alert(b); } if ( a> finden.

        im Prinzip ja. ich bin jetzt aber überfragt, ob eines der Zeichen da verdeutlicht, dass er "nur" ein nicht codiertes "<" und ">" anmahnt.
        Das einzige, was man dem Vali hier vorwerfen *könnte* ist, dass er in dem Kommentar ruminterpretiert..

        Grüße aus Bleckede

        Kai

        1. Hi

          Hier würde er wohl den 'HTML-Tag' <a ) { alert(b); } if ( a> finden.

          im Prinzip ja. ich bin jetzt aber überfragt, ob eines der Zeichen da verdeutlicht, dass er "nur" ein nicht codiertes "<" und ">" anmahnt.

          Anscheinend frisst ers :-(.

          Das einzige, was man dem Vali hier vorwerfen *könnte* ist, dass er in dem Kommentar ruminterpretiert..

          ...was er nicht *dürfte* wenn man andere Sprachen in der Datei erlauben *wollte*. ;-)

          MfG

          Tom2

      2. Hi Tom

        Hab Spasseshalber dein Script mal durch den Validator gelassen. Er schien damit keine Probs zu haben. :-/

        Gruss Christoph

        Hallo Miteinander

        Anscheinend schnallt es der Validator nicht das der String "</SPAN>" kein Tag ist und demzufolge auch nichts zumachen will, da er ja in ein Javascript eingebungen ist.

        tjo.. Das ist aber kein Vali-Bug, sondern eben ein Fehler in der Seite.

        In der Seite von Christoph?*) Das glaube ich nicht. Ich kenne mich mit dem Zeug sicher nicht so gut aus, aber meiner ansicht nach ist die Seite Valide. Weil => Das "</SPAN>" ist ein String im JavaScript, da könnte auch sonst irgend was stehen. Wenn der Vali den JS-Code auch durchgeht und einen String der zufälligerweise etwas enthält, was mit etwas anderem in HTML übereinstimmt ist das sein 'Fehler'.

        Beachte, was passiert, wenn da ein Parser gaaaaaaaaaanz stur rübereiert, ohne zu wissen, wofür welches Tag da ist!

        Bei diesen Bedingungen ist natürlich klar, dass die Seite nicht valide ist. Dann darf man aber IMHO aber auch keine zusätzliche Sprache im HTML-File verwenden. Oder was würde dann der Vali zu dem folgendne Skript sagen?

        <script type="text/javascript">
        <!--
          var a,b;
          a = 3;
          b = 2;

        if( b<a ) {
           alert(b);
          }
          if( b>a ) {
           alert(a);
          }
        //-->
        </script>

        Hier würde er wohl den 'HTML-Tag' <a ) { alert(b); } if ( a> finden.

        Ich würde aber nicht sagen, dass dies ein Bug im Vali sei, schliesslich ist er zum Validieren von HTML- und nicht JS-Dateien da.

        MfG

        Tom2

        *) Vielleicht habe ich dich falsch verstanden und rede nur Müll ;-)

  2. Hallo.

    var xyz = "</SPAN>";

    Du solltest dir mal ansehn, welche Zeichen in JavaScript maskiert werden müssen/sollten: var xyz = "</SPAN>";

    Gruß
    Norbert

    1. Hi Norbert

      Thx für den Hinweis.. mit / klappts wirklich... hmm nur hab ich bei SelfHTML nurgends gesehen dass der / auch maskiert werden muss. :-/

      Gruss Christoph

      Hallo.

      var xyz = "</SPAN>";

      Du solltest dir mal ansehn, welche Zeichen in JavaScript maskiert werden müssen/sollten: var xyz = "</SPAN>";

      Gruß
      Norbert

      1. hi zusammen

        also dass der / maskiert werden muss ist mir auch neu...

        Klar funktionierts, aber dennoch bin auch ich der Meinung dass der Validierer hier nichts motzen darf!

        kaepten

        1. hi

          also dass der / maskiert werden muss ist mir auch neu...

          Das "</" muss vermieden werden.

          Grüße aus Bleckede

          Kai

  3. hi,

    Although the STYLE and SCRIPT elements use CDATA for their data model, for these elements, CDATA must be handled differently by user agents. Markup and entities must be treated as raw text and passed to the application as is. The first occurrence of the character sequence "</" (end-tag open delimiter) is treated as terminating the end of the element's content. In valid documents, this would be the end tag for the element. http://www.w3.org/TR/html4/types.html#type-cdata

    ich verstehe das so das er ab dem "</" das script tag schließen muß
    und da bei dir das erste "</" nicht zu einem "script>" gehört hat er den
    fehler angezeigt. also verhält sich der validator so wie sich das w3
    sich das vorstellt.

    schöne grüße
    FICHTL

    1. Thx für den Hinweis... scheint die Erklärung für das Verhalten des Valis zu sein

      Gruss Christoph

      hi,

      Although the STYLE and SCRIPT elements use CDATA for their data model, for these elements, CDATA must be handled differently by user agents. Markup and entities must be treated as raw text and passed to the application as is. The first occurrence of the character sequence "</" (end-tag open delimiter) is treated as terminating the end of the element's content. In valid documents, this would be the end tag for the element. http://www.w3.org/TR/html4/types.html#type-cdata

      ich verstehe das so das er ab dem "</" das script tag schließen muß
      und da bei dir das erste "</" nicht zu einem "script>" gehört hat er den
      fehler angezeigt. also verhält sich der validator so wie sich das w3
      sich das vorstellt.

      schöne grüße
      FICHTL

    2. Hoi,

      ich verstehe das so das er ab dem "</" das script tag schließen muß
      und da bei dir das erste "</" nicht zu einem "script>" gehört hat er den
      fehler angezeigt. also verhält sich der validator so wie sich das w3
      sich das vorstellt.

      Nicht ganz. Das W3C sagt, dass da kein Kommentar stehen soll. Da steht aber ein
      Kommentar. Und alles, was innerhalb eines Kommentares steht, hat ein
      SGML-Parser (und ein XML-Parser auch) gefaelligst zu ignorieren. Basta.

      Gruesse,
       CK

      1. Hallo,

        ich verstehe das so das er ab dem "</" das script tag schließen muß
        und da bei dir das erste "</" nicht zu einem "script>" gehört hat er den
        fehler angezeigt. also verhält sich der validator so wie sich das w3
        sich das vorstellt.

        Nicht ganz. Das W3C sagt, dass da kein Kommentar stehen soll. Da steht aber ein
        Kommentar. Und alles, was innerhalb eines Kommentares steht, hat ein
        SGML-Parser (und ein XML-Parser auch) gefaelligst zu ignorieren. Basta.

        Ich habe da nochmal drueber nachgedacht. Ich nehme alles zurueck, der Validator
        verhaelt sich korrekt. Innerhalb von <script></script> ist alles CDATA, das
        heisst, es *gibt* gar keine Kommentare.

        Gruesse,
         CK

        1. Hallo

          Ich habe da nochmal drueber nachgedacht. Ich nehme alles zurueck, der Validator
          verhaelt sich korrekt. Innerhalb von <script></script> ist alles CDATA, das
          heisst, es *gibt* gar keine Kommentare.

          Du hast recht. Das erklärt auch, wieso mein Beispielskript korrekt war.

          MfG

          Tom2

  4. Hallo nochmal

    Also zusammenfassend kommen wir glaube ich zu Folgendem Schluss:

    zwischen <script> und </script> darf kein "</" auftauchen, da der Parser dann den Scripttag beenden würde. "</" muss maskiert werden ("</") so dass es valid wird.
    Der Kommentar spielt überhaupt keine Rolle, da der nur für ältere Browser gedacht ist die Scripte nicht interpretieren.

    Ich danke hier nochmal allen die mir geholfen haben das kleine Problem mit dem Valitaror zu verstehen.

    Gruss Christoph