ritschmanhard: invalid - aber warum?

Hi Leute!

Ich will gar nicht lang rum tun - warum ist folgendes Beispiel invalid (und funktioniert btw in den Browsern auch nicht)?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<html>
<head>
<title>Some title</title>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
<script type="text/javascript">
<!--
/*das problem befindet sich zwischen den <script></script> tags*/
function aFkt(){
       SearchTag = 'ein Text';
        return SearchTag;
}
-->
</script>
</head>
<body>
</body>
</html>

Und warum wird es wieder valid, wenn ich alles zwischen <!-- und --> in eine extern.js Datei packe und mittels src="extern.js" einbinde? Und funktioniert dann auch wieder in den Browsern?

Grüße,
Richard

  1. Ich will gar nicht lang rum tun - warum ist folgendes Beispiel invalid (und funktioniert btw in den Browsern auch nicht)?

    hat dir das der validator nicht gesagt?

    Warning Unable to Determine Parse Mode!
    Error  Line 14, Column 8: end tag for element "SCRIPT" which is not open.
    Error  Line 15, Column 6: end tag for element "HEAD" which is not open.
    Line 16, Column 5: document type does not allow element "BODY" here.

    Und warum wird es wieder valid, wenn ich alles zwischen <!-- und --> in eine extern.js Datei packe und mittels src="extern.js" einbinde? Und funktioniert dann auch wieder in den Browsern?

    der fehler ist in Zeile 8 zu finden btw

    im übrigen solltest du, wie der w3-validator vorschlägt, eine DTD verwenden, die er in seiner liste hat - html 4.01 transitional ist zb geeignet - das ist zwar kein fehler, aber validieren ohne warning hat auch was ;)

      
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
           "http://www.w3.org/TR/html4/loose.dtd">  
    
    
    1. Hi Suit!

      Danke für den Hinweis mit der 4.01 (auch an Dodwin).
      Das die Kommentarzeile das Problem ist, hatte ich erkannt -  dass anscheinend für interne und externe javascript Anbindungen unterschiedliche Regeln gelten, verwundert mich. Während das Bsp. bei interner Einbindung muckt, geht es bei externer Anbindung ohne Probleme.

      Nun habe ich das Problem, dass ich genau an dieser Stelle nicht weiterkomme:
      Ich versuche, ein externes js (mit perl) in ein htm einzubauen, aber dadurch zerstöre ich die Seite. Auch ein Entfernen der Kommentare bringt nichts, da das Problem bei folgender Konstruktion ebenfalls auftritt:

        
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
              "http://www.w3.org/TR/html4/loose.dtd">  
      <html>  
      <head>  
      <title>Some title</title>  
      <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">  
      <script type="text/javascript">  
      <!--  
      function aFkt(){  
       SearchTag = '<script type="text/javascript"':  
       SearchTag +=' src="mysrc.js">';  
       SearchTag += '</script>';  
              return SearchTag;  
      }  
      -->  
      </script>  
      <head>  
      <body>  
      </body>  
      </html>  
      
      

      Hai nun, was kann ich da tun?

      Grüße,
      Richard

      1. Yerf!

        Das die Kommentarzeile das Problem ist, hatte ich erkannt -  dass anscheinend für interne und externe javascript Anbindungen unterschiedliche Regeln gelten, verwundert mich. Während das Bsp. bei interner Einbindung muckt, geht es bei externer Anbindung ohne Probleme.

        Ist doch eigentlich ganz klar. Der Typ der externen Datei ist text/javascript der Typ der Hauptdatei ist text/html. Damit greifen bei der internen Einbindung zusätzlich noch die regeln von HTML.

        SearchTag += '</script>';

        SearchTag += '</script>';

        So (mit den maskierten schließenden Tags) sollte es gehen.

        Gruß,

        Harlequin

        --
        <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
        1. Hi Harlequin!

          Stimmt, mit dem maskierten Endtag geht es. Aber irgendwie ist das noch nicht ganz stimmig:
          Wenn die Regeln von HTML greifen _würden_, dann müsste in HTML das Ganze doch ein Kommentar sein (siehe auch interessanterweise die Codefärbung des Beispiels) und somit den HTML Parser überhaupt nicht jucken, oder?

          BTW ist es leider nicht einfach, mittels parsing die </script> tags zu </script> tags umzuwandeln, da ich dann selbst einen Parser schreiben müsste. Auch eine Änderung der Quelle kommt wegen Aufwandes nicht in Frage.

          Da scheint es mit einfacher, das externe Script abzuholen und "zwischenzuspeichern" - gibt es unter perl eine einfache Möglichkeit, eine Datei so zu erzeugen, dass sie für den Client für einen einmaligen Aufruf zur Verfügung steht?
          Oder wie könnte man dies realisieren?

          Zur Erklärung: Es soll möglich werden, über eine HTML Seite auf einem Server andere (intranet) HTML Seiten/Server via IFRAME anzubinden.

          Grüsse,
          Richard

          1. Hi,

            Wenn die Regeln von HTML greifen _würden_, dann müsste in HTML das Ganze doch ein Kommentar sein (siehe auch interessanterweise die Codefärbung des Beispiels) und somit den HTML Parser überhaupt nicht jucken, oder?

            siehe http://www.w3.org/TR/html401/types.html#type-cdata:

            "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."

            BTW ist es leider nicht einfach, mittels parsing die </script> tags zu </script> tags umzuwandeln, da ich dann selbst einen Parser schreiben müsste. Auch eine Änderung der Quelle kommt wegen Aufwandes nicht in Frage.

            Dann arbeite halt mit <![CDATA[ ]]>. Das einzige, was Du dann nicht im JavaScript-Code stehen haben darfst, ist etwas wie dies:

            if (foo[bar[0]]>42)

            Und das ist doch tendenziell eher selten.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hi cheatah!

              Also, so wie ich dich verstehe, es aus xml kenne und hier http://de.selfhtml.org/html/xhtml/unterschiede.htm#script_style gefunden habe, müßte ich den Inhalt des script tags mit <![CDATA[ ]]> wrappen.
              Aber: Die übernommenen Seiten sind nicht zwingend xhtml komform, so dass ich selbst gezwungen bin, html transitional auszuliefern. Nun besagt aber genau der obige Link, dass der Inhalt des script tags sowieso schon als CDATA unter html 4.01 interpretiert wird, weswegen dieses Wrapping überflüssig scheint.
              Und tatsächlich ist es (zumindest beim FF) so, dass der Fehler auch mit dem Wrapping entsteht - das deckt sich ja auch mit deinem Zitat von http://www.w3.org/TR/html401/types.html#type-cdata.

              Also scheint es mir, als wäre CDATA hier nicht die Lösung.

              Trotzdem schon mal vielen Dank,
              Richard

              1. Dieses funktioniert im FF nicht:

                  
                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
                        "http://www.w3.org/TR/html4/loose.dtd">  
                <html>  
                <head>  
                <title>Some title</title>  
                <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">  
                <script type="text/javascript">  
                <![CDATA[  
                function aFkt(){  
                 SearchTag = '<script type="text/javascript"';  
                 SearchTag +=' src="mysrc.js">';  
                 SearchTag += '</script>';  
                        return SearchTag;  
                }  
                ]]>  
                </script>  
                <head>  
                <body>  
                </body>  
                </html>  
                
                
      2. Hi,

        <script type="text/javascript">
        <!--
        function aFkt(){
        SearchTag = '<script type="text/javascript"':
        SearchTag +=' src="mysrc.js">';
        SearchTag += '</script>';

        die Zeichenkette "</" beendet einen <script>-Block; die folgenden Buchstaben bis hin zur schließenden spitzen Klammer werden noch als Teil des End-Tags angesehen. Das "';" befindet sich bereits außerhalb des <script>. Entweder Du zerstörst die Ende-Markierung also wie von Harlequin beschrieben, oder Du kapselst den Code in einen <![CDATA[ ]]>-Bereich, was nebenbei die beiden Vorteile hat, dass Du a) &-Zeichen im Script-Code nicht mehr maskieren musst, und ...

        -->

        ... b) diese antiquierte Variante, Script-Code vor (noch) antiquierteren Browsern verstecken zu müssen, in eben diesen nicht zu einem JavaScript-Fehler führt.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Ich würde eher behaupten, dass es aufgrund des Doppelpunkts anstelle eines Semikolons in der 2. Zeile Deiner Funktion nicht klappt...

          Gruß, LX

          1. Hi LX!

            Danke für den Hinweis, aber der : zu ; löst das Problem nicht.

            @cheatah: Antwort folgt auf deinen letzten Post - irgendwie klappt <[CDATA[]]> nicht...

            Grüsse,
            Richard

            1. Hi,

              @cheatah: Antwort folgt auf deinen letzten Post - irgendwie klappt <[CDATA[]]> nicht...

              dann versuche es statt dessen mit <![CDATA[ ]]>. Oder mit einer nutzbehafteten Problembeschreibung.

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo ritschmanhard,

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">

    ^
                                            Da soll wohl noch ne 1 hin ;)
    Also wenn dann 4.01.

    /*das problem befindet sich zwischen den <script></script> tags*/

    Wenn ich den Kommentar weglasse, dann ist's doch valide...
    Es liegt wahrscheinlich am </script> im Kommentar. Der Validator erkennt nicht, dass es ein JS-Kommentar ist.

    Gruß,
    Dodwin

    --
    Dodwin