it-swarm-eu.dev

Proč nefungují samozavírací prvky skriptu?

Proč prohlížeče nerozpoznávají správně:

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

Pouze toto se uznává:

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

Rozbije to koncept podpory XHTML?

Poznámka: Toto prohlášení je správné alespoň pro všechny IE (6-8 beta 2).

1247
dimarzionist

Specifikace XHTML 1 říká:

С.3. Minimalizace prvku a obsah prázdného prvk

Vzhledem k prázdné instanci prvku, jehož model obsahu není EMPTY (například prázdný název nebo odstavec), nepoužívejte minimalizovaný formulář (např. Použijte <p> </p> a ne <p />).

XHTML DTD určuje prvky skriptu jako:

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

Chcete-li přidat k tomu, co řekl Brad a squadeta, je samozavírací syntaxe XML <script /> ve skutečnosti správným správným XML, ale pro to, aby fungoval v praxi, váš web server také musí odesílat vaše dokumenty jako správně vytvořené XML s XML mimetypem, jako je application/xhtml+xml v záhlaví HTTP Content-Type (a nikoli jako text/html).

Odeslání mimetypu XML však způsobí, že vaše stránky nebudou analyzovány IE7, což se líbí pouze text/html.

Od w :

Stručně řečeno, 'application/xhtml + xml' BY MĚL být použit pro dokumenty XHTML Family a použití 'text/html' BY MĚL být omezeno na HTML XHTML 1.0 kompatibilní s HTML. Mohou být také použity 'application/xml' a 'text/xml', ale pokud je to vhodné, měly by být použity spíše 'application/xhtml + xml' než tyto obecné typy médií XML.

Před několika měsíci jsem se nad tím zmatil a jediným funkčním řešením (kompatibilním s FF3 + a IE7) bylo použití staré syntaxe <script></script> s text/html (HTML syntaxe + HTML mimetype).

Pokud váš server odešle v hlavičkách HTTP typ text/html, i s jinak správně vytvořenými dokumenty XHTML, FF3 + použije svůj režim vykreslování HTML, což znamená, že <script /> nebude fungovat (jedná se o změnu, Firefox byl dříve méně přísný).

Stane se to bez ohledu na jakékoli manipulace s prvky metodu http-equiv, prologem XML nebo doctype uvnitř dokumentu - Firefox se větví, jakmile získá hlavičku text/html, která určuje, zda analyzátor HTML nebo XML vypadá uvnitř dokumentu a analyzátor HTML ne rozumět <script />.

225
joelhardi

V případě, že je někdo zvědavý, konečným důvodem je, že HTML bylo původně dialektem SGML, což je podivný starší bratr XML. V SGML-land mohou být prvky v DTD specifikovány buď jako samouzavírací (např. BR, HR, INPUT), implicitně uzavíratelné (např. P, LI, TD), nebo explicitně uzavíratelné (např. TABLE, DIV, SCRIPT). XML to samozřejmě nemá.

Parsery tag-polévka používané moderními prohlížeči se vyvinuly z tohoto odkazu, ačkoli jejich syntaktický model již není čistě SGML. A s vaší pečlivě vytvořenou XHTML se bude zacházet jako se špatně napsanou polévkou se štítkem inspirovanou SGML, pokud ji neodešlete s typem XML mime. To je také důvod, proč ...

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

... prohlížeč je interpretován jako:

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

... což je recept na krásnou obskurní chybu, která vás může hodit do záchvatu, když se pokoušíte kódovat proti DOM.

150
greim

Jiní odpověděli „jak“ a citovali specifikace. Zde je skutečný příběh „proč ne <script/>“, po mnoha hodinách kopání do hlášení o chybách a seznamů adresátů.


HTML 4

HTML 4 je založeno na SGML .

SGML má nějaké shorttags , například <BR//, <B>text</>, <B/text/ nebo <OL<LI>item</LI</OL>. XML má první podobu, předefinuje konec jako „>“ (SGML je flexibilní), takže se stane <BR/>.

HTML však znovu nedefinovalo, takže <SCRIPT/>should průměr<SCRIPT>>.
(Ano, „>“ by mělo být součástí obsahu a značka je stále ne uzavřena.)

