Frage

Was ist der Grund, warum Browser Folgendes nicht richtig erkennen:

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

Nur dies wird erkannt:

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

Verstößt dies gegen das Konzept der XHTML-Unterstützung?

Notiz:Diese Aussage trifft zumindest für alle IE (6-8 Beta 2) zu.

War es hilfreich?

Lösung

XHTML 1-Spezifikation sagt:

С.3. Element Minimierungs und Leeres Element Inhalt

  

eine leere Instanz eines Elements, dessen Inhaltsmodell Gegeben ist EMPTY nicht (zum Beispiel ein leerer Titel oder Absatz) nicht verwenden die minimierte Form (z Verwendung <p> </p> und nicht <p />).

XHTML DTD gibt Script-Elemente wie:

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

Andere Tipps

, um hinzuzufügen, was Brad und squadette gesagt haben, die selbstschließenden XML-Syntax <script /> eigentlich ist korrekte XML, aber es in der Praxis zu arbeiten, Ihr Web-Server muss auch Ihre Dokumente, E-Mails richtig XML mit einem XML-MIME-Typ wie application/xhtml+xml in den HTTP-Content-Type-Header gebildet (und nicht als text/html).

Allerdings wird eine XML-MIME-Typ sendet dazu führen, dass Seiten nicht von IE7 analysiert werden, die nur text/html mag.

w3 :

  

Zusammenfassend 'application / xhtml + xml'   Sollte für XHTML Familie verwendet werden   Dokumente und die Verwendung von ‚text / html‘   Sollte auf HTML-kompatibel begrenzt   XHTML 1.0 Dokumente. 'Application / xml'   und ‚text / xml‘ kann auch verwendet werden, aber   sofern angebracht,   'Application / xhtml + xml' sollte verwendet werden,   eher als die allgemeinen XML-Medien   Typen.

ich verwirrt über diese vor ein paar Monaten, und die einzige praktikable (kompatibel mit FF3 + und IE7) Lösung war die alte <script></script> Syntax mit text/html zu verwenden (HTML-Syntax + HTML MIME-Typ).

Wenn der Server den text/html Typen in seinem HTTP-Header sendet, auch bei sonst richtig gebildet XHTML-Dokumenten, wird FF3 + seinen HTML-Rendering-Modus verwenden, was bedeutet, dass <script /> wird nicht funktionieren (dies ist eine Änderung, war Firefox zuvor weniger streng).

Dies geschieht unabhängig davon, jede mit http-equiv Meta-Elementen Hantieren, dem XML-Prolog oder Doctype in Ihrem Dokument - Firefox Zweigen, sobald es den text/html Header bekommt, dass der HTML oder XML-Parser legt fest, ob im Dokument aussieht, und die HTML Parser nicht verstehen <script />.

Falls jemand ist neugierig, der letzte Grund ist, dass HTML war ursprünglich ein Dialekt von SGML, die XML ist seltsam älterer Bruder ist. In SGML-Land können Elemente in der DTD entweder als selbstschließ (z BR, HR, INPUT) angegeben werden, implizit verschließbare (z P, LI, TD) oder explizit verschließbares (z TABLE, DIV, SCRIPT). XML natürlich hat kein Konzept dafür.

Die Tag-Suppe Parser von modernen Browsern verwendet entwickelten sich aus diesem Erbe, obwohl ihr Parsing-Modell nicht mehr rein SGML ist. Und natürlich Ihre sorgfältig gearbeiteten XHTML wird als schlecht geschriebene SGML-inspirierte Tag-Suppe, wenn Sie es mit einem XML-MIME-Typ senden behandelt. Dies ist auch, warum ...

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

... wird vom Browser interpretiert als:

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

..., die das Rezept für einen schönen obskuren Bug ist, dass Sie in fits werfen können, wie Sie Code gegen das DOM versuchen.

Andere haben geantwortet „wie“ und zitierte spec. Hier ist die wahre Geschichte von „warum nicht <script/>“, nach vielen Stunden in Bugreports zu graben und Mailinglisten.


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, definiert das Ende als ">" (SGML ist flexibel), so dass es <BR/> wird.

Allerdings HTML nicht redfine, so <SCRIPT/> sollte bedeutet <SCRIPT>>.
(Ja, sollte die '>' Teil des Inhalts, und der Tag ist noch nicht geschlossen).

Offensichtlich ist dies unvereinbar mit XHTML und wird viele Seiten brechen (durch die Zeit Browser waren reif genug Pflege diesen ), so niemand implementiert Short und die Spezifikation rät sie .

