Decisione di progettazione: perché generare <p> senza </p>?


14

tl; dr

Alcuni programmi ampiamente utilizzati, che generano HTML, genereranno solo tag di paragrafo di apertura e non di chiusura, supponendo che il browser chiuda correttamente i paragrafi.

A prima vista, mi sembra che il presupposto che i browser chiudano correttamente i paragrafi non sia corretto. La mia interpretazione è corretta? Più in generale, quali compromessi sono coinvolti in questo tipo di decisione?


Navigando attraverso il codice sorgente di moinmoin, la seguente riga di codice ha attirato la mia attenzione:

# We only open those tags and let the browser auto-close them:
_auto_closing_tags = set(['p'])

( fonte )

Dopo aver letto il resto dell'implementazione, mi sono convinto che sì, infatti, quando moinmoin genera codice html per una delle sue pagine, genererà correttamente tag di apertura di paragrafo, se del caso, evitando allo stesso tempo intenzionalmente qualsiasi il paragrafo chiude i tag (nonostante sia in grado di farlo in modo banale).

Per il mio caso d'uso specifico, piuttosto insolito, questo comportamento non è corretto. Sono tentato di inviare una segnalazione di bug e / o modificare il comportamento. Tuttavia, sembra che questa decisione di progettazione sia stata presa in modo ponderato. Non sono abbastanza esperto delle complessità dello standard html, o delle varie implementazioni del browser, per essere in grado di dire se questo è un comportamento corretto in generale, e ho la sensazione che il mio istinto di correggere / cambiare questo comportamento potrebbe essere sbagliata.

Questo codice fa un presupposto valido sulle implementazioni del browser? L'html generato è valido? Più in generale, quali compromessi potrei mancare qui?


2
Nonostante le risposte attuali, questo sembra un design idiota. "Sii liberale in ciò che accetti e conservatore in ciò che invii" e tutto il resto. È anche completamente inutile. Avrei sicuramente presentare una (dai toni) bug report a MoinMoin. Per lo meno dovrebbero documentare e commentare chiaramente questo comportamento non intuitivo.
Konrad Rudolph,

Risposte:


33

I tag di fine per gli pelementi erano facoltativi in ​​HTML e erano richiesti solo in XHTML. Tuttavia, la bozza HTML5 introduce una serie di condizioni per quando il ptag di fine è effettivamente facoltativo:

Il tag di fine di un elemento p può essere omesso se l'elemento p è immediatamente seguito da un indirizzo, articolo, a parte, blockquote, dir, div, dl, fieldset, footer, form, h1, h2, h3, h4, h5, h6, header , hgroup, hr, menu, nav, ol, p, pre, section, table o ul, element, o se non c'è più contenuto nell'elemento parent e l'elemento parent non è un elemento.

Fonte: specifica HTML5

Detto questo, l'unico argomento che ho mai sentito per aver omesso i tag di fine per gli pelementi è la dimensione del documento. Sta a te decidere se questo ha senso per il tuo documento o meno. Personalmente tendo a includere tutti i tag di fine opzionali, nel caso in cui non soddisfi i requisiti per quando il tag di fine è facoltativo.


5
Le grandi menti pensano allo stesso modo, immagino. :)
Robert Harvey,

@RobertHarvey Hai vinto questo round, per 12 secondi ...
yannis,

2
Un altro argomento a favore dell'omissione dei tag di fine: sono evidenti dalla struttura del documento e, se usati in modo improprio, possono anche introdurre spazi bianchi spuri.
Jon Purdy,

1
Essere in grado di omettere i tag di fine era esplicitamente una caratteristica di progettazione di SGML, su cui si basava HTML. Inoltre, NON era esplicitamente una caratteristica di XML, su cui si basa XHTML.
Alan Shutko,

4
Un argomento che vedo molto è che sembra più pulito. Soprattutto nel caso dei <li>tag, i tag si comportano più come punti elenco.
DisgruntledGoat

16

La specifica W3C per HTML5 afferma specificamente che:

Il tag di fine di un elemento p può essere omesso se l'elemento p è immediatamente seguito da un indirizzo, articolo, a parte, blockquote, dir, div, dl, fieldset, footer, form, h1, h2, h3, h4, h5, h6, header , hr, menu, nav, ol, p, pre, section, table o ul element o se non vi è più contenuto nell'elemento parent e l'elemento parent non è un elemento.

Quindi, in sostanza, la specifica ha fornito molti modi per evitare la complessità (grande o piccola che potrebbe essere) di chiudere il tag. Qualsiasi implementazione del browser conforme dovrebbe soddisfare queste eccezioni.

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.