To je samozřejmě nekompatibilní s XHTML a will rozbije mnoho stránek (v době, kdy byly prohlížeče dostatečně zralé na péčio tom ), takže - nikdo implementoval zkratky a specifikace nedoporučuje se .

Ve skutečnosti jsou všechny „funkční“ samoúčelné značky tagy s volitelnou koncovou značkou na technicky neshodných analyzátorech a ve skutečnosti jsou neplatné. Byl to W3C, který přišel s tímto hackem , aby pomohl při přechodu na XHTML tím, že je kompatibilní s HTML .

A konečná značka <script> je není volitelná .

Značka „Self-end“ je hack v HTML 4 a nemá význam.


HTML 5

HTML5 má pět typů značek a pouze 'neplatné' a 'cizí' značky jsou dovoleno samouzavírací .

Protože <script> není neplatný (má může mít obsah) a není cizí (jako MathML nebo SVG), <script> nemůže být uzavřen bez ohledu na to, jak jej používáte.

Ale proč? Nemohou to považovat za cizí, dělat zvláštní případ nebo tak něco?

Cílem HTML 5 je zpětně kompatibilní s implementace HTML 4 a XHTML 1. Není založeno na SGML nebo XML; jeho syntaxe se zabývá hlavně dokumentováním a sjednocením implementací. (To je důvod, proč <br/><hr/> atd. Jsou platné HTML 5 , přestože jsou neplatné HTML4.)

Samouzavírání <script> je jednou ze značek, u kterých se implementace lišily. Je zvyklý pracovat v Chrome, Safari , a Opera ; podle mého vědomí to nikdy nefungovalo v Internet Exploreru nebo Firefoxu.

Toto bylo projednáno , když byl zpracováván HTML 5 a byl odmítnut, protože přestávkyprohlížečkompatibilita . Webové stránky, které samy uzavírají značku skriptu, se ve starých prohlížečích nemusí vykreslit správně (pokud vůbec). Byly jiné návrhy , ale nemohou také vyřešit problém s kompatibilitou.

Po uvolnění konceptu WebKit aktualizoval analyzátor tak, aby byl v souladu.

Samouzavírání <script> se v HTML 5 nestane z důvodu zpětné kompatibility s HTML 4 a XHTML 1.


XHTML 1/XHTML 5

Když opravd sloužil jako XHTML, je <script/> opravdu uzavřený, jak uvedli jiné odpovědi .

Kromě toho, že specifikace říká it měl fungoval, když sloužil jako HTML:

Dokumenty XHTML ... mohou být označeny typem internetového média „text/html“ [RFC2854], protože jsou kompatibilní s většinou prohlížečů HTML.

Tak, co se stalo?

Lidé zeptal se Mozilla na nechat Firefox analyzovat vyhovující dokumenty jako XHTML bez ohledu na zadanou hlavičku obsahu (známou jako čichání obsah ). To by umožnilo samouzavírací skripty a čichání obsahu bylo nutné přesto, protože hostitelé webu nebyli dostatečně zralí, aby mohli obsluhovat správnou hlavičku; IE bylo v tom dobře .

Pokud první válka s prohlížečem nekončila s IE 6, mohla být XHTML také na seznamu. Ale skončilo to. A IE 6 má problém s XHTML. Ve skutečnosti IE nepodporuje správný typ MIME vůbec , nutí všichni použít text/html pro XHTML, protože IE měl hlavní podíl na trh po celé desetiletí.

A také čichání obsahu může býtopravdu špatné a lidé říkají mělo by být zastaveno .

Nakonec se ukázalo, že W3C neznamenalo, že XHTML bude čichatelný : dokument je oba, HTML a XHTML a Content-Type pravidla. Dá se říci, že stál pevně na "jen následovat naše specifikace" a ignorovat, co bylo praktické . Chyba, která pokračování do novějších verzí XHTML.

Nicméně toto rozhodnutí vyřešilo záležitost pro Firefox. Bylo to 7 let před Chrome narodil se ; neexistoval žádný další významný prohlížeč. Tak bylo rozhodnuto.

