Care este motivul pentru browsere nu recunoaște corect:
<script src="foobar.js" /> <!-- self-closing script element -->
Numai acest lucru este recunoscut:
<script src="foobar.js"></script>
Face această pauză conceptul de suport XHTML?
Notă: Această declarație este corectă, cel puțin pentru toate IE (6-8 beta 2).
XHTML 1 caietul de sarcini spune:
С.3. Element de Minimizare și Gol de Element de Conținut
a Dat un gol instanță a unui element al căror conținut model nu este " GOL "(de exemplu, un gol de titlu sau paragraf) nu utilizați minimizat formă (de exemplu, utilizarea
<p> </p> "și nu" < /p>
).
DTD XHTML specifică script elemente ca:
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
Pentru a adăuga la ceea ce Brad și squadette au spus, auto-închidere sintaxa XML <script /> de fapt **este** XML corect, dar pentru ca aceasta să funcționeze în practică, serverul dvs. de web, de asemenea, nevoie pentru a trimite documentele în mod corespunzător format XML cu un XML tip mime ca
application/xhtml+xml în Conținutul HTTP de Tip header (nu ca text/html
).
Cu toate acestea, trimiterea unui XML tip mime va provoca paginile dvs. să nu fi analizat de către IE7, care doar îi place text/html
.
De w3:
În rezumat, 'application/xhtml+xml' ar TREBUI să fie utilizate pentru XHTML Familie documente, și utilizarea de 'text/html' ar TREBUI să fie limitată la HTML-compatibil XHTML 1.0 documente. 'application/xml' si 'text/xml' POT fi de asemenea folosite, dar ori de câte ori este cazul, 'application/xhtml+xml' ar TREBUI să fie utilizate mai degrabă decât cele generice XML mass-media tipuri.
Am nedumerit peste câteva luni în urmă, și numai funcțional (compatibil cu FF3+ și IE7) soluția a fost de a utiliza vechi <script></script> sintaxa cu
text/html` (sintaxa HTML + HTML mime).
Dacă serverul trimite text/html
tip în antetele HTTP, chiar și cu altfel în mod corespunzător format XHTML documente, FF3+ va folosi modul de randare HTML, ceea ce înseamnă că <script />
nu va funcționa (aceasta este o schimbare, Firefox a fost anterior mai puțin stricte).
Acest lucru se va întâmpla indiferent de orice ține de fleacuri cu http-equiv
elemente meta, XML prolog sau doctype în interiorul documentului -- Firefox ramuri odată ce ea devine text/html
antet, care determină dacă HTML sau XML parser arata in document, și HTML parser nu înțelege de <script />
.
În cazul în care cineva's curios, motivul final este că HTML a fost inițial un dialect al SGML-ului, care este XML's ciudat frate mai mare. În SGML-teren, elementele pot fi specificate în DTD fie ca auto-închidere (de exemplu, BR, HR, INTRARE), implicit închisă (de exemplu P, LI, TD), sau se închid în mod explicit (de exemplu, MASĂ, DIV, SCRIPT-ul). XML, desigur, nu are conceptul de asta.
Tag-supa de interpretoare utilizate de browsere moderne au evoluat din această moștenire, deși lor parsarea model e't pur SGML mai. Și, desigur, cu atenție artizanale XHTML este tratat la fel de prost-scris SGML-a inspirat tag-supa daca nu trimite-l cu un XML de tip mime. Acest lucru este, de asemenea, de ce...
<p><div>hello</div></p>
...devine interpretat de browser ca:
<p></p><div>hello</div><p></p>
...care este reteta pentru un minunat obscure bug care poate arunca în se potrivește în timp ce încerca să codului împotriva DOM.
<script/>
", după mai multe ore de săpat în rapoarte de bug-uri și liste de discuții. <BR//
, <B>text</>
, <B/text/", sau " <OL<LI>produs</LI</OL>
.
XML are prima formă, redefinește se încheie ca ">" (SGML este flexibil), astfel încât acesta devine <BR/>
.
Cu toate acestea, HTML nu redfine, atât de <SCRIPT/>
[ar trebui să spun][3] a <SCRIPT>>
. <script>
's end tag-ul este [interzis][10].
"Auto-final" tag-ul este un hack în HTML 4 și este lipsită de sens. <script>
nu este void (poate au conținut) și nu este străină (cum ar fi MathML sau SVG), <script>
nu poate fi auto-închis, indiferent de modul de utilizare.
Dar de ce? Poate't au în vedere ca de externe, face caz special, sau ceva?
HTML 5 își propune să fie compatibil][13] cu implementari de HTML 4 si XHTML 1.
Nu este bazat pe SGML sau XML; sintaxa sa este, în principal în cauză cu documentarea și unirea implementări.
(Acest lucru este de ce <br/>
<h/>
etc. sunt [valid HTML 5][14] în ciuda fiind invalid HTML4.)
Auto-închidere <script>
este unul din tag-uri de unde implementări folosit să difere.
A [folosit pentru a lucra în Chrome, Mozilla][15], [și Opera][16]; pentru a cunoștințele mele nu a mers niciodată în Internet Explorer sau Firefox.
[Acest lucru a fost discutat][17] atunci când HTML 5 a fost elaborat și a fost respins pentru că [rupe][18] [browser][19] [compatibilitate][20].
Paginile web de auto-închidere tag script nu se poate face corect (dacă la toate) în browsere mai vechi.
Au fost [alte propuneri][21], dar ele pot't rezolva problema de compatibilitate, fie.
După ce proiectul a fost lansat, WebKit actualizat parser-ul pentru a fi în conformitate.
Auto-închidere `<script> nu se întâmplă în HTML 5 pentru compatibilitate cu HTML 4 si XHTML 1. XHTML 1 / XHTML 5 Atunci când într-adevăr * a servit ca XHTML, ` este într-adevăr închisă, ca [răspunde][22] s-au declarat. Cu excepția faptului că [spec spune][23] ar trebui să* au lucrat atunci când a servit ca HTML:
XHTML Documente ... poate fi etichetat cu Internet de Tip mass-Media "text/html" [RFC2854], deoarece acestea sunt compatibile cu cele mai multe browsere HTML. Deci, ce s-a întâmplat? Oamenii rugat Mozilla la sa Firefox analiza conform documentelor ca XHTML indiferent de conținutul specificat antet (cunoscut sub numele de conținut sniffing). Acest lucru ar fi permis auto-închidere script-uri, și conținutul sniffing a fost necesar oricum pentru web hosters nu au fost suficient de matur pentru a servi antetul corect; IE a fost bun la asta. Dacă primul browser de război am't end cu IE 6, XHTML poate să fi fost pe listă, de asemenea. Dar a făcut-end. Si IE 6 are o problema cu XHTML. În fapt IE nu suport tipul MIME corect la toate, forțând toată lumea pentru a utiliza
text/html
pentru XHTML pentru că IE organizat cotă importantă de piață pentru un întreg deceniu. Și, de asemenea, conținutul sniffing poate fi foarte rau și spun oamenii - l ar trebui să fie oprit. În cele din urmă, se dovedește că W3C n't înseamnă XHTML să fie sniffable: documentul este ambele, HTML și XHTML, și "Content-Type" reguli. Se poate spune că au fost fermi pe "doar urmați spec" și ignorând ceea ce a fost practic. O greșeală pe care continuare in mai târziu XHTML versiuni. Oricum, această decizie rezolvat problema pentru Firefox. Acesta a fost de 7 ani înainte de Crom născut; nu au existat alte semnificative browser-ul. Astfel s-a decis. Specificarea doctype singur nu declanșa XML parsing pentru următoarele specificații.**
Internet Explorer 8 și mai devreme, nu suport XHTML parsarea. Chiar dacă utilizați o declaratie XML și/sau un doctype XHTML, vechi IE încă analiza document HTML simplu. Și în HTML simplu, auto-închidere sintaxa nu este acceptată. Trailing slash este ignorat, trebuie să utilizați în mod explicit etichetă de închidere.
Chiar browsere cu suport pentru XHTML parsarea, precum IE 9 și mai târziu, tot va analiza documentul HTML dacă nu servesc document cu un conținut XML de tip. Dar în acest caz vechi de IE nu va afișa documentul la toate!
Oamenii de mai sus au deja destul de mult de explicat problema, dar un lucru care ar putea face lucrurile mai clar este că, deși oamenii folosesc <br/> și astfel tot timpul în documente HTML, nici o " / " într-o astfel de poziție este practic ignorat, și utilizate numai atunci când încearcă să facă ceva atât parseable ca XML și HTML. Încerca
Auto închidere tag script câștigat't de lucru, pentru că tag-ul script poate conține cod inline, și HTML nu este suficient de inteligent pentru a activa sau dezactiva această caracteristică bazează pe prezența unui atribut.
Pe de altă parte, HTML are un excelent tag inclusiv pentru trimiteri la resurse din afara: de
<link>
tag-ul, și poate fi auto-închidere. L's deja folosit pentru a include foi de stil, RSS și Atom feed-uri, canonic Uri, si tot felul de alte bunătăți. De ce nu JavaScript?
Dacă doriți tag-ul script să fie de la sine închise puteți't face că, după cum am spus, dar nu există o alternativă, deși nu unul inteligent. Puteți utiliza opțiunea de auto închidere link-ul tag-ul și link-ul de la JavaScript, dându-i un tip de text/javascript și rel ca script, ceva de genul de mai jos:
<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
Spre deosebire de XML și XHTML, HTML nu are cunoștințe de auto-închidere sintaxă. Browserele care interpreta XHTML HTML-don't știu că /
caracter indică faptul că eticheta ar trebui să fie auto-închidere, în loc să le interpreteze ca pe un gol de atribut și parser încă mai crede că eticheta este 'deschis'.
Doar ca <script defer>
este considerat <script amâna="amâne">
, <script />
este considerat <script /="/">
.
Internet Explorer 8 și mai în vârstă don't suport adecvat tip MIME pentru XHTML, application/xhtml+xml
. Daca're servire XHTML ca text/html
, care trebuie să pentru aceste versiuni mai vechi de Internet Explorer pentru a face ceva, acesta va fi interpretat ca HTML 4.01. Puteți utiliza numai scurt sintaxa cu orice element care permite tag-ul de închidere să fie omise. Vezi HTML 4.01 caietul de sarcini.
XML 'formular scurt' este interpretat ca un atribut numit /, care (pentru că nu există nici un semn egal) este interpretată ca având o valoare implicită de "/". Acest lucru este strict greșit în HTML 4.01 - nedeclarate atribute nu sunt permise - dar browsere va ignora.
IE9 și mai târziu suport XHTML 5 servit cu application/xhtml+xml
.
Într-o Document HTML - NULE ELEMENTE nu nevoie de un "etichetă de închidere", la toate!
În xhtml, totul este Generic, prin urmare, toate au nevoie de terminare de exemplu, un "etichetă de închidere"; Inclusiv br, o simplă linie de pauză, ca și <br></br>
sau prescurtare <br />
.
Cu toate acestea, un Element de Script nu este niciodată un vid sau un Element parametric, deoarece tag script înainte de orice altceva, este un Browser de Instrucțiuni, nu este o Descriere de Date declarația.
În principal, o Semantică Încetarea Instrucțiuni de exemplu, un "etichetă de închidere" este necesară doar pentru instrucțiuni de procesare care's semantica nu poate fi reziliat de către un reușind tag. De exemplu:
<H1>
semantica nu poate fi reziliat de către următoarele `
pentru că nu - 't transporta suficient de propriile sale semantica pentru a trece peste și prin urmare termina anterior H1 set de instrucțiuni. Deși va fi capabil de a sparge stream într-un nou alineat, nu este "suficient de puternic" pentru a trece peste prezent dimensiunea fontului & stil de linie-înălțime turnarea în jos pe râul, am.e scurgerea de la H1 (deoarece P nu't au).
Acest lucru este cum și de ce "/" (rezilierea) de semnalizare a fost inventat.
Un generic nu-descriere încetarea Tag-ca < />
, ar fi fost de-ajuns pentru o singură cad de pe întâlnite în cascadă, de exemplu: <H1>Titlu< />, dar's nu este întotdeauna cazul, deoarece ne-am dori, de asemenea, să fie capabil de "cuiburi", mai multe intermediar etichetarea de Flux: split în torente înainte de ambalaj / care se încadrează pe o altă cascadă. Ca o consecință generică terminator, cum ar fi
< />nu ar fi capabil de a determina ținta unui proprietatea de a termina. De exemplu:
**bold**
***bold-italic***
< />*italic*
</>`normal. Fără îndoială, ar eșua pentru a obține intenția noastră chiar și cel mai probabil va interpreta ca bold bold-itallic bold normal.
Acesta este modul în care noțiune de un înveliș ie., containerul a fost născut. (Aceste noțiuni sunt atât de asemănătoare încât este imposibil de a discerne și, uneori, același element poate avea pe amândouă. <H1>
este atât de înveliș și recipientul în același timp. Întrucât ` numai un semantic wrapper). Am'll nevoie de un simplu, nu semantica container. Și, desigur, invenția unui Element DIV venit.
Elementul DIV este de fapt o 2BR-Container. Desigur, venirea CSS făcut întreaga situație mai ciudată decât ar fi fost altfel și a provocat o mare confuzie cu multe consecințe mari - indirect!
Deoarece cu CSS-ai putea trece cu ușurință peste nativ de pre&după BR comportamentul unui nou inventat DIV, acesta este adesea menționată ca un "face nimic container". Care este, în mod natural greșit! DIVs sunt elemente bloc și va nativ sparge linia de flux atât înainte, cât și după sfârșitul de semnalizare. În curând WEB a început să sufere de pagina DIV-itis. Cele mai multe dintre ele încă mai sunt.
Venirea CSS cu capacitatea de a-și complet suprascrie și redefini complet nativ comportamentul de orice Etichetă HTML, a reușit cumva să se confunde și blur tot sensul de HTML existența...
Dintr-o dată toate tag-uri HTML a aparut ca dacă sunt depășite, au fost distruse, deposedat de toate semnificația lor originală, identitate și scop. Cumva te-ai'd câștiga impresia că au're nu mai este necesar. Spunând: - Un singur container-wrapper tag-ar fi de ajuns pentru toate datele de prezentare. Trebuie doar să adăugați atribute necesare. De ce nu au sens tag-uri în loc; a Inventa nume de tag-uri ca te duci și să CSS deranjez cu restul.
Acesta este modul în xhtml s-a născut și, desigur, marele blunt, plătit atât de scump de nou veniți și o imagine distorsionată a ceea ce este ceea ce, și ce's naibii scopul de tot. W3C a trecut de la World Wide Web pentru Ce a Mers Prost, Tovarăși?!!
Scopul HTML este de flux date semnificative uman destinatar.
Pentru a furniza Informații.
Partea oficială este acolo pentru a asista numai la claritate de livrare de informații. xhtml nu't da nici cea mai mică considerație pentru informații. - Pentru că, informația este absolut irelevant.
Cel mai important lucru în această chestiune este de a ști și de a fi capabil să înțeleagă că xhtml nu este doar o versiune de unele extins HTML, xhtml este o bestie complet diferit; motivele; și, prin urmare, este înțelept să păstrați-le separat.
Diferența între 'adevărat XHTML', 'faux XHTML' si HTML precum și importanța server-trimis tip MIME a fost descris deja aici de mai bine. Dacă doriți să încercați-l chiar acum, aici este simplu editabile fragment cu previzualizare live, inclusiv auto-tag script închis pentru capabile browsere:
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>
Ar trebui să vezi ce Bună ziua, adevărat XHTML. Mă bucur să te cunosc!` de mai jos textarea.
Pentru incapabil browsere, puteți copia conținutul textarea și salvați-l ca un fișier cu .xhtml "(sau".xht
) extensie (multumesc Alek pentru această sugestie).
Pur și simplu, modern, răspunsul este că tag-ul este notată ca fiind obligatorii, așa
Tag-ul omisiune Niciunul, ambele de început și de sfârșit de tag-ul sunt obligatorii.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script