1520 Stimmen

Warum funktionieren die selbstschließenden Skriptelemente nicht?

Was ist der Grund dafür, dass die Browser nicht richtig erkennen:

<script src="foobar.js" /> <!-- self-closing script element -->

Nur dies wird anerkannt:

<script src="foobar.js"></script>

Wird dadurch das Konzept der XHTML-Unterstützung durchbrochen?

Hinweis: Diese Aussage ist zumindest für alle IE (6-8 beta 2) korrekt.

0 Stimmen

Ich nehme an, dass Sie über richtiges XHTML sprechen? In einigen Kommentaren ist immer noch von XHTML die Rede.

16 Stimmen

Funktioniert in Chrome und Opera

0 Stimmen

Siehe auch diese Frage: stackoverflow.com/questions/348736/

515voto

squadette Punkte 8069

Der nicht-normative Anhang 'HTML Compatibility Guidelines' der XHTML 1 Spezifikation besagt:

.3. Elementminimierung und leere Elementinhalte

Bei einer leeren Instanz eines Elements, dessen Inhaltsmodell nicht EMPTY (z. B. eine leere Überschrift oder ein leerer Absatz), verwenden Sie nicht die minimierte Form (z. B. <p> </p> und nicht <p /> ).

XHTML DTD spezifiziert Skript-Elemente als:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>

126 Stimmen

Dennoch ist "nicht" nicht dasselbe wie "darf nicht". Dies ist eine Leitlinie (für die Kompatibilität, wie der Titel des Abschnitts nahelegt), keine Regel.

55 Stimmen

Eigentlich kann ich keinen Grund für diese Einschränkung finden :) Sie wirkt völlig künstlich.

22 Stimmen

Die richtige Antwort wurde von olavk gegeben. Der Anhang C von XHTML 1.0 ist nicht der Grund, warum die Dinge so sind, wie sie sind, sondern nur, wie man die Dinge umgehen kann.

256voto

joelhardi Punkte 10789

Zusätzlich zu dem, was Brad und Squadette gesagt haben, ist die selbstschließende XML-Syntax <script /> eigentlich es korrektes XML, aber damit es in der Praxis funktioniert, muss Ihr Webserver Ihre Dokumente auch als korrekt geformtes XML mit einem XML-Mimetyp wie application/xhtml+xml in der HTTP Content-Type Kopfzeile (und no als text/html ).

Das Senden eines XML-Mimetyps führt jedoch dazu, dass Ihre Seiten vom IE7 nicht geparst werden, der nur text/html .

Von w3 :

Zusammenfassend lässt sich sagen, dass 'application/xhtml+xml' SOLLTE für Dokumente der XHTML-Familie verwendet werden Dokumente verwendet werden, und die Verwendung von 'text/html' SOLLTE auf HTML-kompatible Dokumente beschränkt sein XHTML 1.0-Dokumente beschränkt sein. 'application/xml' und "text/xml" KÖNNEN ebenfalls verwendet werden, aber wann immer angemessen, application/xhtml+xml" SOLLTE verwendet werden anstelle dieser generischen XML-Medientypen Typen.

Ich habe vor ein paar Monaten darüber nachgedacht, und die einzige praktikable (mit FF3+ und IE7 kompatible) Lösung war die Verwendung des alten <script></script> Syntax mit text/html (HTML-Syntax + HTML-Mimetyp).

Wenn Ihr Server die text/html in seinen HTTP-Headern angeben, wird FF3+ auch bei ansonsten korrekt geformten XHTML-Dokumenten seinen HTML-Rendering-Modus verwenden, was bedeutet, dass <script /> wird nicht funktionieren (dies ist eine Änderung, Firefox war früher weniger streng).

Dies geschieht unabhängig davon, ob man an den folgenden Punkten herumfummelt http-equiv Meta-Elemente, den XML-Prolog oder Doctype innerhalb Ihres Dokuments - Firefox verzweigt, sobald es die text/html Kopfzeile, die bestimmt, ob der HTML- oder der XML-Parser in das Dokument schaut, und der HTML-Parser versteht nicht <script /> .

