Domanda

Qual è il motivo per cui i browser non riconoscono correttamente:

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

Si riconosce solo questo:

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

Questo rompe il concetto di supporto XHTML?

Nota:Questa affermazione è corretta almeno per tutti gli IE (6-8 beta 2).

È stato utile?

Soluzione

La specifica XHTML 1 dice:

С.3.Minimizzazione degli elementi e contenuto degli elementi vuoti

Data un'istanza vuota di un elemento il cui modello di contenuto non lo è EMPTY (ad esempio un titolo o un paragrafo vuoto) non utilizzare la forma ridotta a icona (ad es.utilizzo <p> </p> e non <p />).

DTDXHTML specifica gli elementi dello script come:

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

Altri suggerimenti

In aggiunta a ciò che hanno detto Brad e squadette, la sintassi XML a chiusura automatica <script /> In realtà È XML corretto, ma affinché funzioni nella pratica, il tuo server web deve anche inviare i tuoi documenti come XML formato correttamente con un tipo MIME XML come application/xhtml+xml nell'intestazione HTTP Content-Type (e non COME text/html).

Tuttavia, l'invio di un tipo MIME XML farà sì che le tue pagine non vengano analizzate da IE7, che solo "mi piace". text/html.

Da w3:

In sintesi, "Applicazione/XHTML+XML" dovrebbe essere utilizzato per i documenti di famiglia XHTML e l'uso di "text/html" dovrebbe essere limitato ai documenti XHTML 1.0 compatibili con HTML."Application/XML" e 'Testo/XML' possono anche essere usati, ma ogni volta che è appropriato, 'Applicazione/XHTML+XML' dovrebbe essere usato piuttosto che quei tipi di media XML generici.

Mi sono interrogato su questo qualche mese fa e l'unica soluzione praticabile (compatibile con FF3+ e IE7) era utilizzare il vecchio <script></script> sintassi con text/html (Sintassi HTML + tipo MIME HTML).

Se il tuo server invia il file text/html digita le sue intestazioni HTTP, anche con documenti XHTML altrimenti formati correttamente, FF3+ utilizzerà la sua modalità di rendering HTML, il che significa che <script /> non funzionerà (questo è un cambiamento, Firefox in precedenza era meno severo).

Ciò accadrà indipendentemente da qualsiasi intervento http-equiv meta elementi, il prologo XML o il doctype all'interno del documento: Firefox si ramifica una volta ottenuto il file text/html intestazione, che determina se il parser HTML o XML guarda all'interno del documento e il parser HTML non capisce <script />.

Nel caso qualcuno fosse curioso, la ragione ultima è che l'HTML era originariamente un dialetto di SGML, che è lo strano fratello maggiore di XML.In SGML, gli elementi possono essere specificati nella DTD come a chiusura automatica (ad es.BR, HR, INPUT), implicitamente chiudibili (ad es.P, LI, TD) o esplicitamente chiudibili (es.TABELLA, DIV, SCRIPT).XML ovviamente non ne ha idea.

I parser tag-soup utilizzati dai browser moderni si sono evoluti da questa eredità, sebbene il loro modello di analisi non sia più puro SGML.E ovviamente il tuo XHTML accuratamente realizzato viene trattato come una zuppa di tag ispirata a SGML scritta male a meno che non lo invii con un tipo mime XML.Anche per questo...

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

...viene interpretato dal browser come:

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

...che è la ricetta per un adorabile bug oscuro che può farti venire i nervi in ​​sospeso mentre provi a codificare contro il DOM.

Altri hanno risposto "come" e citato le specifiche.Ecco la vera storia del "perché no". <script/>", dopo molte ore a scavare nelle segnalazioni di bug e nelle mailing list.


HTML4

HTML 4 è ​​basato su SGML.

SGML ne ha alcuni shorttag, ad esempio <BR//, <B>text</>, <B/text/, O <OL<LI>item</LI</OL>.XML prende la prima forma, ridefinisce la fine come ">" (SGML è flessibile), in modo che diventi <BR/>.

Tuttavia, l'HTML non è stato ridefinito, quindi <SCRIPT/> Dovrebbe Significare <SCRIPT>>.
(Sì, '>' dovrebbe far parte del contenuto e il tag è ancora non Chiuso.)

