Ändert HTML5 den Standard für HTML-Kommentare?

131

Kürzlich habe ich festgestellt, dass es in HTML5 möglicherweise eine neue Art des Kommentierens gibt.

Anstelle der typischen <!-- -->mehrzeiligen Kommentare, über die ich gelesen habe, dachte ich, ich hätte bemerkt, dass meine IDE regelmäßig <!div >auskommentiert wurde. Also habe ich es ausprobiert und zu meiner Überraschung hatte Chrome dieses Tag auskommentiert. Es wurde nur das Tag und nicht der Inhalt der Div auskommentiert, daher musste ich die Annäherung <!/div>auskommentieren, um zu vermeiden, dass andere Divs geschlossen werden.

Ich habe einen anderen getestet und es scheint, dass durch das Platzieren eines Ausrufezeichens vor der Öffnung eines Tags, dieses Symbol <, dieses Tag auskommentiert wird.

Ist das eigentlich neu? Ist es schlechte Praxis? Es ist eigentlich sehr praktisch, aber ist es noch praktisch (wenn nicht neu)?

Bearbeiten Sie zusätzliche Details: Obwohl ein Syntaxfehler oder Fehlinterpretationen dieser bestimmten Syntax ein guter Grund sind, wie kommt es, dass Chrome sie tatsächlich als vollständige Kommentare rendert?

Der Code lautet wie folgt :

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

Und dann wird es gerendert als :

<!--div displayed--> some text here that is still displayed <!--/div-->
Andrew
quelle
19
Wahrscheinlicher ist es einfach ein Syntaxfehler und / oder ein Unsinn-Tag und wird daher ignoriert.
Täuschung
@deceze Ich habe etwas erwartet, dass Browser nachsichtig sein können, wie sie HTML nach weniger strengen Regeln rendern.
Andrew
1
@ Lemony-Andrew Welche IDE macht das? Entsprechend der ausgewählten Antwort könnten wir dies als Problem melden (oder es beheben, wenn es Open Source ist).
Dereckson
1
@Derecksonit Ich habe meine IDE nach der offiziellen Antwort noch einmal überprüft, um sicherzustellen, dass meine Augen mich nicht täuschen. Es war zufällig so, dass es nicht de facto auskommentiert wurde, sondern die normale Textfarbe, die ähnlich war. Das war alles Zufall.
Andrew

Antworten:

196

Es gibt keinen neuen Standard für Kommentare in HTML5. Die einzig gültige Kommentarsyntax ist noch <!-- -->. Aus Abschnitt 8.1.6 von W3C HTML5 :

Kommentare müssen mit der vierstelligen Sequenz U + 003C WENIGER ALS ZEICHEN, U + 0021 EXCLAMATION MARK, U + 002D HYPHEN-MINUS, U + 002D HYPHEN-MINUS ( <!--) beginnen.

Die <!Syntax stammt aus dem SGML-DTD-Markup, das nicht Teil von HTML5 ist. In HTML5 ist es für Kommentare, CDATA-Abschnitte und die DOCTYPE-Deklaration reserviert. Ob diese Alternative eine schlechte Praxis ist, hängt daher davon ab, ob Sie die Verwendung (oder schlimmer noch die Abhängigkeit von) veraltetem Markup als schlechte Praxis betrachten.

Validator.nu nennt einen "falschen Kommentar". - was bedeutet, dass es wie ein Kommentar behandelt wird, obwohl es kein gültiger Kommentar ist. Dies dient vermutlich der Abwärtskompatibilität mit SGML-basiertem Pre-HTML5 mit Markup-Deklarationen in der Form <!FOO>, sodass ich dies nicht als neu bezeichnen würde. Der Grund , warum sie behandelt sind wie Kommentare, da SGML Markup - Deklarationen waren besondere Erklärungen nicht dazu gedacht , gemacht werden, aber da sie sinnlos in HTML5 (mit den oben genannten Ausnahmen) sind, so weit der HTML5 DOM betreffen sie sind nichts anderes als Kommentare .

