O HTML5 altera o padrão para comentários em HTML?

131

Recentemente, descobri que há, possivelmente, uma nova maneira de comentar em HTML5.

Em vez dos comentários típicos de <!-- -->várias linhas sobre os quais eu li, pensei ter notado que meu IDE fazia <!div >comentários regulares . Então eu testei e, para minha surpresa, o Chrome havia comentado essa tag. Ele apenas comentou a tag e não o conteúdo da div, então tive que comentar mais perto <!/div>para evitar o fechamento de outras divs.

Testei outro e parece que, geralmente, colocar um marcador de exclamação na frente da abertura de qualquer tag, esse símbolo <, faz com que essa tag seja comentada.

Isso é realmente novo? É uma má prática? Na verdade, é muito conveniente, mas ainda é prático (se não for novo)?

Editar detalhes extras: Embora um erro de sintaxe ou erros de interpretação desta sintaxe particular é uma boa razão, como é que o Chrome realmente torna-los como comentários cheios?

O código está escrito como :

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

E então é renderizado como :

<!--div displayed--> some text here that is still displayed <!--/div-->
Andrew
fonte
19
Provavelmente, é simplesmente um erro de sintaxe e / ou tag sem sentido e, portanto, ignorado.
Deceze
@ deceze Eu esperava um pouco que, já que os navegadores possam ser tolerantes com a forma como eles renderizam html de acordo com regras menos rígidas.
Andrew
1
@ Lemony-Andrew Que IDE faz isso? De acordo com a resposta selecionada, poderíamos relatar isso como um problema (ou corrigi-lo se for de código aberto).
Dereckson
1
@Deckeckit Verifiquei meu IDE duas vezes depois que a resposta oficial foi feita para garantir que meus olhos não estivessem me enganando. Por acaso, não foi de fato comentado, mas era a cor normal do texto que era semelhante. Tudo isso foi por acaso.
Andrew

Respostas:

196

Não há novo padrão para comentários em HTML5. A única sintaxe de comentário válida ainda é <!-- -->. Na seção 8.1.6 do W3C HTML5 :

Os comentários devem começar com a sequência de quatro caracteres U + 003C SINAL MENOS QUE, U + 0021 MARCA DE EXCLAMAÇÃO, U + 002D HYPHEN-MINUS, U + 002D HYPHEN-MINUS ( <!--).

A <!sintaxe é originada na marcação SGML DTD, que não faz parte do HTML5. No HTML5, é reservado para comentários, seções CDATA e a declaração DOCTYPE. Portanto, se essa alternativa é uma prática ruim, depende se você considera o uso (ou pior, a dependência) de marcação obsoleta como uma prática ruim.

O Validator.nu chama o que você tem de um "comentário falso". - o que significa que é tratado como um comentário, mesmo que não seja um comentário válido. Presumivelmente, isso é para compatibilidade com versões anteriores ao HTML5 pré-baseado em SGML e tinha declarações de marcação que assumiam o formulário <!FOO>, então eu não chamaria isso de novo. O motivo pelo qual são tratados como comentários é porque as declarações de marcação SGML eram declarações especiais que não deveriam ser renderizadas, mas como não fazem sentido no HTML5 (com as exceções acima), no que diz respeito ao DOM do HTML5, nada mais são que comentários .