Ovviamente, questo è incompatibile con XHTML e Volere interrompere molti siti (quando i browser erano abbastanza maturi curare a questo proposito), COSÌ nessuno ha implementato gli shorttag e la specifica li sconsiglia.

In effetti, tutti i tag self-end "funzionanti" sono tag con tag finale opzionale su parser tecnicamente non conformi e di fatto non sono validi.Era il W3C che ha inventato questo trucco per aiutare la transizione a XHTML realizzandola Compatibile con HTML.

E <script>il tag finale è non facoltativo.

Il tag "auto-finale" è un hack in HTML 4 e non ha senso.


HTML5

HTML5 ha cinque tipi di tag e solo i tag "void" e "foreign" lo sono è consentito chiudersi automaticamente.

Perché <script> non è nullo (it Maggio avere contenuti) e non è estraneo (come MathML o SVG), <script> non può essere chiuso automaticamente, indipendentemente da come lo usi.

Ma perché?Non possono considerarlo straniero, fare un caso speciale o qualcosa del genere?

HTML 5 mira a esserlo retrocompatibile con implementazioni di HTML 4 e XHTML 1.Non è basato su SGML o XML;la sua sintassi riguarda principalmente la documentazione e l'unione delle implementazioni.(Ecco perché <br/> <hr/> eccetera.Sono HTML 5 valido nonostante sia HTML4 non valido.)

Chiusura automatica <script> è uno dei tag in cui le implementazioni differivano.Esso funzionava con Chrome e Safari, e l'Opera;per quanto ne so non ha mai funzionato in Internet Explorer o Firefox.

Questo è stato discusso quando HTML 5 veniva redatto e fu rifiutato perché pause navigatore Compatibilità.Le pagine Web dotate di tag di script a chiusura automatica potrebbero non essere visualizzate correttamente (o non visualizzarle affatto) nei vecchi browser.C'erano altre proposte, ma non possono nemmeno risolvere il problema di compatibilità.

Dopo il rilascio della bozza, WebKit ha aggiornato il parser per renderlo conforme.

Chiusura automatica <script> non avviene in HTML 5 a causa della compatibilità con le versioni precedenti di HTML 4 e XHTML 1.


XHTML1/XHTML5

Quando Veramente servito come XHTML, <script/> è davvero chiuso, come altre risposte hanno dichiarato.

Salvo che dice la specifica Esso Dovrebbe hanno funzionato quando servito come HTML:

Documenti XHTML...possono essere etichettati con il tipo di supporto Internet "text/html" [RFC2854], poiché sono compatibili con la maggior parte dei browser HTML.

Allora, cos'è successo?

Persone chiese Mozilla A lascia che Firefox analizzi documenti conformi come XHTML indipendentemente dall'intestazione del contenuto specificata (nota come sniffare i contenuti).Ciò avrebbe consentito script a chiusura automatica e sniffing dei contenuti era necessario comunque perché i web hoster non erano abbastanza maturi per fornire l'intestazione corretta;IE era bravo a farlo.

Se la prima guerra dei browser non si è concluso con IE 6, anche XHTML potrebbe essere stato nell'elenco.Ma è finita.E IE 6 ha un problema con XHTML.In effetti IE non ha supportato il tipo MIME corretto affatto, forzare tutti usare text/html per XHTML perché IE deteneva una quota di mercato importante per un intero decennio.

E anche lo sniffing dei contenuti può essere davvero pessimo e la gente dice dovrebbe essere fermato.

Infine, si scopre che il W3C non significava che XHTML fosse sniffabile:il documento è Entrambi, HTML e XHTML e Content-Type regole.Si può dire che erano fermi sul "basta seguire le nostre specifiche" e ignorando ciò che era pratico.Un errore quello continuò nelle versioni XHTML successive.

Comunque, questa decisione risolto la questione per Firefox.Erano passati 7 anni da Chrome sono nato;non c'era nessun altro browser significativo.Così è stato deciso.

La specifica del solo doctype non attiva l'analisi XML a causa delle seguenti specifiche.

