1520 votes

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

518voto

squadette Points 4463

XHTML 1 spécifications dit:

С.3. Élément de réduction et de Vider le Contenu d'un Élément

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

DTD XHTML spécifie les balises de script comme:

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

Espérons que cela aide,

257voto

joelhardi Points 6538

Pour ajouter à ce que Brad et squadette l'ai dit, l'auto-fermeture de la syntaxe XML, <script /> fait est correct XML, mais pour que cela fonctionne dans la pratique, votre serveur web doit également envoyer vos documents correctement formé XML avec XML, type mime comme application/xhtml+xml dans le HTTP header Content-Type (et pas qu' text/html).

Cependant, l'envoi d'un XML type mime sera la cause de vos pages de ne pas être analysé par IE7, qui aime seulement text/html.

De w3:

En résumé, 'application/xhtml+xml" DEVRAIT être utilisé pour le XHTML Famille les documents, et l'utilisation de 'text/html' DEVRAIT être limitée à HTML-compatible XHTML 1.0 documents. "application/xml" et 'text/xml' PEUT également être utilisé, mais le cas échéant, "application/xhtml+xml' DOIT être utilisé plutôt que de ceux XML générique médias les types.

J'ai demandé il y a quelques mois, et la seule viable (compatible avec FF3+ et IE7) solution a été d'utiliser le vieux - <script></script> syntaxe, text/html (syntaxe HTML + HTML mimetype).

Si votre serveur envoie l' text/html type dans ses en-têtes HTTP, même avec autrement correctement formé des documents XHTML, FF3+ agira d'utiliser le mode de rendu HTML ce qui signifie qu' <script /> ne fonctionnera pas (ce qui est un changement, Firefox était déjà moins strict).

Ce sera le cas, indépendamment de tout tripoter http-equiv balises meta, le prologue XML ou doctype à l'intérieur de votre document, Firefox branches une fois qu'il obtient l' text/html - tête, qui détermine si le HTML ou XML parser regarde à l'intérieur du document, et l'analyseur HTML ne comprends pas <script />.

178voto

greim Points 2669

Dans le cas où quelqu'un de curieux, la raison ultime est que le HTML a été à l'origine un dialecte de SGML, XML est bizarre frère aîné. En SGML-terre, les balises peuvent être spécifiés dans le fichier DTD comme à fermeture automatique (par exemple, BR, HR, ENTRÉE), implicitement fermer (par exemple, P, LI, TD), ou de fermer explicitement (par exemple, TABLE, DIV, SCRIPT). XML bien sûr n'a pas de notion de ce.

L'étiquette de soupe aux analyseurs utilisés par les navigateurs modernes évolué à partir de cet héritage, bien que leur analyse du modèle n'est pas pur SGML plus. Et bien sûr, votre soigneusement conçu XHTML est d'être traités comme des mal écrits tag-soupe/SGML, à moins de l'envoyer avec un XML de type mime. C'est aussi pourquoi...

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

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

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

...qui est la recette pour un beau bug obscure qui peut vous jeter dans les ajustements que vous essayez de code sur le DOM.

44voto

JacquesB Points 19878

Notez que IE ne prend pas en charge le format XHTML de l'analyse. Même si vous utilisez une déclaration XML et/ou un doctype XHTML, c'est à dire encore analyse le document au format HTML. Et en HTML, la fermeture automatique de la syntaxe n'est pas pris en charge. Le slash est tout simplement ignorés, vous devez utiliser explicite d'une balise de fermeture.

Même les navigateurs avec support pour XHTML analyse sera toujours analyser le document au format HTML, à moins que vous servez le document xml de type mime. Mais dans ce cas, IE n'affiche pas le document à tous!

28voto

Marijn Points 752

Les personnes ci-dessus ont été déjà assez bien expliqué le problème, mais la seule chose qui pourrait rendre les choses claires, c'est que, même si les gens utilisent '<br/> " et de ce fait tout le temps dans les documents HTML, toute '/' dans une telle position est fondamentalement ignoré, et uniquement utilisée lorsque vous essayez de faire quelque chose d'à la fois parseable que XML et HTML. Essayez " <p/>foo</p>', par exemple, et vous obtenez un paragraphe normal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X