Question Pourquoi les balises de script à fermeture automatique ne fonctionnent-elles pas?


Quelle est la raison pour laquelle les navigateurs ne reconnaissent pas correctement:

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

Seulement ceci est reconnu:

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

Est-ce que cela brise le concept de support XHTML?

Note: Cette déclaration est correcte au moins pour tous les IE (6-8 beta 2).


1155
2017-09-16 06:52


origine


Réponses:


La spécification XHTML 1 dit:

C.3. Élimination d'élément et contenu d'élément vide

Étant donné une instance vide d'un élément dont le modèle de contenu n'est pas EMPTY (par exemple, un titre ou un paragraphe vide) n'utilisez pas le formulaire réduit (par exemple, utilisez <p> </p> et pas <p />).

DTD XHTML spécifie les balises de script comme:

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

419
2017-09-16 07:08



Pour ajouter à ce que Brad et squadette ont dit, la syntaxe XML à fermeture automatique <script /> réellement est correct XML, mais pour que cela fonctionne dans la pratique, votre serveur web doit également envoyer vos documents comme XML correctement formé avec un type MIME XML comme application/xhtml+xml dans l'en-tête HTTP Content-Type (et ne pas comme text/html).

Cependant, l'envoi d'un type MIME XML entraînera l'analyse de vos pages par IE7, qui n'affecte que text/html.

De w3:

En résumé, 'application / xhtml + xml'   DEVRAIT être utilisé pour la famille XHTML   documents, et l'utilisation de 'text / html'   DEVRAIT être limité à la compatibilité HTML   Documents XHTML 1.0. 'application / xml'   et 'text / xml' PEUT aussi être utilisé, mais   le cas échéant,   'application / xhtml + xml' DEVRAIT être utilisé   plutôt que ces médias XML génériques   les types.

Je me suis posé cette question il y a quelques mois, et la seule solution réalisable (compatible avec FF3 + et IE7) était d'utiliser l'ancien <script></script> syntaxe avec text/html (Syntaxe HTML + MIME type HTML).

