Quali sono tutti gli elementi di chiusura automatica validi in XHTML (come implementato dai principali browser)?


188

Quali sono tutti gli elementi a chiusura automatica validi (ad es. <br/>) in XHTML (come implementato dai principali browser)?

So che XHTML consente tecnicamente a qualsiasi elemento di essere chiuso da solo, ma sto cercando un elenco di quegli elementi supportati da tutti i principali browser. Vedi http://dusan.fora.si/blog/self-closing-tags per esempi di alcuni problemi causati da elementi a chiusura automatica come <div />.


7
Non è questo predefinito uno degli scopi di XHTML? Ho pensato che uno dei vantaggi di XHTML fosse che potresti usare un generatore XML per generare HTML. Perché un generatore XML dovrebbe essere consapevole di quali tag possono essere chiusi automaticamente? Troppo strano.
Elia l'

6
Il motivo per cui la risposta "sbagliata", "errata" è stata accettata è perché ha risposto alla domanda che ovviamente i kamens stavano ponendo. Voleva sapere quali elementi potevano essere chiusi automaticamente quando si serviva XHTML come text / html senza causare problemi di rendering nei browser. Molte pagine sono scritte in XHTML e sono usate come text / html anche se tecnicamente non sono corrette. La domanda potrebbe essere migliorata con questo chiarimento, ma rispondere a una domanda diversa (cosa succede quando si funge da application / xml o se i tag singoli in text / html dovrebbero avere una chiusura /) non è utile in questo caso.
Nick Lockwood,

Risposte:


180

Ogni browser che supporta XHTML (Firefox, Opera, Safari, IE9 ) supporta la sintassi a chiusura automatica su ogni elemento .

<div/>, <script/>, <br></br>Tutto dovrebbe funzionare bene. In caso contrario, hai HTML con XTYTML DOCTYPE aggiunto in modo inappropriato.

DOCTYPE non cambia la modalità di interpretazione del documento. Fa solo il tipo MIME .

Decisione del W3C sull'ignorare DOCTYPE :

Il WG HTML ha discusso di questo problema: l'intenzione era quella di consentire ai vecchi browser (solo HTML) di accettare documenti XHTML 1.0 seguendo le linee guida e servendoli come text / html. Pertanto, i documenti serviti come text / html dovrebbero essere trattati come HTML e non come XHTML.

È una trappola molto comune, perché W3C Validator ignora in gran parte quella regola, ma i browser la seguono religiosamente. Leggi Informazioni su HTML, XML e XHTML dal blog WebKit:

In effetti, la stragrande maggioranza dei presunti documenti XHTML su Internet è servita come text/html. Il che significa che non sono affatto XHTML, ma in realtà HTML non valido che si risolve nella gestione degli errori dei parser HTML. Tutti quei "Valid XHTML 1.0!" i collegamenti sul web dicono davvero "HTML 4.01 non valido!".


Per verificare se hai XHTML reale o HTML non valido con DOCTYPE di XHTML, inseriscilo nel tuo documento:

<span style="color:green"><span style="color:red"/> 
 If it's red, it's HTML. Green is XHTML.
</span>

Convalida, e in XHTML reale funziona perfettamente (vedi: 1 vs 2 ). Se non riesci a credere ai tuoi occhi (o non sai come impostare i tipi MIME), apri la tua pagina tramite proxy XHTML .

Un altro modo per verificare è visualizzare la fonte in Firefox. Evidenzierà le barre in rosso quando non sono valide.

In HTML5 / XHTML5 questo non è cambiato e la distinzione è ancora più chiara, perché non ne hai nemmeno di più DOCTYPE. Content-Typeè il re.


Per la cronaca, le specifiche XHTML consentono a qualsiasi elemento di chiudersi automaticamente rendendo XHTML un'applicazione XML : [enfasi mia]

I tag di elementi vuoti possono essere utilizzati per qualsiasi elemento che non ha contenuto , indipendentemente dal fatto che sia dichiarato o meno utilizzando la parola chiave EMPTY.

Viene anche mostrato esplicitamente nelle specifiche XHTML :

Gli elementi vuoti devono neanche avere un tag di chiusura o il tag iniziale deve terminare con />. Ad esempio, <br/>oppure<hr></hr>