Effektiv alle ‚arbeiten‘ self-ended-Tags sind Tags mit optional End-Tag auf technisch nicht-konformen Parser und sind in der Tat ungültig. Es war W3C, die kam mit diesem Hack bis zu helfen den Übergang zu XHTML, indem es HTML-kompatiblen .

Und <script> der End-Tag ist nicht optional .

"Self-Endung" Tag ein Hack in HTML 4 und ist sinnlos.


HTML 5

HTML5 hat fünf Arten von Tags und nur ‚Leere "und‚fremd‘Tags werden erlaubt selbstschließ zu sein .

Da <script> nicht leer ist (es können haben Gehalt) und nicht fremd ist (wie MathML oder SVG), <script> nicht selbst geschlossen werden kann, unabhängig davon, wie Sie es verwenden.

Aber warum? Können sie nicht als fremd betrachten, stellen Sonderfall, oder was?

HTML 5 soll sein rückwärtskompatibel mit < em> Implementierungen von HTML 4 und XHTML 1. Es ist nicht auf SGML oder XML-basierte; seine Syntax beschäftigt sich hauptsächlich mit der Dokumentation und die Implementierungen zu vereinen. (Aus diesem Grund <br/> <hr/> etc. gültig HTML 5 trotz ungültig HTML4.)

Selbstschluss <script> ist eines des Tags, bei denen Implementierungen zu unterscheiden. Es verwendet in Chrome, Safari zu arbeiten, und Opera ; meines Wissens im Internet Explorer oder Firefox es nie funktioniert.

Dies wurde diskutiert wenn HTML 5 wird ausgearbeitet wurde und wurde abgelehnt, weil es href="http://lists.w3.org/Archives/Public/public-whatwg-archive/2009Aug/0104.html" rel="noreferrer"> Pausen Browser Kompatibilität . Web-Seiten, dass Selbst schließt Script-Tag (wenn überhaupt) in alten Browsern nicht richtig machen kann. Es gab andere Vorschläge , aber sie können‘ t löst das Kompatibilitätsproblem auch nicht.

Nach dem Entwurf veröffentlicht wurde, WebKit aktualisiert, um den Parser in Übereinstimmung sein.

Selbstschluss <script> nicht in HTML geschieht 5 wegen der Rückwärtskompatibilität zu HTML 4 und XHTML 1.


XHTML 1 / XHTML 5

Wenn wirklich als XHTML serviert wird <script/> wirklich geschlossen, wie anderen Antworten angegeben haben .

Außer dass sagt es sollte haben wenn arbeitete als HTML serviert:

  

XHTML Dokumente ... kann mit dem Internet Media Type "text / html" [RFC2854] markiert werden, wie sie mit den meisten HTML-Browsern kompatibel sind.

Also, was ist passiert?

fragte Mozilla lassen Firefox konforme analysieren Dokumente wie XHTML unabhängig von dem angegebenen Inhalt Header (bekannt als Inhalt Sniffing ). Dies hätte selbstschließenden Skripten erlaubt, und die Inhalte Sniffing WAS notwendig trotzdem, weil Webhoster waren nicht reif genug, den richtigen Header zu dienen; IE war gut darin .

Wenn die erster Browser-Krieg nicht mit IE Ende hat 6 kann XHTML haben auf der Liste auch. Aber es hat Ende. Und IE 6 hat ein Problem mit XHTML . In der Tat hat IE nicht unterstützen der richtige MIME-Typ bei allen und zwingt alle text/html für XHTML, weil IE zu verwenden für ein ganzes Jahrzehnt großen Marktanteil hatte.

Und auch Inhalt Schnüffeln kann sein wirklich schlecht und die Leute sagen es gestoppt werden sollte .

Schließlich stellt sich heraus, dass das W3C nicht bedeutet, XHTML sniffable sein: das Dokument ist beide , HTML und XHTML, und Content-Type Regeln. Man kann sagen, dass sie fest standen auf „nur unsere spec folgen“ und ignorieren, was war praktisch . Ein Fehler, der a href <= "https://www.cnet.com/news/an-Epitaph-for-the-web-Standard-xhtml-2 /“rel = "noreferrer"> fortgesetzt in spätere XHTML-Versionen.

Wie auch immer, diese Entscheidung setzte die Sache für Firefox. Es war 7 Jahre vor Chrome geboren wurde; es gab keinen anderen signifikanten Browser. So wurde beschlossen.

Die Angabe des Doctype allein nicht das Parsen von XML auslöst wegen folgenden Spezifikationen.

