Was ist der Grund, warum Browser nicht richtig erkennen:
<script src="foobar.js" /> <!-- self-closing script element -->
Nur das wird erkannt:
<script src="foobar.js"></script>
Verstößt dies gegen das Konzept der XHTML-Unterstützung?
Hinweis: Diese Aussage ist zumindest für alle IE (6-8 Beta 2) korrekt.
javascript
html
internet-explorer
xhtml
Dimarzionist
quelle
quelle
Antworten:
Die XHTML 1-Spezifikation lautet:
С.3. Elementminimierung und leerer Elementinhalt
Die XHTML-DTD gibt Skriptelemente wie folgt an:
quelle
<script />
ist nicht, dass die Spezifikation dies nicht zulässt, sondern dass Browser es nicht als "Nicht-Tag-Suppe" interpretieren, wenn der Inhaltstyp nicht application / xhtml + xml ist. Siehe: stackoverflow.com/questions/348736/… @shabunc: Browser scheinen es zu verstehen, aber was tatsächlich passiert, ist, dass der Inhalt nach dem <p /> in den Absatz eingefügt wird, da das Zitat der Squadette so interpretiert wird, dass seit < p> ist nicht leer, es kann nicht selbstschließend sein. In XHTML 1.1, es kann selbstschließend sein.So fügen Sie zu dem, was Brad und squadette gesagt haben, die selbstschließenden XML - Syntax
<script />
tatsächlich ist richtig XML, aber dafür in der Praxis, Ihr Web - Server muss auch Ihre Dokumente als richtig gebildet XML mit einem XML - MIME - Typ senden , wieapplication/xhtml+xml
in dem HTTP Inhaltstyp-Header (und nicht alstext/html
).Das Senden eines XML-Mimetyps führt jedoch dazu, dass Ihre Seiten nicht von IE7 analysiert werden, was nur gefällt
text/html
.Von w3 :
Ich habe vor einigen Monaten darüber gerätselt, und die einzige praktikable (kompatibel mit FF3 + und IE7) Lösung bestand darin, die alte
<script></script>
Syntax mittext/html
(HTML-Syntax + HTML-Mimetyp) zu verwenden.Wenn Ihr Server den
text/html
Typ in seinen HTTP-Headern sendet , verwendet FF3 + auch bei ansonsten ordnungsgemäß geformten XHTML-Dokumenten den HTML-Rendering-Modus, was bedeutet, dass dies<script />
nicht funktioniert (dies ist eine Änderung, Firefox war zuvor weniger streng).Dies geschieht unabhängig davon , ob
http-equiv
Sie mit Metaelementen, dem XML-Prolog oder dem Doctype in Ihrem Dokument herumspielen. Firefox verzweigt, sobald dertext/html
Header angezeigt wird, der festlegt, ob der HTML- oder XML-Parser in das Dokument eingeht und der HTML-Parser dies nicht versteht<script />
.quelle
.html
aus ähnlichen Gründen auch lokale Dateien als Tag-Suppe gerendert werden, unabhängig von Meta-Tags. Firefox rendert XHTML-Dateien nur dann entsprechend, wenn sie benannt sind.xhtml
.application/xhtml+xml
, nichttext/xml
.Falls jemand neugierig ist, ist der ultimative Grund, dass HTML ursprünglich ein Dialekt von SGML war, dem seltsamen älteren Bruder von XML. In SGML-Land 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 natürlich kein Konzept dafür.
Die von modernen Browsern verwendeten Tag-Suppe-Parser sind aus diesem Erbe hervorgegangen, obwohl ihr Parsing-Modell keine reine SGML mehr ist. Und natürlich wird Ihr sorgfältig ausgearbeitetes XHTML als schlecht geschriebene SGML-inspirierte Tag-Suppe behandelt, es sei denn, Sie senden es mit einem XML-MIME-Typ. Dies ist auch der Grund, warum ...
... wird vom Browser wie folgt interpretiert:
... 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 codieren.
quelle
P
Element kann nicht enthaltenDIV
Elemente (dies ist ungültig HTML), so dass der Browser implizit das schließtP
Element (definiert als „implizit verschließbaren“) vor der ÖffnungDIV
Tag. Browser verhalten sich in dieser Hinsicht jedoch tendenziell anders (wie bei jedem ungültigen HTML-Code).</p>
End-Tag hingegen ist Teil der Definition von HTML!Andere haben "wie" geantwortet und spec zitiert. Hier ist die wahre Geschichte von "Warum nein
<script/>
", nachdem wir uns viele Stunden lang mit Fehlerberichten und Mailinglisten befasst haben.HTML 4
HTML 4 basiert auf SGML .
SGML hat einige Short , wie
<BR//
,<B>text</>
,<B/text/
oder<OL<LI>item</LI</OL>
. XML nimmt die erste Form an und definiert das Ende als ">" neu (SGML ist flexibel), so dass es wird<BR/>
.HTML wurde jedoch nicht neu definiert,
<SCRIPT/>
sollte also bedeuten<SCRIPT>>
.(Ja, das '>' sollte Teil des Inhalts sein und das Tag ist immer noch nicht geschlossen.)
Offensichtlich ist dies nicht mit XHTML kompatibel und wird viele Websites beschädigen (als die Browser ausgereift genug waren , um sich darum zu kümmern ), sodass niemand Shorttags implementiert hat und die Spezifikation davon abrät .
Tatsächlich sind alle "funktionierenden" selbstendenden Tags Tags mit verbotenem End-Tag auf technisch nicht konformen Parsern und tatsächlich ungültig. Es war W3C, das diesen Hack entwickelte , um den Übergang zu XHTML zu erleichtern, indem es HTML-kompatibel gemacht wurde .
Und
<script>
das End-Tag ist nicht verboten .Das "Self-Ending" -Tag ist ein Hack in HTML 4 und bedeutungslos.
HTML 5
HTML5 hat fünf Arten von Tags und nur "void" - und "fremde" Tags dürfen sich selbst schließen .
Weil
<script>
es nicht ungültig ist (es kann Inhalt haben) und nicht fremd ist (wie MathML oder SVG),<script>
kann es nicht selbst geschlossen werden, unabhängig davon, wie Sie es verwenden.Aber warum? Können sie es nicht als fremd betrachten, Sonderfälle machen oder so?
HTML 5 soll abwärtskompatibel mit Implementierungen von HTML 4 und XHTML 1 sein. Es basiert nicht auf SGML oder XML. Die Syntax befasst sich hauptsächlich mit der Dokumentation und Vereinheitlichung der Implementierungen. (Aus diesem Grund sind
<br/>
<hr/>
usw. gültiges HTML 5, obwohl es ungültiges HTML4 ist.)Selbstschließend
<script>
ist eines der Tags, bei denen sich die Implementierungen unterschieden. Es verwendet , um Arbeit in Chrome, Safari , und Opera ; Meines Wissens hat es in Internet Explorer oder Firefox nie funktioniert.Dies wurde beim Entwurf von HTML 5 besprochen und abgelehnt, da es die Browserkompatibilität beeinträchtigt . Webseiten, deren Skript-Tag sich selbst schließt, werden in alten Browsern möglicherweise nicht richtig (wenn überhaupt) gerendert. Es gab andere Vorschläge , aber sie können das Kompatibilitätsproblem auch nicht lösen.
Nach der Veröffentlichung des Entwurfs hat WebKit den Parser so aktualisiert, dass er den Anforderungen entspricht.
Selbstschließend
<script>
tritt in HTML 5 aufgrund der Abwärtskompatibilität mit HTML 4 und XHTML 1 nicht auf.XHTML 1 / XHTML 5
Wenn wirklich als XHTML gedient,
<script/>
ist es wirklich geschlossen, wie andere Antworten angegeben haben.Außer , dass die Spezifikation sagt es sollte gearbeitet haben , wenn sie als HTML serviert:
Also was ist passiert?
Die Leute baten Mozilla , Firefox konforme Dokumente als XHTML analysieren zu lassen, unabhängig vom angegebenen Inhaltsheader (bekannt als Content Sniffing ). Dies hätte selbstschließende Skripte ermöglicht, und das Sniffing von Inhalten war ohnehin notwendig, da Webhoster nicht ausgereift genug waren, um den richtigen Header bereitzustellen. IE war gut darin .
Wenn der erste Browserkrieg nicht mit IE 6 endete, war möglicherweise auch XHTML auf der Liste. Aber es endete. Und IE 6 hat ein Problem mit XHTML. In der Tat IE unterstützt nicht den richtigen MIME - Typ überhaupt , zwingt alle zu verwenden ,
text/html
für XHTML , weil IE gehalten großen Marktanteil für ein ganzes Jahrzehnt.Und auch das Schnüffeln von Inhalten kann sehr schlecht sein und die Leute sagen, es sollte gestoppt werden .
Schließlich stellt sich heraus, dass das W3C nicht bedeutete, dass XHTML schnüffelbar ist : Das Dokument ist sowohl HTML als auch XHTML und
Content-Type
Regeln. Man kann sagen, dass sie fest auf "einfach unserer Spezifikation folgen" standen und ignorierten, was praktisch war . Ein Fehler, der in späteren XHTML-Versionen fortgesetzt wurde .Wie auch immer, diese Entscheidung hat die Angelegenheit für Firefox geregelt . Es dauerte 7 Jahre, bis Chrome geboren wurde . Es gab keinen anderen wichtigen Browser. So wurde entschieden.
Die Angabe des Doctype allein löst aufgrund der folgenden Spezifikationen keine XML-Analyse aus.
quelle
<p>
oder<li>
kann nicht sein ‚Selbst geschlossen‘ , da sie können Inhalte haben, so wie Code<p/>
ist nichts mehr , dass ein (malformed) Start - Tag und den Inhalt , nachdem es, wenn es in diesem Elemente erlaubt ist würde darin enden.Internet Explorer 8 und frühere Versionen unterstützen keine XHTML-Analyse. Selbst wenn Sie eine XML-Deklaration und / oder einen XHTML-Doctype verwenden, analysiert der alte IE das Dokument immer noch als einfaches HTML. In einfachem HTML wird die selbstschließende Syntax nicht unterstützt. Der abschließende Schrägstrich wird einfach ignoriert. Sie müssen ein explizites schließendes Tag verwenden.
Selbst Browser mit Unterstützung für XHTML-Analyse wie IE 9 und höher analysieren das Dokument weiterhin als HTML, es sei denn, Sie stellen das Dokument mit einem XML-Inhaltstyp bereit. In diesem Fall zeigt der alte IE das Dokument überhaupt nicht an!
quelle
Die oben genannten Personen haben das Problem bereits ziemlich genau erklärt, aber eine Sache, die die Dinge klar machen könnte, ist, dass, obwohl die Benutzer
<br/>
und solche ständig in HTML-Dokumenten verwenden, jede/
in einer solchen Position grundsätzlich ignoriert und nur verwendet wird, wenn versucht wird, dies zu machen etwas, das sowohl als XML als auch als HTML analysiert werden kann. Versuchen Sie es<p/>foo</p>
zum Beispiel, und Sie erhalten einen regulären Absatz.quelle
Das selbstschließende Skript-Tag funktioniert nicht, da das Skript-Tag Inline-Code enthalten kann und HTML nicht intelligent genug ist, um diese Funktion basierend auf dem Vorhandensein eines Attributs zu aktivieren oder zu deaktivieren.
Wenn Sie möchten, dass das Skript-Tag in sich geschlossen ist, können Sie dies nicht wie gesagt tun, aber es gibt eine Alternative, wenn auch keine intelligente. Sie können das selbstschließende Link-Tag und den Link zu Ihrem JavaScript verwenden, indem Sie ihm eine Art Text / Javascript und rel als Skript geben, wie folgt:
quelle
<style>
Tags, verwenden jedoch Link-Tags für externe CSS-Dateien. Definition des Link-Tags: "Das <link> -Tag definiert eine Verknüpfung zwischen einem Dokument und einer externen Ressource." Scheint vollkommen logisch, dass das Link-Tag für externes CSS oder JS verwendet wird ... dafür ist es ... für das Verknüpfen in externen Dateien. Hinweis: Ich spreche nicht von spec / browserübergreifend / etc, ich kommentiere nur die logische Natur der Verwendung von Link-Tags, um sowohl CSS als auch JS einzubringen ... es wäre tatsächlich sehr sinnvoll, wenn es so wäre . Ich bin mir nicht sicher, ob der Schuh [Analogie] passt.Im Gegensatz zu XML und XHTML kennt HTML die selbstschließende Syntax nicht. Browser, die XHTML als HTML interpretieren, wissen nicht, dass das
/
Zeichen angibt, dass das Tag sich selbst schließen soll. Stattdessen interpretieren sie es wie ein leeres Attribut und der Parser denkt immer noch, dass das Tag 'offen' ist.So wie
<script defer>
es behandelt wird<script defer="defer">
,<script />
wird es auch so behandelt<script /="/">
.quelle
/
als Teil der NET-Konstruktion (Null End Tag).Internet Explorer 8 und älter unterstützen nicht den richtigen MIME-Typ für XHTML
application/xhtml+xml
. Wenn Sie XHTML als bereitstellentext/html
, was Sie für diese älteren Versionen von Internet Explorer benötigen, um etwas zu tun, wird es als HTML 4.01 interpretiert. Sie können die kurze Syntax nur für Elemente verwenden, bei denen das schließende Tag weggelassen werden kann. Siehe die HTML 4.01-Spezifikation .Die XML-Kurzform wird als Attribut mit dem Namen / interpretiert, das (da es kein Gleichheitszeichen gibt) mit dem impliziten Wert "/" interpretiert wird. Dies ist in HTML 4.01 streng falsch - nicht deklarierte Attribute sind nicht zulässig - aber Browser ignorieren dies.
IE9 und höher unterstützen XHTML 5 mit
application/xhtml+xml
.quelle
Das liegt daran, dass SCRIPT TAG kein VOID ELEMENT ist.
In einem HTML-Dokument - VOID ELEMENTS nicht benötigen "Closing Tag"!
In xhtml ist alles generisch, daher müssen alle beendet werden, z. B. ein "schließendes Tag". Einschließlich br, eines einfachen Zeilenumbruchs als
<br></br>
oder seiner Kurzform<br />
.Ein Skriptelement ist jedoch niemals ein ungültiges oder parametrisches Element, da das Skript-Tag vor allem eine Browseranweisung und keine Datenbeschreibungsdeklaration ist.
Grundsätzlich wird eine semantische Beendigungsanweisung, z. B. ein "schließendes Tag", nur zur Verarbeitung von Anweisungen benötigt, deren Semantik nicht durch ein nachfolgendes Tag beendet werden kann. Zum Beispiel:
<H1>
Die Semantik kann nicht durch eine Folge beendet werden,<P>
da sie nicht genug eigene Semantik enthält, um den vorherigen H1-Befehlssatz zu überschreiben und daher zu beenden. Obwohl es in der Lage sein wird, den Stream in eine neue Absatzzeile zu unterteilen, ist es nicht "stark genug", um die aktuelle Schriftgröße und Stilzeilenzeile, die über den Stream fließt, zu überschreiben , dh aus H1 austritt (weil P sie nicht hat) ).Dies ist, wie und warum die "/" (Terminierungs-) Signalisierung erfunden wurde.
Ein generisches No-Description- Termination-Tag wie
< />
hätte für jeden einzelnen Abfall der angetroffenen Kaskade ausgereicht, z. B.: Dies ist<H1>Title< />
jedoch nicht immer der Fall, da wir auch in der Lage sein möchten, mehrere Zwischen- Tag- Tags des Stream: split zu "verschachteln" in Ströme, bevor sie in eine andere Kaskade gewickelt werden. Infolgedessen kann ein generischer Terminator, wie z. B.< />
das Ziel einer zu terminierenden Eigenschaft nicht bestimmen. Zum Beispiel:<b>
fett<i>
fett-kursiv< />
kursiv</>
normal. Würde zweifellos unsere Absicht nicht richtig verstehen und würde sie höchstwahrscheinlich als kühn fett-itallisch fett normal interpretieren .Auf diese Weise wurde der Begriff eines Wrappers, dh eines Containers, geboren. (Diese Begriffe sind so ähnlich, dass es unmöglich ist, sie zu erkennen, und manchmal kann dasselbe Element beides haben. Es
<H1>
ist gleichzeitig Wrapper und Container. Während<B>
nur ein semantischer Wrapper.) Wir brauchen einen einfachen Container ohne Semantik. Und natürlich kam die Erfindung eines DIV-Elements.Das DIV-Element ist eigentlich ein 2BR-Container. Natürlich machte das Kommen von CSS die ganze Situation seltsamer als es sonst gewesen wäre und verursachte eine große Verwirrung mit vielen großen Konsequenzen - indirekt!
Da Sie mit CSS das native Pre- und After-BR-Verhalten eines neu erfundenen DIV leicht überschreiben können, wird es häufig als "Nichtstun-Container" bezeichnet. Welches ist natürlich falsch! DIVs sind Blockelemente und unterbrechen die Linie des Streams sowohl vor als auch nach der Endsignalisierung. Bald begann das WEB unter Seite DIV-itis zu leiden. Die meisten von ihnen sind es noch.
Das Kommen von CSS mit seiner Fähigkeit, das native Verhalten eines HTML-Tags vollständig zu überschreiben und neu zu definieren, hat es irgendwie geschafft, die gesamte Bedeutung der HTML-Existenz zu verwirren und zu verwischen ...
Plötzlich schienen alle HTML-Tags veraltet zu sein, sie wurden unkenntlich gemacht und ihrer ursprünglichen Bedeutung, Identität und ihres Zwecks beraubt. Irgendwie würden Sie den Eindruck gewinnen, dass sie nicht mehr benötigt werden. Sprichwort: Ein einziges Container-Wrapper-Tag würde für die gesamte Datenpräsentation ausreichen. Fügen Sie einfach die erforderlichen Attribute hinzu. Warum nicht stattdessen aussagekräftige Tags haben? Erfinde Tag-Namen, während du gehst, und lass das CSS sich um den Rest kümmern.
Auf diese Weise wurde xhtml geboren und natürlich der große Stumpfe, der von Neuankömmlingen so teuer bezahlt wurde und eine verzerrte Vorstellung davon, was was ist und was der verdammte Zweck von allem ist. W3C wechselte vom World Wide Web zu What Went Wrong, Genossen? !!
Der Zweck von HTML besteht darin, aussagekräftige Daten an den menschlichen Empfänger zu streamen .
Informationen liefern.
Der formale Teil dient nur dazu, die Klarheit der Informationsbereitstellung zu verbessern. xhtml berücksichtigt die Informationen nicht im geringsten. - Für sie sind die Informationen absolut irrelevant.
Das Wichtigste dabei ist, zu wissen und verstehen zu können, dass xhtml nicht nur eine Version von erweitertem HTML ist , xhtml ist ein völlig anderes Biest. Gründe; und deshalb ist es ratsam, sie getrennt zu halten.
quelle
Der Unterschied zwischen 'true XHTML', 'faux XHTML' und HTML sowie die Bedeutung des vom Server gesendeten MIME-Typs wurden hier bereits ausführlich beschrieben . Wenn Sie es jetzt ausprobieren möchten, finden Sie hier ein einfaches bearbeitbares Snippet mit Live-Vorschau, einschließlich eines selbstgeschlossenen Skript-Tags für fähige Browser:
Sie sollten
Hello, true XHTML. Nice to meet you!
unten Textbereich sehen.Für unfähige Browser können Sie den Inhalt des Textbereichs kopieren und als Datei mit der Erweiterung (
.xhtml
oder.xht
) speichern ( danke Alek für diesen Hinweis ).quelle
Eine einfach moderne Antwort ist, dass das Tag auf diese Weise als obligatorisch bezeichnet wird
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script
quelle