As etapas a seguir na seção 8.2.4 levam a essa conclusão, que o Chrome parece estar seguindo à risca:

  1. 8.2.4.1 Estado dos dados :

    Consuma o próximo caractere de entrada:

    "<" (U + 003C)
    Muda para o estado de abertura da etiqueta.

  2. 8.2.4.8 Estado de abertura da etiqueta :

    Consuma o próximo caractere de entrada:

    "!" (U + 0021)
    Alterne para o estado aberto da declaração de marcação.

  3. 8.2.4.45 Estado aberto da declaração de marcação :

    Se os próximos dois caracteres forem caracteres "-" (U + 002D), consuma esses dois caracteres, crie um token de comentário cujos dados sejam a sequência vazia e mude para o estado inicial do comentário.

    Caso contrário, se os próximos sete caracteres forem uma correspondência que não diferencia maiúsculas de minúsculas ASCII da palavra "DOCTYPE", consuma esses caracteres e alterne para o estado DOCTYPE.

    Caso contrário, se houver um nó atual ajustado e ele não for um elemento no espaço para nome HTML e os próximos sete caracteres corresponderem a maiúsculas e minúsculas para a sequência "[CDATA [" (as cinco letras maiúsculas "CDATA" com U + 005B caractere ESQUERDO QUADRADO QUADRADO antes e depois), consuma esses caracteres e alterne para o estado da seção CDATA.

    Caso contrário, este é um erro de análise. Mude para o estado de comentário falso. O próximo caractere consumido, se houver, é o primeiro caractere que estará no comentário.

    Observe que ele diz para mudar para o estado inicial do comentário apenas se a sequência de caracteres encontrada for <!--, caso contrário, é um comentário falso. Isso reflete o que é afirmado na seção 8.1.6 acima.

  4. 8.2.4.44 Estado de comentário falso :

    Consuma todos os caracteres até e incluindo o primeiro caractere ">" (U + 003E) ou o final do arquivo (EOF), o que ocorrer primeiro. Emita um token de comentário cujos dados são a concatenação de todos os caracteres iniciando e incluindo o caractere que fez com que a máquina de estados alternasse para o estado de comentário falso, até e incluindo o caractere imediatamente antes do último caractere consumido (ou seja, até o caractere imediatamente antes do caractere U + 003E ou EOF), mas com qualquer caractere U + 0000 NULL substituído por caracteres U + FFFD REPLACEMENT CHARACTER. (Se o comentário tiver sido iniciado no final do arquivo (EOF), o token estará vazio. Da mesma forma, o token estará vazio se tiver sido gerado pela string " <!>".)

    Na planície Inglês, isso se transforma <!div displayed>em <!--div displayed-->e <!/div>em <!--/div-->, exatamente como descrito na pergunta.

Em uma nota final, você provavelmente pode esperar que outros analisadores compatíveis com HTML5 se comportem da mesma forma que o Chrome.

BoltClock
fonte
11
Obrigado por encontrar o raciocínio oficial por trás desse incidente. Isso esclarece bastante as coisas e dá muita validade à minha suposição errada.
Andrew
2
É estranho como a especificação do HTML5 tem regras para processar conteúdo "inválido". Se for inválido, não deve ser processado.
Arturo Torres Sánchez
2
Bem, é assim que as linguagens HTML e Web costumavam ser - rigorosas. A razão pela qual a estrutura de código incorreta é processada de maneira tão branda é para sites de melhor qualidade. Quanto mais sites um navegador puder exibir e exibir corretamente com sintaxe incorreta, mais felizes seus usuários finais ficarão. Os escritores gerais de padrões da web (principalmente o w3 e não o outro), perceberam que os fornecedores de navegadores não estavam seguindo as diretrizes por causa disso. O HTML5 veio e foi desenvolvido apenas com a idéia de tornar o design oficialmente mais branda.
Andrew
3
@ ArturoTorresSánchez: O XHTML tentou a abordagem "conteúdo inválido = erro" e falhou miseravelmente. Além disso, as regras basicamente dizem "não analise esse comentário falso, apenas trate-o como comentário e analise a próxima coisa válida que você encontrar". Portanto, dependendo do seu ponto de vista, o HTML5 não faz o que você quer, porque o que você quer é ruim ou o HTML5 faz exatamente o que você quer.
Slebetman
1
@ ArturoTorresSánchez: Historicamente, os servidores HTML esperariam servir a mesma sequência de caracteres para qualquer tipo de navegador; embora seja possível projetar um formato de documento de forma que os analisadores mais antigos possam distinguir documentos que usam recursos mais novos "opcionais" que os analisadores mais antigos devem ignorar, documentos que usam recursos mais recentes vitais e devem ser rejeitados por navegadores que não ' Para suportá-los e documentos que são simplesmente inválidos, tal coisa não foi feita com o HTML durante seus anos de formação.
supercat
12

Eu não acho que esse seja um bom hábito, já que <!significa declarações de marcação como <!DOCTYPE. Assim, você acha que está comentado (bem ... o navegador tentará interpretá-lo).

Mesmo que não apareça, essa parece não ser a sintaxe correta para comentar o código HTML.

Yves Lange
fonte
Embora isso possa ser verdade, como o Chrome realmente comenta essas tags, mas agora o doctype.
Andrew
4
Sugestão (não tenho certeza, apenas adivinhando): tenta interpretar> não pode> comentar?
Yves Lange
Isso parece bastante razoável para mim.
Andrew
Mais uma vez (desculpe insistir), mas esteja ciente de que isso é apenas uma suposição!
Yves Lange