7
Non corretto afaik, perché l'utilizzo di versioni a chiusura automatica <script>o <div>comporta risultati / interpretazioni diversi.
ZeissS,

13
@ZeissS solo in text/html. Nel vero XHTML, inviato come application/xhtml+xmlfunziona bene. Si prega di leggere l'articolo che ho collegato (o la specifica XHTML nell'Appendice C) prima di effettuare il downgrade.
Kornel,

3
@pornel puoi garantire che i tag <script /> a chiusura automatica funzioneranno nei browser più vecchi? Io non la penso così. Sembri autorevole e la maggior parte delle tue informazioni sono accurate, ma l'esperienza mi dice che i tag di script con chiusura automatica saranno problematici ed è meglio evitarli del tutto piuttosto che darti mal di testa.
Metagrafo

6
@Metagrapher se i browser più vecchi non supportano XHTML reale, O non riesci a impostare il tipo MIME , quindi non funzionerà. Tuttavia, nei browser che supportano XHTML (tutti i principali a questo punto) con application/xhtml+xmltipo MIME, posso garantire che <script/>funzionerà. Con il tipo MIME. Solo.
Kornel,

4
@capdragon: i browser meno recenti non supportano XHTML (servito come 'application / xhtml + xml'). Se invii loro un documento XHTML come 'text / html', allora l'XHTML viene reso come un insieme di tag (cioè il browser lo analizza come HTML e considera errori di tag con chiusura automatica, da cui recupera con grazia). Le tue opzioni sono 1. scrivi HTML 4 (non esattamente un'opzione se usi ASP.NET che rende XHTML), 2. servi il tuo XHTML come 'application / xhtml + xml' (richiede IE9 +, e questo tipo MIME romperà gli script in tutti i browser comunque, quindi non è un'opzione), 3. scrivi HTML 5, che in pratica rende il tag soup lo standard :)
Triynko

41

Un elemento con cui prestare molta attenzione su questo argomento è l' <scriptelemento>. Se si dispone di un file di origine esterno, causerà problemi quando lo si chiude automaticamente. Provalo:

<!-- this will not consistently work in all browsers! -->
<script type="text/javascript" src="external.js" />

Funzionerà in Firefox, ma si rompe almeno in IE6. Lo so, perché mi sono imbattuto in questo quando ho chiuso con zelo ogni elemento che ho visto ;-)


Riguarda tutte le versioni di MSIE: webbugtrack.blogspot.com/2007/08/…
scunliffe,

4
<script> non si chiude automaticamente in Firefox 3.
hsivonen,

Beh, funzionava in Firefox quando l'ho incontrato. Sembra che non funzioni più in nessun browser. Potrebbe anche funzionare solo in modalità strane forse?
Erik van Brakel,

1
@erickson funziona bene in Firefox, se si otterrà il vostro giusto tipo MIME.
Kornel,

WebKit continua a farlo per motivi di compatibilità.
Yuhong Bao,

35

La sintassi a chiusura automatica funziona su tutti gli elementi in application / xhtml + xml. Non è supportato su alcun elemento in text / html, ma gli elementi che sono "vuoti" in HTML4 o "vuoti" in HTML5 non accettano comunque un tag di fine, quindi se si inserisce una barra su quelli appare come se la sintassi a chiusura automatica era supportata.


33

Dal sito di riferimento delle scuole W3 :

<area />
<base />
<basefont />
<br />
<hr />
<input />
<img />
<link />
<meta />

7
w3schools.com/tags/default.asp Vedo 12 tag che terminano con />:"area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "link", "meta", "param"
mpen

94
Si prega di notare che W3schools non è affiliato con W3C e non riesce nemmeno a rispondere alle correzioni inviate dai membri del W3C.
Kornel,

2
Come spesso, w3schools ha quasi ragione. Un modo preciso per trovare gli elementi vuoti è eseguire grep EMPTY xhtml1-strict.dtd | sortogrep EMPTY xhtml1-transitional.dtd | sort
cayhorstmann il

1
IMHO, le persone colpiscono troppo duramente le scuole W3. Si è dimostrato un'ottima risorsa per quando INIZIATE (!) Su un argomento di cui non sapete nulla.
Priidu Neemre,

28