Internet Explorer 8 e versioni precedenti non supportano l'analisi XHTML.Anche se usi una dichiarazione XML e/o un doctype XHTML, il vecchio IE continua ad analizzare il documento come semplice HTML.E in HTML semplice, la sintassi a chiusura automatica non è supportata.La barra finale viene semplicemente ignorata, devi utilizzare un tag di chiusura esplicito.

Anche i browser con supporto per l'analisi XHTML, come IE 9 e versioni successive, analizzerà comunque il documento come HTML a meno che non fornisci al documento un tipo di contenuto XML.Ma in tal caso il vecchio IE non visualizzerà affatto il documento!

Le persone sopra hanno già spiegato più o meno il problema, ma una cosa che potrebbe chiarire le cose è che, sebbene le persone lo usino <br/> e simili continuamente nei documenti HTML, any / in una posizione del genere viene sostanzialmente ignorato e utilizzato solo quando si tenta di creare qualcosa che sia analizzabile come XML e HTML.Tentativo <p/>foo</p>, ad esempio, e otterrai un paragrafo normale.

Il tag script a chiusura automatica non funzionerà, perché il tag script può contenere codice in linea e l'HTML non è abbastanza intelligente da attivare o disattivare tale funzionalità in base alla presenza di un attributo.

D'altra parte, HTML ha un tag eccellente per includere riferimenti alle risorse esterne:IL <link> tagga, e può essere autoprodotto.È già usato per includere fogli di stile, Feed RSS e Atom, URI canonici e tutti i tipi di altre chicche.Perché non JavaScript?

Se vuoi che il tag script sia racchiuso da solo, non puoi farlo come ho detto, ma esiste un'alternativa, anche se non intelligente.Puoi utilizzare il tag link a chiusura automatica e collegarlo al tuo JavaScript fornendogli un tipo di text/javascript e rel come script, qualcosa come di seguito:

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

A differenza di XML e XHTML, HTML non conosce la sintassi di chiusura automatica.I browser che interpretano XHTML come HTML non sanno che il file / il carattere indica che il tag deve essere a chiusura automatica;invece lo interpretano come un attributo vuoto e il parser pensa ancora che il tag sia "aperto".

Proprio come <script defer> è trattato come <script defer="defer">, <script /> è trattato come <script /="/">.

Internet Explorer 8 e versioni precedenti non supportano il tipo MIME corretto per XHTML, application/xhtml+xml.Se stai offrendo XHTML come text/html, necessario affinché queste versioni precedenti di Internet Explorer possano fare qualsiasi cosa, verrà interpretato come HTML 4.01.Puoi utilizzare la sintassi breve solo con qualsiasi elemento che consenta di omettere il tag di chiusura.Vedi il Specifica HTML 4.01.

La 'forma breve' XML viene interpretata come un attributo denominato /, che (poiché non esiste un segno di uguale) viene interpretato come avente un valore implicito di "/".Questo è assolutamente sbagliato in HTML 4.01 - gli attributi non dichiarati non sono consentiti - ma i browser lo ignoreranno.

IE9 e versioni successive supporta XHTML5 servito con application/xhtml+xml.

Questo perché SCRIPT TAG non è un VOID ELEMENT.

In un Documento HTML - ELEMENTI VUOTI non serve assolutamente un "tag di chiusura"!

In xhtml, tutto è Generico, quindi tutti hanno bisogno terminazione per esempio.un "tag di chiusura";Inclusa br, una semplice interruzione di riga, come <br></br> o il suo abbreviazione <br />.

Tuttavia, un Elemento Script non è mai un elemento vuoto o parametrico, perché etichetta di script prima di ogni altra cosa, è un'istruzione del browser, non una dichiarazione di descrizione dei dati.

Principalmente, un'istruzione di terminazione semantica, ad esempio un "tag di chiusura", è necessaria solo per elaborare istruzioni la cui semantica non può essere terminata da un tag successivo.Ad esempio:

<H1> la semantica non può essere terminata da un seguito <P> perché non ha abbastanza semantica propria per sovrascrivere e quindi terminare il precedente set di istruzioni H1.Anche se sarà in grado di rompere il flusso in una nuova riga di paragrafo, non è "abbastanza forte" da sovrascrivere la dimensione del carattere e l'altezza della riga dello stile attuali riversandosi lungo il ruscello, cioè fuoriuscita da H1 (perché P non ce l'ha).