3 Stimmen

Ist die Schlussfolgerung richtig, dass Sie, wenn Sie die Unterstützung für IE7 aufgeben, mit der Übermittlung von text/xml eine breite Browserunterstützung für <script/> erhalten?

8 Stimmen

Kurz gesagt, <script/> funktioniert nur, wenn der MIME-Typ der Seite xhtml/xml ist. Bei normalen text/html-Seiten wird es nicht funktionieren. Und wenn wir versuchen, den MIME-Typ "xhtml/xml" zu verwenden, bricht die Kompatibilität mit dem IE. Zusammenfassend lässt sich sagen: Ruhe bewahren und <script> verwenden ... </script> Danke Joe ;-)

1 Stimmen

Ausgezeichnete Erklärung. Ein weiterer beachtenswerter Punkt ist, dass Firefox auch über lokale .html Dateien, die unabhängig von den Meta-Tags als Tag-Suppe dargestellt werden, aus ähnlichen Gründen. Bei XHTML-Dateien rendert Firefox sie nur dann entsprechend, wenn sie den Namen .xhtml .

219voto

Sheepy Punkte 16368

Andere haben auf das "Wie" geantwortet und die Spezifikationen zitiert. Hier ist die eigentliche Geschichte des "Warum nicht <script/> ", nachdem ich viele Stunden in Fehlerberichten und Mailinglisten gegraben habe.


HTML 4

HTML 4 basiert auf SGML .

SGML hat einige shorttags , wie zum Beispiel <BR// , <B>text</> , <B/text/ o <OL<LI>item</LI</OL> . XML nimmt die erste Form, definiert die Endung als ">" um (SGML ist flexibel), so dass sie zu <BR/> .

HTML hat jedoch nicht rot gefärbt, so dass <SCRIPT/> sollte mittlere <SCRIPT>> .
(Ja, das '>' sollte Teil des Inhalts sein, und das Tag ist immer noch no geschlossen).

Offensichtlich ist dies nicht mit XHTML kompatibel und 意志 viele Websites zu zerstören (zu der Zeit, als die Browser ausgereift genug waren zur Pflege über diese ), also niemand hat Kurztags implementiert und die Spezifikation rät von ihnen ab .

Im Grunde genommen sind alle "funktionierenden" Tags mit eigenem Ende Tags mit verbotenem Ende auf technisch nicht konformen Parsern und damit faktisch ungültig. Es war das W3C, das hat sich diesen Hack ausgedacht um den Übergang zu XHTML zu erleichtern, indem es HTML-kompatibel .

Und <script> Die Endmarkierung von nicht verboten .

Der "Self-ending"-Tag ist ein Hack in HTML 4 und ist bedeutungslos.


HTML 5

HTML5 hat fünf Arten von Schildern und nur die Tags "ungültig" und "fremd" sind selbstschließend sein dürfen .

Denn <script> ist nicht nichtig (es Mai Inhalt haben) und nicht fremd ist (wie MathML oder SVG), <script> kann nicht selbst geschlossen werden, unabhängig davon, wie Sie es verwenden.

Aber warum? Können sie es nicht als fremd betrachten, als Sonderfall, oder so?

HTML 5 soll sein Abwärtskompatibel con Implementierungen von HTML 4 und XHTML 1. Es basiert nicht auf SGML oder XML; seine Syntax dient hauptsächlich der Dokumentation und Vereinheitlichung der Implementierungen. (Aus diesem Grund <br/> <hr/> usw. sind gültiges HTML 5 obwohl es sich um ungültiges HTML4 handelt).

Selbstschließende <script> ist einer der Tags, bei denen es früher unterschiedliche Implementierungen gab. Es funktionierte früher in Chrome, Safari , und Oper Meines Wissens hat es im Internet Explorer oder Firefox nie funktioniert.