La domanda migliore sarebbe: quali tag possono essere chiusi automaticamente anche in modalità HTML senza influire sul codice? Risposta: solo quelli che hanno un contenuto vuoto (sono nulli). Secondo le specifiche HTML, i seguenti elementi sono nulli:

area, base, br, col, embed, hr, img, input, keygen, link, menuitem, meta, param, source, track, wbr

Elenca anche la versione precedente delle specifiche command. Inoltre, secondo varie fonti i seguenti tag obsoleti o non standard sono nulli:

basefont, bgsound, frame, isindex


10

Spero che questo aiuti qualcuno:

<base />
<basefont />
<frame />
<link />
<meta />

<area />
<br />
<col />
<hr />
<img />
<input />
<param />

5

Che dire di <meta>e <link>? Perché non sono in quella lista?

Veloce regola empirica, non chiudere da sé alcun elemento destinato a contenere contenuti, perché prima o poi causerà sicuramente problemi al browser.

Quelli che si chiudono da soli, come <br>e <img>, dovrebbero essere ovvi. Quelli che non lo sono ... non chiuderli da soli!


4

L'ultima volta che ho controllato, i seguenti erano gli elementi vuoto / vuoto elencati in HTML5.

Valido per gli autori: area, base, br, col, comando, embed, eventsource, hr, img, input, link, meta, param, source

Non valido per gli autori: basefont, bgsound, frame, spacer, wbr

Oltre ai pochi che sono nuovi in ​​HTML5, ciò dovrebbe darti un'idea di quelli che potrebbero essere supportati quando si serve XHTML come text / html. (Basta testarli esaminando il DOM prodotto.)

Per quanto riguarda XHTML servito come application / xhtml + xml (che lo rende XML), si applicano le regole XML e qualsiasi elemento può essere vuoto (anche se il DTD XHTML non può esprimerlo).


4

Dovresti dare un'occhiata ai DTD xHTML , sono tutti elencati. Ecco una breve rassegna di tutti i principali:

<br />
<hr />
<img />
<input />

1
Markup corretto e pulito. Attenti ai collegamenti in queste pagine, sono lenti da caricare.
e-soddisf

4

Sono chiamati elementi "vuoti" in HTML 5. Sono elencati nelle specifiche W3 ufficiali .

Un elemento vuoto è un elemento il cui modello di contenuto non consente mai di avere contenuti in nessuna circostanza.

Ad aprile 2013 sono:

area, base, br, col, comando, embed, hr, img, input, keygen, link, meta, param, source, track, wbr

A partire da dicembre 2018 (HTML 5.2), sono:

area, base, br, col, embed, hr, img, input, link, meta, param, source, track, wbr


2

Un altro problema con i tag a chiusura automatica per IE è l'elemento title. Quando IE (appena provato in IE7) vede questo, presenta all'utente una pagina vuota. Comunque "vedi sorgente" e tutto è lì.

<title/>

Inizialmente l'ho visto quando la mia XSLT ha generato il tag di chiusura automatica.


Anche a Chromium non piacciono i <title/>tag.
uınbɐɥs

2

Non proverò a sovraelaborare questo, specialmente perché la maggior parte delle pagine che scrivo sono generate o il tag ha contenuto. Gli unici due che mi hanno mai dato problemi quando li ho fatti chiudere da soli sono:

<title/>

Per questo, ho semplicemente fatto ricorso a dargli sempre un tag di chiusura separato, dal momento che una volta che è lì dentro <head></head>non rende davvero il tuo codice più complicato con cui lavorare comunque.

<script/>

Questo è quello grande con cui recentemente ho avuto problemi. Per anni avevo sempre usato i <script/>tag a chiusura automatica quando lo script proveniva da una fonte esterna. Ma di recente ho iniziato a ricevere messaggi di errore JavaScript su un modulo null. Dopo diversi giorni di ricerche, ho scoperto che il problema era (presumibilmente) che il browser non <form>arrivava mai al tag perché non si rendeva conto che questa era la fine del<script/> tag. Quindi, quando l'ho trasformato in <script></script>tag separati , tutto ha funzionato. Perché diverso in diverse pagine che ho creato sullo stesso browser, non lo so, ma è stato un grande sollievo trovare la soluzione!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.