HTML5 cambia lo standard per i commenti HTML?


131

Recentemente ho scoperto che esiste, possibilmente, un nuovo modo di commentare in HTML5.

Invece del tipico <!-- -->commento multilinea di cui ho letto, ho pensato di aver notato che il mio IDE faceva un normale <!div >commento. Quindi l'ho provato e con mia sorpresa Chrome aveva commentato quel tag. Ha solo commentato il tag e non il contenuto del div, quindi ho dovuto commentare più <!/div>da vicino per evitare di chiudere altri div.

Ne ho provato un altro e sembra che generalmente mettendo un punto esclamativo davanti all'apertura di qualsiasi tag, questo simbolo <, lo faccia commentare.

È davvero nuovo? È una cattiva pratica? In realtà è molto conveniente, ma è ancora pratico (se non nuovo)?

Modifica dettagli aggiuntivi: sebbene un errore di sintassi o interpretazioni errate di questa particolare sintassi siano una buona ragione, come mai Chrome li rende effettivamente come commenti completi?

Il codice è scritto come :

<!div displayed> some text here that is still displayed <!/div>

E quindi viene visualizzato come :

<!--div displayed--> some text here that is still displayed <!--/div-->

19
Più probabilmente è semplicemente un errore di sintassi e / o tag senza senso e quindi ignorato.
Inganno

@deceze In qualche modo mi aspettavo che, dal momento che i browser possono essere indulgenti con il modo in cui rendono l'html secondo regole meno rigide.
Andrew,

1
@ Lemony-Andrew Che IDE fa? In base alla risposta selezionata, potremmo segnalarlo come un problema (o risolverlo se è open source).
Dereckson,

1
@Derecksonit Ho ricontrollato il mio IDE dopo aver fatto la risposta ufficiale per assicurarmi che i miei occhi non mi stessero ingannando. È successo che non è stato di fatto commentato, ma era il normale colore del testo che era simile. Questo è stato tutto per caso.
Andrew,

Risposte:


196

Non esiste un nuovo standard per i commenti in HTML5. L'unica sintassi di commento valida è ancora <!-- -->. Dalla sezione 8.1.6 di W3C HTML5 :

I commenti devono iniziare con la sequenza di quattro caratteri U + 003C MENO DI THAN, U + 0021 MARCHIO DI ESCLAMAZIONE, U + 002D HYPHEN-MINUS, U + 002D HYPHEN-MINUS ( <!--).

La <!sintassi ha origine nel markup DTD SGML, che non fa parte di HTML5. In HTML5, è riservato ai commenti, alle sezioni CDATA e alla dichiarazione DOCTYPE. Pertanto, se questa alternativa è una cattiva pratica dipende dal fatto che si consideri l'uso di (o peggio, la dipendenza da) markup obsoleto come cattiva pratica.

Validator.nu chiama ciò che hai un "commento fasullo". - il che significa che è trattato come un commento anche se non è un commento valido. Questo è presumibilmente per la retrocompatibilità con pre-HTML5, che era basato su SGML, e aveva dichiarazioni di markup che prendevano la forma <!FOO>, quindi non lo definirei nuovo. Il motivo per cui vengono trattati come commenti è perché le dichiarazioni di markup SGML erano dichiarazioni speciali non pensate per essere rese, ma poiché sono prive di significato in HTML5 (con le eccezioni di cui sopra), per quanto riguarda il DOM HTML5 non sono altro che commenti .