Internet Explorer 8 und früher nicht XHTML Parsing unterstützen. Auch wenn Sie eine XML-Deklaration und / oder einen XHTML-Doctype verwenden, alter IE noch das Dokument als einfache HTML analysieren. Und in einfachem HTML, die selbstschließenden Syntax wird nicht unterstützt. Der Schrägstrich wird einfach ignoriert, müssen Sie eine explizite Schließen Tag verwenden.

Browser auch mit Unterstützung für XHTML Parsing, wie IE 9 und später , wird nach wie vor das Dokument als HTML analysiert, wenn Sie das Dokument mit einem XML-Content-Typ dienen. Aber in diesem Fall alter IE wird das Dokument überhaupt nicht anzeigen!

Die Leute haben oben schon so ziemlich das Problem erklärt, aber eine Sache, die Dinge klar machen könnte, ist, dass, wenn die Menschen <br/> verwenden und so die ganze Zeit in HTML-Dokumenten, jede / in einer solchen Position grundsätzlich ignoriert wird, und nur verwendet, wenn sie versuchen, etwas sowohl parseable wie XML und HTML zu machen. Versuchen Sie <p/>foo</p>, zum Beispiel, und Sie einen regelmäßigen Absatz erhalten.

Der selbstschließenden Skript-Tag wird nicht funktionieren, weil der Skript-Tag Inline-Code enthalten kann, und HTML ist nicht intelligent genug, um aktivieren oder deaktivieren dieser Funktion basierend auf dem Vorhandensein eines Attributs.

  

Auf der anderen Seite, macht HTML einen ausgezeichneten Tag hat für die Aufnahme von   Verweise auf externe Ressourcen: der <link> Tag, und es kann sein,   selbstschließend. Es ist bereits enthalten Sheets, RSS und Atom   Feeds, kanonische URIs, und allerlei andere Leckereien. Warum nicht   JavaScript?

Wenn Sie den Script-Tag selbst eingeschlossen zu sein, das Sie nicht tun können, wie gesagt, aber es gibt eine Alternative, wenn auch nicht ein intelligenten ein. Sie können den selbstschließenden Link-Tag und Link zu Ihrer JavaScript verwenden, indem ihnen eine Art von Text / javascript und rel als Skript geben, so etwas wie unten:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />

Im Gegensatz zu XML und XHTML, HTML hat keine Kenntnis von der selbstschließenden Syntax. Browser, die XHTML als HTML interpretieren weiß nicht, dass das / Zeichen zeigt an, dass der Tag selbstschließend sein sollte; stattdessen interpretieren sie es wie ein leeres Attribut und der Parser denkt immer noch der Tag ist ‚offen‘.

Wie <script defer> wie <script defer="defer"> behandelt wird, <script /> als <script /="/"> behandelt.

Internet Explorer 8 und älter nicht den richtigen MIME-Typen für XHTML, application/xhtml+xml unterstützen. Wenn Sie XHTML als text/html sind dient, die Sie für diese älteren Versionen von Internet Explorer müssen alles tun, wird es als HTML 4.01 interpretiert werden. Sie können nur die kurze Syntax mit jedem Element verwenden, die den schließenden Tag erlaubt weggelassen werden. Sehen Sie sich die HTML 4.01 Spezifikation .

Die XML ‚Kurzform‘ wird als Attribut interpretiert named /, die (weil kein Gleichheitszeichen), wie mit einem impliziten Wert von „/“ interpretiert wird. Dies ist streng falsch in HTML 4.01 - nicht deklarieren Attribute sind nicht erlaubt -. Aber Browser ignorieren

IE9 und später Unterstützung XHTML 5 serviert mit application/xhtml+xml.

Das liegt daran, dass SCRIPT TAG kein VOID ELEMENT ist.