Si votre serveur envoie le text/html tapez dans ses en-têtes HTTP, même avec des documents XHTML autrement correctement formés, FF3 + utilisera son mode de rendu HTML ce qui signifie que <script /> ne fonctionnera pas (c'est un changement, Firefox était auparavant moins strict).

Cela arrivera indépendamment de tout tripoter avec http-equiv meta tags, le prologue XML ou doctype dans votre document - branches de Firefox une fois qu'il obtient le text/html en-tête, qui détermine si l'analyseur HTML ou XML regarde à l'intérieur du document, et l'analyseur HTML ne comprend pas <script />.


211
2017-09-16 08:14



Dans le cas où quelqu'un est curieux, la raison ultime est que HTML était à l'origine un dialecte de SGML, qui est le frère aîné bizarre de XML. En SGML-land, les étiquettes peuvent être spécifiées dans la DTD comme étant soit à fermeture automatique (par exemple BR, HR, INPUT), implicitement fermable (par exemple P, LI, TD) ou explicitement fermable (par exemple TABLE, DIV, SCRIPT). XML n'a bien sûr aucun concept de cela.

Les analyseurs de tag-soupe utilisés par les navigateurs modernes ont évolué à partir de cet héritage, bien que leur modèle d'analyse ne soit plus un pur SGML. Et bien sûr, votre XHTML soigneusement conçu est traité comme un tag-tag inspiré de SGML mal écrit à moins que vous ne l'envoyiez avec un type MIME XML. C'est aussi pourquoi ...

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

... est interprété par le navigateur comme:

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

... qui est la recette pour un bogue obscur charmant qui peut vous jeter dans des ajustements pendant que vous essayez de coder contre le DOM.


140
2017-07-25 02:52



D'autres ont répondu "comment" et cité les spécifications. Voici la véritable histoire de "pourquoi pas <script/>", après de nombreuses heures à creuser dans des rapports de bogues et des listes de diffusion.


HTML 4

HTML 4 est basé sur SGML.

SGML a quelques shorttags, tel que <BR//, <B>text</>, <B/text/, ou <OL<LI>item</LI</OL>. XML prend la première forme, redéfinit la fin en tant que ">" (SGML est flexible), de sorte qu'il devient <BR/>.

Cependant, HTML n'a pas redfini, donc <SCRIPT/>  devrait signifier  <SCRIPT>>.
(Oui, le '>' devrait faire partie du contenu, et le tag est toujours ne pas fermé.)

De toute évidence, cela est incompatible avec XHTML et volonté briser de nombreux sites (au moment où les navigateurs étaient assez matures prendre soin de  à propos de ça), alors personne n'a mis en place des shorttags et la spécification conseille contre eux.

En effet, tous les tags auto-terminés «fonctionnels» sont des tags avec une étiquette de fin optionnelle sur des parseurs techniquement non conformes et sont en fait invalides. C'était W3C qui est venu avec ce hack pour aider à la transition vers XHTML en le faisant Compatible HTML.

Et <script>L'étiquette de fin est pas optionnel.

"Self-ending" tag est un hack en HTML 4 et n'a aucun sens.


HTML 5

HTML5 a cinq types de tags et seules les balises 'void' et 'foreign' sont autorisé à être auto-fermeture.

Car <script> n'est pas nul (il mai avoir du contenu) et n'est pas étranger (comme MathML ou SVG), <script> ne peut pas être auto-fermé, peu importe comment vous l'utilisez.

Mais pourquoi? Ne peuvent-ils pas le considérer comme étranger, faire un cas particulier, ou quelque chose?

HTML 5 vise à être rétrocompatible avec implémentations de HTML 4 et XHTML 1. Il n'est pas basé sur SGML ou XML; Sa syntaxe concerne principalement la documentation et l'unification des implémentations. (C'est pourquoi <br/>  <hr/> etc. sont HTML valide 5 en dépit d'être invalide HTML4.)

À fermeture automatique <script> est l'un des tags où les implémentations étaient différentes. Il utilisé pour travailler dans Chrome, Safari, et Opéra; à ma connaissance, cela n'a jamais fonctionné dans Internet Explorer ou Firefox.

Cela a été discuté lorsque HTML 5 était en cours de rédaction et a été rejeté parce qu'il pauses  navigateur  compatibilité. Les pages Web qui se referment automatiquement peuvent ne pas s'afficher correctement (le cas échéant) dans les anciens navigateurs. Il y avait autres propositions, mais ils ne peuvent pas non plus résoudre le problème de compatibilité.

Après la publication du brouillon, WebKit a mis à jour l'analyseur pour qu'il soit conforme.

À fermeture automatique <script> ne se produit pas dans HTML 5 en raison de la rétrocompatibilité avec HTML 4 et XHTML 1.


XHTML 1 / XHTML 5

Quand vraiment servi comme XHTML, <script/> est vraiment fermé, comme d'autres réponses ont déclaré.

Excepté la spécification dit il devrait ont travaillé lorsqu'ils sont servis en HTML:

Les documents XHTML ... peuvent être étiquetés avec le type de média Internet "text / html" [RFC2854], car ils sont compatibles avec la plupart des navigateurs HTML.

Alors, qu'est-ce-qu'il s'est passé?

Gens demandé Mozilla à laissez Firefox analyser documents conformes XHTML indépendamment de l'en-tête de contenu spécifié (appelé le reniflement du contenu). Cela aurait permis des scripts à fermeture automatique et un reniflage de contenu était nécessaire de toute façon parce que les hébergeurs Web n'étaient pas assez matures pour servir l'en-tête correct; IE était bon dans ce domaine.

Si la première guerre de navigateur ne se termine pas avec IE 6, XHTML peut avoir été sur la liste, aussi. Mais ça a fini. Et IE 6 a un problème avec XHTML. En fait, IE n'a pas soutenu le type MIME correct du tout, forçant toutes les personnes utiliser text/html pour XHTML parce que IE avait une part de marché importante pour une décennie entière.

Et aussi renifler le contenu peut être  vraiment mauvais et les gens disent il devrait être arrêté.

Finalement, il s'avère que le W3C ne voulait pas dire que XHTML soit reniflable: le document est tous les deux, HTML et XHTML, et Content-Type règles. On peut dire qu'ils étaient fermes sur "juste suivre nos spécifications" et ignorant ce qui était pratique. Une erreur qui a continué dans les versions ultérieures de XHTML.

Quoi qu'il en soit, cette décision réglé la question pour Firefox. Il était 7 ans avant Chrome est né; il n'y avait pas d'autre navigateur significatif. Ainsi, il a été décidé.

La spécification du doctype seul ne déclenche pas l'analyse XML en raison des spécifications suivantes.


123
2018-02-25 12:37



Internet Explorer 8 et versions antérieures ne prennent pas en charge l'analyse XHTML. Même si vous utilisez une déclaration XML et / ou un doctype XHTML, l'ancien IE analyse toujours le document en tant que code HTML. Et en langage HTML, la syntaxe à fermeture automatique n'est pas prise en charge. La barre oblique finale est simplement ignorée, vous devez utiliser une balise de fermeture explicite.

Même les navigateurs prenant en charge l'analyse XHTML, tels que IE 9 et plus tard, continuera à analyser le document au format HTML, sauf si vous le servez avec un type de contenu XML. Mais dans ce cas, l'ancien IE n'affichera pas le document du tout!


43
2017-09-16 08:00



Les personnes ci-dessus ont déjà largement expliqué le problème, mais une chose qui pourrait clarifier les choses est que, bien que les gens utilisent '&lt;br/>' et tout le temps dans HTML documents, tout '/' dans une telle position est fondamentalement ignoré, et seulement utilisé en essayant de rendre quelque chose à la fois analysable XML et HTML. Essayer '&lt;p/>foo&lt;/p>'par exemple, et vous obtenez un paragraphe régulier.


25
2017-09-16 13:07



La balise de script à fermeture automatique ne fonctionnera pas, car la balise de script peut contenir du code en ligne et HTML n'est pas assez intelligent pour activer ou désactiver cette fonctionnalité en fonction de la présence d'un attribut.

D'autre part, HTML a un excellent tag pour inclure   références à des ressources extérieures: le <link>tag, et il peut être   à fermeture automatique. Il est déjà utilisé pour inclure des feuilles de style, RSS et Atom   les flux, les URI canoniques et toutes sortes d'autres goodies. Pourquoi pas   JavaScript?

Si vous voulez que l'étiquette de script soit auto-jointe, vous ne pouvez pas le faire comme je l'ai dit, mais il y a une alternative, mais pas une puce. Vous pouvez utiliser la balise de lien de fermeture automatique et un lien vers votre JavaScript en lui donnant un type de texte / javascript et rel comme script, quelque chose comme ci-dessous:

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

23
2017-10-27 09:35



Contrairement à XML et XHTML, le HTML n'a aucune connaissance de la syntaxe à fermeture automatique. Les navigateurs qui interprètent XHTML en HTML ne savent pas que le / le caractère indique que l'étiquette devrait être à fermeture automatique; au lieu de cela, ils l'interprètent comme un attribut vide et l'analyseur pense toujours que le tag est "ouvert".

Tout comme <script defer> est traité comme <script defer="defer">, <script /> est traité comme <script /="/">.


19
2017-09-16 07:10



Internet Explorer 8 et les versions antérieures ne prennent pas en charge le type MIME approprié pour XHTML, application/xhtml+xml. Si vous diffusez XHTML en tant que text/html, que vous devez faire pour que ces anciennes versions d'Internet Explorer fassent quelque chose, il sera interprété comme HTML 4.01. Vous pouvez uniquement utiliser la syntaxe courte avec n'importe quel élément qui permet d'omettre la balise de fermeture. Voir le HTML 4.01 Spécifications.

Le 'format court' XML est interprété comme un attribut nommé /, qui (parce qu'il n'y a pas de signe égal) est interprété comme ayant une valeur implicite de "/". Ceci est strictement faux dans HTML 4.01 - les attributs non déclarés ne sont pas autorisés - mais les navigateurs l'ignoreront.

IE9 et plus tard soutenir XHTML 5 Servi avec application/xhtml+xml.


18
2017-09-16 12:48