Czy HTML5 zmienia standard komentowania HTML?

131

Niedawno odkryłem, że prawdopodobnie istnieje nowy sposób komentowania w HTML5.

Zamiast typowego <!-- -->wielowierszowego komentarza, o którym czytałem, pomyślałem, że zauważyłem, że moje IDE regularnie <!div >komentowało. Przetestowałem to i ku mojemu zaskoczeniu Chrome skomentował ten tag. To tylko skomentowało tag, a nie zawartość div, więc musiałem skomentować bliżej, <!/div>aby uniknąć zamykania innych div.

Przetestowałem inny i wydaje się, że generalnie stawiam wykrzyknik przed otwarciem dowolnego tagu, tego symbolu < , powoduje, że tag jest komentowany.

Czy to jest rzeczywiście nowe? Czy to zła praktyka? Właściwie jest to bardzo wygodne, ale czy jest jeszcze praktyczne (jeśli nie nowe)?

Edytuj dodatkowe szczegóły: chociaż błąd składni lub błędna interpretacja tej konkretnej składni to dobry powód, dlaczego tak naprawdę Chrome renderuje je jako pełne komentarze?

Kod jest zapisany jako :

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

Następnie jest renderowany jako :

<!--div displayed--> some text here that is still displayed <!--/div-->
Andrzej
źródło
19
Bardziej prawdopodobne jest, że jest to po prostu błąd składni i / lub nonsensowny tag i dlatego są ignorowane.
deceze
@deceze Spodziewałem się, że ponieważ przeglądarki mogą być wyrozumiałe, jeśli chodzi o renderowanie html według mniej surowych zasad.
Andrew
1
@ Lemony-Andrew Jakie IDE to robi? Zgodnie z wybraną odpowiedzią możemy zgłosić to jako problem (lub naprawić, jeśli jest to oprogramowanie typu open source).
Dereckson
1
@Derecksonit Dokładnie sprawdziłem IDE po otrzymaniu oficjalnej odpowiedzi, aby upewnić się, że moje oczy mnie nie oszukują. Zdarzyło się, że de facto nie został on wykomentowany, ale zwykły kolor tekstu był podobny. To był przypadek.
Andrew

Odpowiedzi:

196

Nie ma nowego standardu komentarzy w HTML5. Jedyną poprawną składnią komentarzy jest nadal <!-- -->. Z sekcji 8.1.6 W3C HTML5 :

Komentarze muszą zaczynać się od ciągu czterech znaków U + 003C LESS-THAN SIGN, U + 0021 EXCLAMATION MARK, U + 002D HYPHEN-MINUS, U + 002D HYPHEN-MINUS ( <!--).

Plik <! pochodzi składniowe SGML DTD znaczników, który nie jest częścią HTML5. W HTML5 jest zarezerwowany dla komentarzy, sekcji CDATA i deklaracji DOCTYPE. Dlatego to, czy ta alternatywa jest złą praktyką, zależy od tego, czy uważasz użycie (lub, co gorsza, uzależnienie od) przestarzałych znaczników za złą praktykę.

Validator.nu nazywa to, co masz, „fałszywym komentarzem”. - co oznacza, że ​​jest traktowany jak komentarz, mimo że nie jest to ważny komentarz. Jest to przypuszczalnie dla wstecznej kompatybilności z wcześniejszym HTML5, który był oparty na SGML i miał deklaracje znaczników, które przyjęły formę <!FOO>, więc nie nazwałbym tego nowym. Powodem, dla którego są traktowane jak komentarze, jest to, że deklaracje znaczników SGML były specjalnymi deklaracjami nie przeznaczonymi do renderowania, ale ponieważ są bez znaczenia w HTML5 (z powyższymi wyjątkami), jeśli chodzi o HTML5 DOM, są one niczym więcej jak komentarzami .