Dies wurde diskutiert als HTML 5 entworfen wurde und abgelehnt wurde, weil es bricht Browser Kompatibilität . Webseiten, die das Skript-Tag selbst schließen, werden in alten Browsern möglicherweise nicht korrekt (oder gar nicht) dargestellt. Es gab andere Vorschläge aber auch sie können das Kompatibilitätsproblem nicht lösen.

Nach der Veröffentlichung des Entwurfs aktualisierte WebKit den Parser, um die Konformität zu gewährleisten.

Selbstschließende <script> findet in HTML 5 wegen der Abwärtskompatibilität zu HTML 4 und XHTML 1 nicht statt.


XHTML 1 / XHTML 5

Wenn realmente als XHTML serviert, <script/> wirklich geschlossen ist, da andere Antworten haben erklärt.

Außer, dass die Spezifikation sagt es sollte funktioniert haben, wenn sie als HTML serviert wurden:

XHTML-Dokumente ... können mit dem Internet Media Type "text/html" [RFC2854] gekennzeichnet werden, da sie mit den meisten HTML-Browsern kompatibel sind.

Was ist also passiert?

Menschen fragte Mozilla à Firefox parsen lassen konforme Dokumente als XHTML unabhängig vom angegebenen Inhaltskopf (bekannt als Content-Sniffing ). Dies hätte selbstschließende Skripte und Content Sniffing ermöglicht notwendig war weil die Webhoster nicht ausgereift genug waren, um den korrekten Header zu liefern; der IE war gut darin .

Wenn die erster Browser-Krieg nicht mit IE 6 endet, könnte auch XHTML auf der Liste gestanden haben. Aber es hat aufgehört. Und IE 6 hat ein Problem mit XHTML. In der Tat IE hat nicht unterstützt den richtigen MIME-Typ überhaupt erzwingen alle zu verwenden text/html für XHTML, weil der IE die großer Marktanteil ein ganzes Jahrzehnt lang.

Und auch Content Sniffing kann sein wirklich schlecht und die Leute sagen es sollte gestoppt werden .

Schließlich stellt sich heraus, dass das W3C wollte nicht, dass XHTML ausspähbar ist : das Dokument ist beide HTML und XHTML, und Content-Type Regeln. Man kann sagen, dass sie sich an unsere Vorgaben gehalten haben und das Praktische zu ignorieren . Ein Fehler, der Fortsetzung in spätere XHTML-Versionen.

Wie auch immer, diese Entscheidung die Angelegenheit geregelt für Firefox. Es war 7 Jahre vor Chrome wurde geboren Es gab keine anderen signifikanten Browser. So wurde es beschlossen.

Die Angabe des Doctype allein löst aufgrund der folgenden Spezifikationen kein XML-Parsing aus.

0 Stimmen

"Selbstschließend <script> findet in HTML 5 aus Gründen der Abwärtskompatibilität nicht statt." - dies ist nicht wirklich wahr, da kein Aspekt der Abwärtskompatibilität gebrochen würde, d.h. Code, der geschrieben wurde, würde weiterhin in neueren Browsern funktionieren, die eine selbstschließende <script> . Der wahre Grund ist, dass <script> wäre die sólo selbstschließenden Tag, da HTML keine anderen definiert. Außerdem ist nur fremde Tags dürfen selbstschließend sein, da ungültige Tags haben keine Endmarkierung. Siehe Start-Tags , Schritt 6.

1 Stimmen

@AndyE Wenn man ein selbstschließendes <script> schreibt, halten die wichtigsten Browser es nicht für geschlossen und parsen die nachfolgende HTML-Datei als Javascript, was dazu führt, dass gültiges HTML5 auf diesen alten Browsern nicht funktioniert. Daher wird der Vorschlag abgelehnt. Dies wird in der verlinkten HTML5-Mailingliste erklärt.