In einem (n HTML-Dokument - LEERELEMENTE nicht brauche überhaupt ein „Abschluss-Tag“!

In xhtml, alles ist generisch, deshalb brauchen sie alle Beendigung z.B.ein „schließendes Tag“;Einschließlich br, einem einfachen Zeilenumbruch, as <br></br> oder es Kurzschrift <br />.

Ein Skriptelement ist jedoch niemals ein leeres oder parametrisches Element, weil Skript-Tag Es handelt sich vor allem um eine Browseranweisung und nicht um eine Datenbeschreibungserklärung.

Grundsätzlich wird eine semantische Terminierungsanweisung, z. B. ein „schließendes Tag“, nur für Verarbeitungsanweisungen benötigt, deren Semantik nicht durch ein nachfolgendes Tag abgeschlossen werden kann.Zum Beispiel:

<H1> Semantik kann nicht durch eine Folge beendet werden <P> weil es nicht genug eigene Semantik trägt, um den vorherigen H1-Befehlssatz zu überschreiben und damit zu beenden.Obwohl es in der Lage sein wird, das zu brechen Strom in eine neue Absatzzeile einfügen, ist es nicht „stark genug“, um die aktuelle Schriftgröße und Zeilenhöhe des Stils zu überschreiben den Bach hinunterströmend, d. h. Leck aus H1 (weil P es nicht hat).

Aus diesem Grund wurde die Signalisierung „/“ (Beendigung) erfunden.

Ein Generikum Keine Beschreibung Kündigung Tag like < />, hätte für jeden einzelnen Abfall der angetroffenen Kaskade ausgereicht, z. B.: <H1>Title< /> Dies ist jedoch nicht immer der Fall, da wir auch in der Lage sein möchten, den Stream mehrfach zwischenzeitlich zu „verschachteln“:in Ströme aufteilen, bevor sie sich auf eine andere Kaskade wickeln/fallen.Infolgedessen ist ein generischer Terminator wie z < /> wäre nicht in der Lage, das Ziel einer zu kündigenden Immobilie zu bestimmen.Zum Beispiel: <b>deutlich <i>Fett Kursiv < /> kursiv </>normal.Würde unsere Absicht zweifellos nicht richtig umsetzen und würde sie höchstwahrscheinlich so interpretieren deutlich fett-kursiv deutlich normal.

So funktioniert das Vorstellung aus einer Hülle bzw. einem Container entstand.(Diese Vorstellungen sind so ähnlich, dass es unmöglich ist, sie zu unterscheiden, und manchmal kann dasselbe Element beides haben. <H1> ist Hülle und Behälter zugleich.Wohingegen <B> nur ein semantischer Wrapper).Wir benötigen 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 die Einführung von CSS die ganze Situation seltsamer, als sie sonst gewesen wäre, und sorgte für große Verwirrung mit vielen großen Konsequenzen – indirekt!

Da Sie mit CSS das native Vor- und Nachher-BR-Verhalten eines neu erfundenen DIV leicht überschreiben können, wird es oft als „Nichtstun-Container“ bezeichnet.Was natürlich falsch ist!DIVs sind Blockelemente und unterbrechen nativ die Leitung des Streams sowohl vor als auch nach der Endsignalisierung.Bald begann das WEB unter Seiten-DIV-itis zu leiden.Die meisten von ihnen sind es immer noch.

Das Aufkommen von CSS mit seiner Fähigkeit, das native Verhalten jedes HTML-Tags vollständig zu überschreiben und völlig 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 ihrem ursprünglichen Zweck beraubt.Irgendwie könnte man 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 verwenden?Erfinden Sie nach und nach Tag-Namen und überlassen Sie den Rest dem CSS.

So wurde xhtml geboren und natürlich auch das große Blödsinn, das von Neueinsteigern und einer verzerrten Vorstellung davon, was was ist und was der verdammte Zweck des Ganzen ist, so teuer bezahlt wird.W3C wechselte vom World Wide Web zu What Went Wrong, Genossen?!!

Der Zweck von HTML ist zu streamen aussagekräftige Daten für den menschlichen Empfänger.

Informationen liefern.

Der formale Teil dient lediglich der Klarheit der Informationsvermittlung.xhtml berücksichtigt die Informationen nicht im Geringsten.- Für ihn sind die Informationen absolut irrelevant.

Das Wichtigste dabei ist, das zu wissen und verstehen zu können xhtml ist nicht nur eine Version von erweitertem HTML, xhtml ist ein ganz anderes Biest;erdet;und deshalb es ist klug, sie getrennt zu halten.

Der Unterschied zwischen 'true XHTML', 'faux XHTML' und HTML sowie Bedeutung des Server-sent MIME-Typ bereits hatte hier gut beschrieben. Wenn Sie jetzt es ausprobieren wollen, hier ist einfach editierbarer Schnipsel mit Live-Vorschau einschließlich selbst geschlossen Script-Tag für fähigen Browser:

div { display: flex; }
div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked  name="mime"> application/xhtml+xml</label>
<label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div>
<div><textarea id="t" rows="4" 
onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)"
><?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[<!ENTITY x "true XHTML">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  <p>
    <span id="greet" swapto="Hello">Hell, NO :(</span> &x;.
    <script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" />
    Nice to meet you!
    <!-- 
      Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html
    -->
  </p>
</body>
</html></textarea>

<iframe id="i" height="80"></iframe>

<script>t.onkeyup()</script>
</div>

Sie sollten Hello, true XHTML. Nice to meet you! unten Textfeld sehen.

Für nicht kompatible Browser Sie Inhalt der Textarea kopieren und als Datei mit .xhtml speichern (oder .xht) Verlängerung ( dank Alek für diesen Hinweis ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top