Ecco come e perché è stata inventata la segnalazione "/" (terminazione).

Un generico Nessuna descrizione terminazione Tag come < />, sarebbe bastato per ogni singola caduta dalla cascata incontrata, ad esempio: <H1>Title< /> ma non è sempre così, perché vogliamo anche essere in grado di "nidare", più tag intermedi dello Stream:diviso in torrenti prima di avvolgersi/cadere su un'altra cascata.Di conseguenza un terminatore generico come < /> non sarebbe in grado di determinare l'obiettivo di una proprietà da terminare.Per esempio: <b>grassetto <i>Italico grassetto < /> corsivo </>normale.Senza dubbio non riuscirebbe a realizzare la nostra intenzione giusta e molto probabilmente la interpreterebbe come grassetto grassetto-corsivo grassetto normale.

Ecco come nozione di un involucro, cioè di un contenitore, è nato.(Queste nozioni sono così simili che è impossibile discernere e talvolta lo stesso elemento può avere entrambe le cose. <H1> è allo stesso tempo involucro e contenitore.Mentre <B> solo un wrapper semantico).Avremo bisogno di un contenitore semplice, senza semantica.E ovviamente è arrivata l'invenzione di un elemento DIV.

L'elemento DIV è in realtà un contenitore 2BR.Naturalmente l'avvento dei CSS ha reso l'intera situazione più strana di quanto sarebbe stata altrimenti e ha causato una grande confusione con molte grandi conseguenze - indirettamente!

Poiché con i CSS è possibile sovrascrivere facilmente il comportamento nativo pre e post BR di un DIV appena inventato, viene spesso definito "contenitore non fare nulla".Il che è, naturalmente, sbagliato!I DIV sono elementi a blocchi e interromperanno nativamente la linea del flusso sia prima che dopo la segnalazione di fine.Ben presto il WEB iniziò a soffrire della pagina DIV-itis.La maggior parte di loro lo sono ancora.

L'avvento dei CSS con la sua capacità di sovrascrivere e ridefinire completamente il comportamento nativo di qualsiasi tag HTML, in qualche modo è riuscito a confondere e offuscare l'intero significato dell'esistenza dell'HTML...

All'improvviso tutti i tag HTML apparivano come obsoleti, erano deturpati, privati ​​di tutto il loro significato, identità e scopo originali.In qualche modo avresti l'impressione che non siano più necessari.Detto:Un singolo tag contenitore-wrapper sarebbe sufficiente per tutta la presentazione dei dati.Basta aggiungere gli attributi richiesti.Perché non avere invece tag significativi;Inventa i nomi dei tag mentre procedi e lascia che i CSS si preoccupino del resto.

È così che è nato xhtml e, naturalmente, il grande schietto, pagato così caro dai nuovi arrivati ​​e da una visione distorta di cosa è cosa, e qual è il dannato scopo di tutto ciò.Il W3C è passato dal World Wide Web a Cosa è andato storto, compagni?!!

Lo scopo dell'HTML è per eseguire lo streaming dati significativi al destinatario umano.

Per fornire informazioni.

La parte formale è lì solo per favorire la chiarezza della fornitura delle informazioni.xhtml non dà la minima considerazione alle informazioni.- Per lui l'informazione è assolutamente irrilevante.

La cosa più importante è saperlo ed essere in grado di capirlo xhtml non è solo una versione di un codice HTML esteso, xhtml è una bestia completamente diversa;motivi;e quindi è saggio tenerli separati.

La differenza tra "vero XHTML", "falso XHTML" e HTML, nonché l'importanza del tipo MIME inviato dal server, erano state già descritto bene qui.Se vuoi provarlo subito, ecco un semplice snippet modificabile con anteprima dal vivo che include tag di script a chiusura automatica per browser compatibili:

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>

Tu dovresti vedere Hello, true XHTML. Nice to meet you! sotto l'area testo.

Per i browser non compatibili è possibile copiare il contenuto dell'area di testo e salvarlo come file con .xhtml (O .xht) estensione (grazie Alek per questo suggerimento).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top