I seguenti passaggi all'interno della sezione 8.2.4 portano a questa conclusione, che Chrome sembra seguire alla lettera:

  1. 8.2.4.1 Stato dati :

    Consuma il carattere di input successivo:

    "<" (U + 003C)
    Passa allo stato di apertura tag.

  2. 8.2.4.8 Stato aperto tag :

    Consuma il carattere di input successivo:

    "!" (U + 0021)
    Passa allo stato aperto della dichiarazione markup.

  3. 8.2.4.45 Stato aperto della dichiarazione di markup :

    Se i due caratteri successivi sono entrambi caratteri "-" (U + 002D), consuma quei due caratteri, crea un token di commento i cui dati sono la stringa vuota e passa allo stato iniziale del commento.

    Altrimenti, se i successivi sette caratteri sono una corrispondenza ASCII senza distinzione tra maiuscole e minuscole per la parola "DOCTYPE", quindi consuma quei caratteri e passa allo stato DOCTYPE.

    Altrimenti, se esiste un nodo corrente rettificato e non è un elemento nello spazio dei nomi HTML e i successivi sette caratteri sono una corrispondenza con distinzione tra maiuscole e minuscole per la stringa "[CDATA [" (le cinque lettere maiuscole "CDATA" con un U + 005B STAFFA QUADRATA SINISTRA carattere prima e dopo), quindi consuma quei caratteri e passa allo stato della sezione CDATA.

    In caso contrario, si tratta di un errore di analisi. Passa allo stato di commento fasullo. Il personaggio successivo che viene consumato, se presente, è il primo personaggio che sarà nel commento.

    Si noti che dice di passare allo stato di inizio del commento solo se la sequenza di caratteri rilevati è <!--, altrimenti è un commento falso. Ciò riflette quanto affermato nella precedente sezione 8.1.6.

  4. 8.2.4.44 Stato del commento fasullo :

    Consuma tutti i caratteri fino al primo carattere ">" (U + 003E) incluso e alla fine del file (EOF), a seconda di quale si verifica per primo. Emettere un token di commento i cui dati sono la concatenazione di tutti i caratteri a partire da e incluso il carattere che ha causato la macchina a stati per passare allo stato di commento fasullo, fino a includere il carattere immediatamente prima dell'ultimo carattere consumato (cioè fino al carattere appena prima del carattere U + 003E o EOF), ma con qualsiasi carattere U + 0000 NULL sostituito da U + FFFD PERSONAGGI DI RICAMBIO. (Se il commento è stato avviato alla fine del file (EOF), il token è vuoto. Allo stesso modo, il token è vuoto se è stato generato dalla stringa " <!>".)

    In parole povere, questo si trasforma <!div displayed>in <!--div displayed-->e <!/div>in <!--/div-->, esattamente come descritto nella domanda.

Infine, probabilmente puoi aspettarti che altri parser compatibili con HTML5 si comportino allo stesso modo di Chrome.


11
Grazie per aver dedicato del tempo a trovare il ragionamento ufficiale dietro questo incidente. Risolve un bel po 'le cose e dà molta validità alla mia assunzione ingiusta.
Andrew,

2
È strano come le specifiche HTML5 abbiano regole per elaborare contenuti "non validi". Se non è valido, non dovrebbe essere elaborato affatto.
Arturo Torres Sánchez,

2
Bene, ecco come erano le lingue HTML e Web: rigorose. Il motivo per cui una struttura di codice non corretta viene elaborata in modo così indulgente è per siti di migliore qualità. Più siti Web un browser può visualizzare e visualizzare correttamente con sintassi errata, più felici saranno i loro utenti finali. Gli autori di standard web generali (principalmente w3 non l'altro), hanno capito che i fornitori di browser non seguivano le linee guida per questo. HTML5 è nato e si è basato solo sull'idea di rendere il design ufficialmente più indulgente.
Andrew,

3
@ ArturoTorresSánchez: XHTML ha provato l'approccio "contenuto non valido = errore" e ha fallito miseramente. Inoltre, le regole sostanzialmente dicono "non analizzare questo commento fasullo, trattalo come un commento e analizza la prossima cosa valida che trovi". Quindi, a seconda del tuo punto di vista, HTML5 o non fa quello che vuoi perché ciò che vuoi fa schifo o HTML5 fa esattamente quello che vuoi.
slebetman,

1
@ ArturoTorresSánchez: storicamente, i server HTML si aspettano di offrire la stessa sequenza di caratteri a qualsiasi tipo di browser; sebbene sia possibile progettare un formato di documento in modo tale che i parser più anziani siano in grado di distinguere i documenti che utilizzano funzionalità più recenti "opzionali" che i parser più vecchi dovrebbero ignorare, i documenti che utilizzano funzionalità più recenti vitali e dovrebbero essere respinti dai browser che non Non supportarli, e documenti che sono semplicemente non validi, una cosa del genere non è stata fatta con HTML durante i suoi anni formativi.
supercat

12

Non penso che questa sia una buona abitudine da prendere poiché <!sta per dichiarazioni di markup come <!DOCTYPE. Quindi pensi che sia commentato (bene ... il browser proverà a interpretarlo).

Anche se non appare, questa non sembra essere la sintassi corretta per commentare il codice HTML.


Sebbene ciò possa essere vero, come mai Chrome fa effettivamente commentare quei tag, ma ora il tipo di documento.
Andrew,

4
Suggerimento (non sono sicuro, sto solo indovinando): cerca di interpretare> non puoi> commentato?
Yves Lange,

Mi sembra abbastanza ragionevole.
Andrew,

Ancora una volta (mi dispiace insistere), ma tieni presente che questa è solo una supposizione!
Yves Lange,
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.