Zadání samotného doctype nespustí analýzu XML z důvodu následujících specifikací.

139
Sheepy

Internet Explorer 8 a starší verze XHTML nepodporují. I když používáte deklaraci XML a/nebo doxyp XHTML, starý IE stále dokument analyzuje jako obyčejný HTML. A v obyčejném HTML není samouzavírací syntaxe podporována. Koncové lomítko je prostě ignorováno, musíte použít explicitní uzavírací značku.

Dokonce i prohlížeče s podporou pro analýzu XHTML, například IE 9 a novější , budou dokument stále analyzovat jako HTML, pokud dokument nesloužíte typu obsahu XML. Ale v tomto případě starý IE dokument vůbec nezobrazí!

44
JacquesB

Výše uvedené osoby již problém do značné míry vysvětlily, ale jedna věc, která by mohla věci vyjasnit, je, že ačkoli lidé používají <br/> a takové neustále v HTML dokumentech, jakýkoli / v takové poloze je v podstatě ignorován a používá se pouze při pokusu aby bylo něco podobného jako XML a HTML. Zkuste například <p/>foo</p> a dostanete pravidelný odstavec.

26
Marijn

Značka samočinného uzavření skriptu nebude fungovat, protože značka skriptu může obsahovat vložený kód a kód HTML není dostatečně chytrý, aby tuto funkci mohl zapnout nebo vypnout na základě přítomnosti atributu.

Na druhou stranu má HTML vynikající značku pro zahrnutí odkazů na vnější zdroje: značku <link> a může se samouzavírat. Už se používá k zahrnutí stylů stylů, kanálů RSS a Atom, kanonických URI a nejrůznějších dalších dobrot. Proč ne JavaScript?

Pokud chcete, aby byla značka skriptu uzavřena samostatně, nemůžete to udělat, jak jsem řekl, ale existuje alternativa, i když ne chytrá. Můžete použít samouzavírací značku odkazu a odkaz na váš JavaScript tím, že mu dáte typ textu/javascriptu a rel jako skript, něco jako níže:

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

Na rozdíl od XML a XHTML nemá HTML žádnou znalost samouzavírací syntaxe. Prohlížeče, které interpretují XHTML jako HTML, nevědí, že znak / znamená, že by značka měla být samozavírací; místo toho jej interpretují jako prázdný atribut a syntaktický analyzátor si stále myslí, že je značka „otevřená“.

Stejně jako se <script defer> považuje za <script defer="defer">, <script /> se považuje za <script /="/">.

20
rpetrich

Internet Explorer 8 a starší nepodporují správný typ MIME pro XHTML, application/xhtml+xml. Pokud obsluhujete XHTML jako text/html, který musíte, aby tyto starší verze aplikace Internet Explorer něco udělaly, bude interpretován jako HTML 4.01. Krátkou syntaxi můžete použít pouze s jakýmkoli prvkem, který umožňuje vynechat uzavírací značku. Viz Specifikace HTML 4.01 .

XML „krátká forma“ je interpretována jako atribut pojmenovaný /, který (protože neexistuje znaménko rovná se) je interpretován jako implicitní hodnota „/“. Toto je v HTML 4.01 naprosto špatně - nedeklarované atributy nejsou povoleny - prohlížeče to však budou ignorovat.

IE9 a novější podpora XHTML 5 sloužil s application/xhtml+xml.

18
Mike Dimmick

To proto, že SCRIPT TAG není VOID ELEMENT.

V HTML dokumentu - VOID ELEMENTS nepotřebujete vůbec potřebujete "uzavírací značku"!

V xhtml je vše generické, proto všichni potřebují končení např. „závěrečná značka“; Včetně br, jednoduchý konec řádku, jako <br></br> nebo jeho zkratka <br />.

Element skriptu však není nikdy neplatný ani parametrický prvek, protože značka skriptu před čímkoli jiným je instrukcí prohlížeče, nikoli deklarací popisu dat.

V zásadě je instrukce sémantického zakončení, např. „Uzavírací značka“, nutná pouze pro zpracování instrukcí, jejichž sémantiku nelze ukončit následnou značkou. Například:

Sémantika <H1> nemůže být ukončena následujícím <P>, protože nemá dostatek vlastní sémantiky pro přepsání, a proto ukončuje předchozí instrukční sadu H1. Ačkoli bude schopen rozdělit stream na nový řádek odstavce, není dostatečně silné, aby potlačilo současnou velikost písma a styl-line line-height lití po proudu , tj. únik z H1 (protože P jej nemá).

To je, jak a proč byla vynalezena signalizace „/“ (ukončení).

Obecná koncová značka bez popisu , jako je < />, by stačila pro jakýkoli pád z napadené kaskády, např .: <H1>Title< />, ale není tomu tak vždy, protože také chceme být schopni „hnízdit“, vícenásobné prostřední značení Stream: před zabalením/pádem do jiné kaskády se rozdělí na torrenty. V důsledku toho by obecný terminátor, jako je < />, nebyl schopen určit cíl vlastnosti, která má být ukončena. Například: <b>tučně<i> tučně kurzívou < /> kurzíva </>normal. Nepochybně by se nám nepodařilo napravit náš záměr a nejpravděpodobněji by to interpretovalo jako tučné tučné italian tučné normální.

Takto se zrodil pojem obal, tj. Kontejner. (Tyto pojmy jsou tak podobné, že je nemožné rozeznat a někdy stejný prvek může mít obojí. <H1> je zároveň obal i kontejner současně. Zatímco <B> pouze sémantický obal). Budeme potřebovat obyčejný, žádný sémantický kontejner. A samozřejmě přišel vynález prvku DIV.

Prvek DIV je ve skutečnosti kontejnerem 2BR. Samozřejmě příchod CSS dělal celou situaci podivnější, než by tomu bylo jinak a způsobovalo velký zmatek s mnoha velkými důsledky - nepřímo!

Protože s CSS můžete snadno potlačit nativní chování před a po BR nově vynalezeného DIV, je to často označováno jako „nedělat nic“. Což je, samozřejmě, špatně! DIV jsou blokové prvky a nativně přeruší linii proudu před i po signalizaci konce. Web brzy začal trpět stránkou DIV-itis. Většina z nich stále je.

Příchod CSS s jeho schopností plně potlačit a zcela předefinovat nativní chování jakékoli značky HTML, nějak podařilo zmást a rozmazat celý význam existence HTML ...

Najednou se všechny HTML tagy objevily, jako by byly zastaralé, byly poškozené, zbavené veškerého původního významu, identity a účelu. Nějak byste získali dojem, že už nejsou potřeba. Řeknutí: Pro prezentaci všech dat by stačila jedna značka obalu obalu. Stačí přidat požadované atributy. Proč místo toho mít smysluplné značky; Vymýšlejte názvy značek za běhu a nechte CSS obtěžovat se zbytkem.

Takto se zrodil xhtml a samozřejmě velký tupý, tak draho placený novými příchozími a zkreslená vize o tom, co je a jaký je zatracený účel toho všeho. W3C přešlo z World Wide Web na Co Went Wrong, soudruzi? !!

Účelem HTML je streamovat smysluplná data pro lidského příjemce.

Poskytnout informace.

Formální část slouží pouze k jasnosti poskytování informací. xhtml tyto informace nepatrně zohledňuje. - K tomu jsou informace naprosto irelevantní.

Nejdůležitější věcí v této věci je vědět a být schopen pochopit, že xhtml není jen verze nějakého rozšířeného HTML, xhtml je úplně jiná bestie; hřiště nahoru; a proto je moudré je držet odděleně.

5
Bekim Bacaj

Rozdíl mezi 'true XHTML', 'faux XHTML' a HTML, stejně jako důležitost typu MIME odeslaného na server byl již zde dobře popsáno . Pokud si to chcete hned vyzkoušet, je zde jednoduchý upravitelný úryvek s živým náhledem včetně samo uzavřené značky skriptu pro schopné prohlížeče:

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>

Měli byste vidět Hello, true XHTML. Nice to meet you! pod textarea.

U prohlížečů, které nejsou schopné, můžete zkopírovat obsah textarea a uložit jej jako příponu s příponou .xhtml (nebo .xht) ( díky Alek za tento tip ).

2
myf