Die folgenden Schritte in Abschnitt 8.2.4 führen zu dieser Schlussfolgerung, die Chrome anscheinend genau befolgt :

  1. 8.2.4.1 Datenstatus :

    Verbrauchen Sie das nächste Eingabezeichen:

    "<" (U + 003C) Wechseln Sie
    in den Status "Tag geöffnet".

  2. 8.2.4.8 Tag geöffnet Zustand :

    Verbrauchen Sie das nächste Eingabezeichen:

    "!" (U + 0021) Wechseln Sie
    in den offenen Zustand der Markup-Deklaration.

  3. 8.2.4.45 Offener Zustand der Markup-Deklaration :

    Wenn die nächsten beiden Zeichen beide "-" (U + 002D) Zeichen sind, verbrauchen Sie diese beiden Zeichen, erstellen Sie ein Kommentartoken, dessen Daten die leere Zeichenfolge sind, und wechseln Sie in den Kommentarstartstatus.

    Wenn die nächsten sieben Zeichen für das Wort "DOCTYPE" nicht zwischen Groß- und Kleinschreibung unterscheiden, verwenden Sie diese Zeichen und wechseln Sie in den Status DOCTYPE.

    Andernfalls, wenn es einen angepassten aktuellen Knoten gibt und dieser kein Element im HTML-Namespace ist und die nächsten sieben Zeichen zwischen Groß- und Kleinschreibung für die Zeichenfolge "[CDATA [" (die fünf Großbuchstaben "CDATA" mit einem U +) unterscheiden 005B LEFT SQUARE BRACKET-Zeichen vor und nach), verbrauchen Sie diese Zeichen und wechseln Sie in den Status des CDATA-Abschnitts.

    Andernfalls handelt es sich um einen Analysefehler. Wechseln Sie in den Status "Scheinkommentar". Das nächste Zeichen, das gegebenenfalls verbraucht wird, ist das erste Zeichen, das im Kommentar enthalten ist.

    Beachten Sie, dass nur dann in den <!--Startstatus des Kommentars gewechselt werden soll , wenn die Reihenfolge der gefundenen Zeichen stimmt . Andernfalls handelt es sich um einen falschen Kommentar. Dies spiegelt wider, was in Abschnitt 8.1.6 oben angegeben ist.

  4. 8.2.4.44 Scheinkommentarstatus :

    Verbrauchen Sie jedes Zeichen bis einschließlich des ersten ">" (U + 003E) -Zeichens oder des Dateiende (EOF), je nachdem, was zuerst eintritt. Geben Sie ein Kommentartoken aus, dessen Daten die Verkettung aller Zeichen sind, beginnend mit und einschließlich des Zeichens, das die Zustandsmaschine veranlasst hat, in den gefälschten Kommentarstatus zu wechseln, bis einschließlich des Zeichens unmittelbar vor dem zuletzt verbrauchten Zeichen (dh bis zum Zeichen) kurz vor dem U + 003E- oder EOF-Zeichen), jedoch mit allen U + 0000 NULL-Zeichen, die durch U + FFFD REPLACEMENT CHARACTER-Zeichen ersetzt wurden. (Wenn der Kommentar am Ende der Datei (EOF) gestartet wurde, ist das Token leer. Ebenso ist das Token leer, wenn es durch die Zeichenfolge " <!>" generiert wurde .)

    Im Klartext, diese abwechselnd <!div displayed>in <!--div displayed-->und <!/div>in <!--/div-->, genau wie in der Frage beschrieben.

Abschließend können Sie wahrscheinlich erwarten, dass sich andere HTML5-kompatible Parser genauso verhalten wie Chrome.

BoltClock
quelle
11
Vielen Dank, dass Sie sich die Zeit genommen haben, die offiziellen Gründe für diesen Vorfall zu finden. Es klärt die Dinge ziemlich auf und gibt meiner falschen Annahme viel Gültigkeit.
Andrew
2
Es ist seltsam, wie die HTML5-Spezifikation Regeln zum Verarbeiten von "ungültigen" Inhalten enthält. Wenn es ungültig ist, sollte es überhaupt nicht verarbeitet werden.
Arturo Torres Sánchez
2
So waren HTML und Web-Sprachen früher - streng. Der Grund, warum eine falsche Codestruktur so nachsichtig verarbeitet wird, liegt in Websites mit besserer Qualität. Je mehr Websites ein Browser mit falscher Syntax anzeigen und korrekt anzeigen kann, desto zufriedener sind die Endbenutzer. Die allgemeinen Autoren von Webstandards (meistens w3, nicht der andere) stellten fest, dass die Browser-Anbieter aus diesem Grund die Richtlinien nicht befolgten. HTML5 kam und baute nur auf der Idee auf, Design offiziell milder zu machen.
Andrew
3
@ ArturoTorresSánchez: XHTML hat den Ansatz "ungültiger Inhalt = Fehler" ausprobiert und ist kläglich gescheitert. Außerdem heißt es in den Regeln im Grunde: "Analysieren Sie diesen falschen Kommentar nicht, behandeln Sie ihn einfach als Kommentar und analysieren Sie das nächste gültige Element, das Sie finden." Abhängig von Ihrer Sichtweise macht HTML5 entweder nicht das, was Sie wollen, weil das, was Sie wollen, scheiße ist, oder HTML5 macht genau das, was Sie wollen.
Slebetman
1
@ ArturoTorresSánchez: In der Vergangenheit erwarteten HTML-Server, dass jeder Browser dieselbe Zeichenfolge erhält. Obwohl es möglich ist, ein Dokumentformat so zu gestalten, dass ältere Parser Dokumente unterscheiden können, die "optionale" neuere Funktionen verwenden, die ältere Parser ignorieren sollten, Dokumente, die wichtige neuere Funktionen verwenden und von Browsern abgelehnt werden sollten, die dies nicht tun. Um sie und Dokumente, die einfach nur ungültig sind, nicht zu unterstützen, wurde so etwas in den Gründungsjahren nicht mit HTML gemacht.
Supercat
12

Ich denke nicht, dass dies eine gute Angewohnheit ist, da dies <!für Markup-Erklärungen wie steht <!DOCTYPE. Sie denken also, es ist kommentiert (nun ... der Browser wird versuchen, es zu interpretieren).

Auch wenn es nicht angezeigt wird, scheint dies nicht die richtige Syntax zum Kommentieren von HTML-Code zu sein.

Yves Lange
quelle
Das mag zwar zutreffen, aber wie kommt es, dass Chrome diese Tags tatsächlich auskommentiert, aber jetzt den Doctype.
Andrew
4
Vorschlag (ich bin nicht sicher, rate nur): versucht zu interpretieren> kann nicht> kommentiert?
Yves Lange
Das erscheint mir vernünftig genug.
Andrew
Nochmals (Entschuldigung, darauf zu bestehen), aber seien Sie sich bewusst, dass dies nur eine Vermutung ist!
Yves Lange