1 Stimmen

Der Hauptgrund für die Ablehnung des Vorschlags ist unklar, da die Diskussion ziemlich abrupt endet, obwohl die Beeinträchtigung bestehender Browser durch neuen Code eines der angesprochenen Probleme war. Ich weise nur darauf hin, dass <script> wäre als HTML5-Element, das sich selbst schließen darf, einzigartig. Was ich in meinem ersten Kommentar meinte, war, dass die Abwärtskompatibilität nicht beeinträchtigt wird, denn Abwärtskompatibilität bezieht sich auf alten Code, der in neueren Browsern läuft - was in diesem Fall in Ordnung ist.

179voto

greim Punkte 8828

Falls es jemanden interessiert, der Grund dafür ist, dass HTML ursprünglich ein Dialekt von SGML war, dem seltsamen älteren Bruder von XML. In SGML können Elemente in der DTD entweder als selbstschließend (z. B. BR, HR, INPUT), implizit schließbar (z. B. P, LI, TD) oder explizit schließbar (z. B. TABLE, DIV, SCRIPT) angegeben werden. XML hat dafür natürlich kein Konzept.

Die Tag-Soup-Parser, die von modernen Browsern verwendet werden, haben sich aus diesem Erbe entwickelt, obwohl ihr Parsing-Modell nicht mehr rein SGML ist. Und natürlich wird Ihr sorgfältig erstelltes XHTML als schlecht geschriebene SGML-inspirierte Tag-Suppe behandelt, wenn Sie es nicht mit einem XML-Mime-Type senden. Das ist auch der Grund, warum...

<p><div>hello</div></p>

...wird vom Browser interpretiert als:

<p></p><div>hello</div><p></p>

...das ist das Rezept für einen schönen obskuren Fehler, der Sie in Anfälle stürzen kann, wenn Sie versuchen, gegen das DOM zu programmieren.

6 Stimmen

Ich bin neugierig. Warum interpretiert der Browser es auf diese Weise?

36 Stimmen

@AhmedAeonAxan: Die P Element kann nicht enthalten DIV Elemente (dies ist ungültiges HTML), so dass der Browser implizit Schließt die P Element (definiert als "implizit schließbar") vor der Öffnung DIV Tag. Allerdings neigen Browser dazu, sich in dieser Hinsicht anders zu verhalten (wie sie es mit jedem ungültigen HTML tun können).

1 Stimmen

@w3d Ist diese Tag-Suppe etwas, wofür wir Netscape oder IE danken können?

45voto

JacquesB Punkte 40790

Internet Explorer 8 und frühere Versionen unterstützen kein XHTML-Parsing. Selbst wenn Sie eine XML-Deklaration und/oder einen XHTML-Doctype verwenden, parst der alte IE das Dokument immer noch als reines HTML. Und in einfachem HTML wird die selbstschließende Syntax nicht unterstützt. Der abschließende Schrägstrich wird einfach ignoriert, Sie müssen einen expliziten schließenden Tag verwenden.

Selbst Browser mit Unterstützung für XHTML-Parsing, wie z. B. IE 9 und höher wird das Dokument immer noch als HTML geparst, es sei denn, Sie stellen das Dokument mit einem XML-Inhaltstyp bereit. Aber in diesem Fall wird der alte IE das Dokument überhaupt nicht anzeigen!

9 Stimmen

"IE unterstützt kein XHTML-Parsing" galt für IE-Versionen, als dieser Artikel geschrieben wurde, ist aber nicht mehr zutreffend.

0 Stimmen

@EricLaw können Sie klären, welche Version des IE dies behoben hat? (und alle spezifischen Bedingungen - z. B. gültiger Doctype erforderlich)

2 Stimmen

@scunliffe Der IE9 war die erste Version mit vollständiger Unterstützung für XHTML. blogs.msdn.com/b/ie/archive/2010/11/01/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X