Poniższe kroki w sekcji 8.2.4 prowadzą do tego wniosku, który Chrome wydaje się podążać co do litery:

  1. 8.2.4.1 Stan danych :

    Zużyj następny znak wejściowy:

    „<” (U + 003C)
    Przełącz do stanu otwartego tagu.

  2. 8.2.4.8 Stan otwarty etykiety :

    Zużyj następny znak wejściowy:

    „!” (U + 0021)
    Przełącz do stanu otwartego deklaracji znaczników.

  3. 8.2.4.45 Stan otwarty deklaracji znaczników :

    Jeśli następne dwa znaki są znakami „-” (U + 002D), wykorzystaj te dwa znaki, utwórz token komentarza, którego danymi jest pusty ciąg, i przełącz się do stanu początkowego komentarza.

    W przeciwnym razie, jeśli następnych siedem znaków jest dopasowaniem ASCII bez rozróżniania wielkości liter dla słowa „DOCTYPE”, należy użyć tych znaków i przejść do stanu DOCTYPE.

    W przeciwnym razie, jeśli istnieje dostosowany bieżący węzeł i nie jest to element w przestrzeni nazw HTML, a następnych siedem znaków uwzględnia wielkość liter dla ciągu „[CDATA [” (pięć wielkich liter „CDATA” z U + 005B LEFT SQUARE BRACKET przed i po), następnie użyj tych znaków i przełącz się do stanu sekcji CDATA.

    W przeciwnym razie jest to błąd analizy. Przełącz się do stanu fałszywego komentarza. Następny zużyty znak, jeśli taki istnieje, to pierwszy znak, który znajdzie się w komentarzu.

    Zwróć uwagę, że mówi, aby przełączyć się do stanu początkowego komentarza tylko wtedy, gdy sekwencja napotkanych znaków to <!--, w przeciwnym razie jest to fałszywy komentarz. Odzwierciedla to to, co określono w sekcji 8.1.6 powyżej.

  4. 8.2.4.44 Fałszywy komentarz :

    Zużywaj każdy znak, aż do pierwszego znaku „>” (U + 003E) lub końca pliku (EOF) włącznie, w zależności od tego, co nastąpi wcześniej. Emituj token komentarza, którego dane są połączeniem wszystkich znaków zaczynających się od znaku, który spowodował przełączenie automatu stanowego w stan fałszywego komentarza, aż do znaku bezpośrednio przed ostatnim wykorzystanym znakiem (tj. Do znaku tuż przed znakiem U + 003E lub EOF), ale z dowolnymi znakami U + 0000 NULL zastąpionymi znakami U + FFFD REPLACEMENT CHARACTER. (Jeśli komentarz został uruchomiony na końcu pliku (EOF), token jest pusty. Podobnie token jest pusty, jeśli został wygenerowany przez ciąg „ <!>”.)

    W prostym języku angielskim, okaże <!div displayed>język <!--div displayed-->i <!/div>język <!--/div-->, dokładnie tak jak opisano w pytaniu.

Na koniec prawdopodobnie możesz oczekiwać, że inne parsery zgodne z HTML5 będą zachowywać się tak samo jak Chrome.

BoltClock
źródło
11
Dziękujemy za poświęcenie czasu na znalezienie oficjalnego uzasadnienia tego incydentu. Rozjaśnia to całkiem sporo i nadaje dużo mocy mojemu błędnemu założeniu.
Andrew
2
To dziwne, że specyfikacja HTML5 zawiera reguły przetwarzania „nieprawidłowej” treści. Jeśli jest nieprawidłowy, nie powinien być w ogóle przetwarzany.
Arturo Torres Sánchez
2
Cóż, taki był kiedyś HTML i języki internetowe - ścisłe. Przyczyną tak łagodnego przetwarzania nieprawidłowej struktury kodu są witryny o lepszej jakości. Im więcej witryn internetowych może przeglądać przeglądarka i które są poprawnie wyświetlane z niewłaściwą składnią, tym bardziej zadowoleni będą ich użytkownicy końcowi. Twórcy ogólnych standardów sieciowych (w większości w3, a nie drugi) zdali sobie sprawę, że z tego powodu producenci przeglądarek nie przestrzegali wytycznych. Pojawił się HTML5 i powstał tylko na pomyśle, aby oficjalnie uczynić projekt bardziej łagodnym.
Andrew
3
@ ArturoTorresSánchez: XHTML wypróbował podejście „nieprawidłowa treść = błąd” i zakończyło się niepowodzeniem. Poza tym reguły mówią po prostu: „nie analizuj tego fałszywego komentarza, po prostu potraktuj go jako komentarz i przeanalizuj następną prawidłową rzecz, którą znajdziesz”. Więc w zależności od twojego punktu widzenia, HTML5 albo nie robi tego, co chcesz, ponieważ to, co chcesz, jest do bani, albo HTML5 robi dokładnie to, co chcesz.
slebetman
1
@ ArturoTorresSánchez: Historycznie, serwery HTML spodziewałyby się obsługiwać tę samą sekwencję znaków w każdej przeglądarce; chociaż możliwe jest zaprojektowanie formatu dokumentu w taki sposób, aby starsze parsery były w stanie rozróżniać dokumenty, które używają "opcjonalnych" nowszych funkcji, które starsze parsery powinny ignorować, dokumenty, które używają ważnych nowszych funkcji i powinny być odrzucane przez przeglądarki, które tego nie robią t wspierać je, i dokumenty, które są po prostu nieważne, coś takiego nie zostało zrobione z HTML w latach jego powstawania.
supercat
12

Nie sądzę, aby to był dobry zwyczaj, ponieważ <!oznacza to deklaracje znaczników, takie jak <!DOCTYPE. Dlatego myślisz, że jest komentowany (cóż ... przeglądarka spróbuje to zinterpretować).

Nawet jeśli się nie pojawi, wydaje się, że nie jest to poprawna składnia do komentowania kodu HTML.

Yves Lange
źródło
Chociaż może to być prawda, dlaczego Chrome faktycznie sprawia, że ​​te tagi są komentowane, ale teraz doctype.
Andrew
4
Sugestia (nie jestem pewien, tylko zgaduję): próbuje zinterpretować> nie mogę> skomentował?
Yves Lange
Wydaje mi się to wystarczająco rozsądne.
Andrew
Ponownie (przepraszam, że nalegam), ale pamiętaj, że to tylko przypuszczenie!
Yves Lange