Einige HTML 1- Abschluss-Tags sind optional , z.
</HTML>
</HEAD>
</BODY>
</P>
</DT>
</DD>
</LI>
</OPTION>
</THEAD>
</TH>
</TBODY>
</TR>
</TD>
</TFOOT>
</COLGROUP>
Hinweis: Nicht zu verwechseln mit schließenden Tags, deren Aufnahme verboten ist, dh:
</IMG>
</INPUT>
</BR>
</HR>
</FRAME>
</AREA>
</BASE>
</BASEFONT>
</COL>
</ISINDEX>
</LINK>
</META>
</PARAM>
Hinweis: xhtml
unterscheidet sich von HTML. xhtml ist eine Form von xml, für die jedes Element ein schließendes Tag haben muss. Ein End - Tag kann verboten in html, noch zwingend in xhtml
.
Sind die optionalen schließenden Tags
- idealerweise enthalten , aber wir akzeptieren sie, wenn Sie sie vergessen haben, oder
- Idealerweise nicht enthalten, aber wir akzeptieren sie, wenn Sie sie eingeben
Mit anderen Worten, sollte ich sie einschließen oder sollte ich sie nicht einschließen?
In der HTML 4.01-Spezifikation wird davon gesprochen, dass das Schließen von Element-Tags optional ist , es wird jedoch nicht angegeben, ob es vorzuziehen ist, sie einzuschließen, oder ob es vorzuziehen ist, sie nicht einzuschließen.
Andererseits sagt ein zufälliger Artikel über DevGuru :
Das Ending-Tag ist optional. Es wird jedoch empfohlen, dass es enthalten ist.
Der Grund, den ich frage, ist, dass Sie nur wissen, dass es aus Kompatibilitätsgründen optional ist. und sie hätten sie gemacht ( obligatorisch | verboten ), wenn sie hätten können.
Anders ausgedrückt: Was hat HTML 1, 2, 3 in Bezug auf diese jetzt optionalen, schließenden Tags getan? Was macht HTML 5? Und was soll ich tun?
Hinweis
Einige Elemente in HTML dürfen keine schließenden Tags haben. Sie können damit nicht einverstanden sein, aber das ist die Spezifikation, und es steht nicht zur Debatte. Ich frage nach optionalen schließenden Tags und was die Absicht war.
Fußnoten
1 HTML 4.01
</p>
Tags und das zweite lässt sie weg !/>
, z. B.<meta charset="utf-8" />
obwohl<meta charset="utf-8">
HTML5 gültig ist.<meta charset="utf-8" />
ist ungültig HTML, muss es sein<meta charset="utf-8">
. Auf der anderen Seite<meta charset="tuf-8">
ist xhtml ungültig , es muss sein<meta charset="utf-8" />
<meta charset="UTF-8"/>
mit dem schließenden Tag verwendet werden soll. Wie könnten sonst Polyglot oder XHTML jemals als HTML5 und XML validiert werden?Antworten:
Die optionalen sind alle diejenigen, die semantisch klar sein sollten, wo sie enden, ohne das End-Tag zu benötigen. EG
<li>
impliziert jeweils ein,</li>
wenn es kein direkt davor gibt.Allen verbotenen End-Tags würde sofort das End-Tag folgen, so dass es überflüssig wäre,
<img src="blah" alt="blah"></img>
jedes Mal etwas eingeben zu müssen .Ich verwende fast immer die optionalen Tags (es sei denn, ich habe einen sehr guten Grund, dies nicht zu tun), da sie zu besser lesbarem und aktualisierbarem Code führen.
quelle
<LI>
ist wie eine Kugel. Niemand würde einen ganzen Punkt mit Aufzählungszeichen einpacken wollen<LI>...</LI>
. Auf diese WeiseLI
stimmt das überein, was die Leute natürlich während des Markups schreiben würden. Sames gilt für eine Absatzmarke (<P>
), in der Textverarbeitung Sie hinzufügen Absatzmarke am Anfang eines Absatzes; und nicht am Ende eines jeden auch. In dieser Interpretation sind die schließenden Tags optional, da keine normale Person daran denken würde, sie zu haben. Außerdem hat das Element selbst keinen Inhalt - das Element ist der Inhalt.Es gibt Fälle, in denen explizite Tags helfen, aber manchmal ist es unnötige Pedanterie.
Beachten Sie, dass die HTML-Spezifikation klar angibt, wann das Auslassen von Tags gültig ist, sodass dies nicht immer ein Fehler ist.
Zum Beispiel brauchen Sie nie
</body></html>
. Niemand erinnert sich jemals daran, dies<tbody>
explizit auszudrücken (bis zu dem Punkt, dass XHTML Ausnahmen dafür gemacht hat).Sie brauchen es nicht, es
</head><body>
sei denn, Sie haben DOM-manipulierende Skripte, die tatsächlich suchen<head>
(dann ist es besser, sie explizit zu schließen, da Regeln für das implizite Ende von<head>
Sie überraschen könnten).Verschachtelte Listen sind eigentlich besser ohne
</li>
, weil es dann schwieriger ist, einen fehlerhaftenul > ul
Baum zu erstellen .Gültig:
Ungültig:
Beachten Sie auch, dass End-Tags impliziert sind, unabhängig davon, ob Sie versuchen, alle Elemente zu schließen oder nicht. Durch das Setzen von End-Tags wird das Parsen nicht automatisch robuster:
wird analysiert als:
Dies kann nur hilfreich sein, wenn Sie Dokumente validieren.
quelle
<p>foo <p>bar</p> baz</p>
nicht als zwei verschachteltep
Tags analysiert ?<P>
Element keine Elemente auf Blockebene enthalten kann und<P>
ein Element auf Blockebene ist. From ( w3.org/TR/REC-html40/struct/text.html#edef-P ) "Das P-Element stellt einen Absatz dar. Es darf keine Elemente auf Blockebene enthalten (einschließlich P selbst)."block
Anzeige unterscheidet sich grundlegend vom HTML-Inhalt auf Blockebene (es kommt nur vor, dass die meisten HTML-Elemente auf Blockebene standardmäßig als CSS-Blöcke angezeigt werden).<t>
wird nicht so funktionieren<title>
.Ich füge hier einige Links hinzu, um Ihnen bei der Geschichte von HTML zu helfen und die verschiedenen Widersprüche zu verstehen. Dies ist nicht die Antwort auf Ihre Frage, aber Sie werden mehr wissen, nachdem Sie diese verschiedenen Zusammenfassungen gelesen haben.
Einige Auszüge aus Dive Into HTML5 :
quelle
Das ist eine interessante Schlussfolgerung. Ich habe gelesen, dass fast immer, wenn ein Tag zuverlässig abgeleitet werden kann, das Tag optional ist. Das Design legt nahe, dass die Absicht darin bestand, das Schreiben schnell und einfach zu gestalten.
Die DTD für HTML 2 ist in den RFC eingebettet , der zusammen mit der ursprünglichen HTML-DTD überall optionale Start- und End-Tags enthält.
HTML 3 wurde aufgegeben (dank der Browserkriege) und durch HTML 3.2 ersetzt (das den damaligen aktuellen Status des Webs beschreiben sollte).
HTML 5 war von Anfang an darauf ausgerichtet, "die Kuhpfade zu ebnen".
Ah, das ist subjektiv und argumentativ :)
Einige Leute denken, dass explizite Tags für die Lesbarkeit und Wartbarkeit besser sind, da sie vor den Augen des Lesers stehen.
Einige Leute denken, dass abgeleitete Tags für die Lesbarkeit und Wartbarkeit besser sind, da sie den Editor nicht überladen.
quelle
Die Antwort auf diese Frage finden Sie im W3C-Arbeitsentwurf: http://www.w3.org/TR/html5/syntax.html#syntax-tag-omission
Es ist eine Frage des Stils. Ich versuche, End-Tags niemals wegzulassen, weil es mir hilft, streng zu sein und keine notwendigen Tags wegzulassen.
quelle
Wenn es überflüssig ist, lassen Sie es weg.
Wenn es einem Zweck dient (sogar einem scheinbar trivialen Zweck, wie dem Beruhigen Ihrer IDE oder dem Beruhigen Ihrer Augen), lassen Sie es in.
In einer genau definierten Spezifikation werden selten optionale Elemente angezeigt, die das Verhalten nicht beeinflussen. Mit Ausnahme von "Kommentaren" natürlich. Die HTML-Spezifikation ist jedoch weniger eine Entwurfsspezifikation als vielmehr ein Dokument über den Stand der aktuellen Hauptimplementierungen. Wenn ein Element in HTML optional ist und keinen Zweck zu erfüllen scheint, können wir davon ausgehen, dass die optionale Natur lediglich die Dokumentation einer Eigenart in einem bestimmten Browser ist.
Wenn Sie sich den oben verlinkten HTML-5-RFC-Abschnitt ansehen, sehen Sie, dass die optionalen Tags seltsamerweise mit dem Vorhandensein von Kommentaren verknüpft sind! Das sollte Ihnen sagen, dass die Autoren keine Designhüte tragen. Sie spielen stattdessen das Spiel "Dokumentieren Sie die Macken" in wichtigen Implementierungen. Daher können wir die Spezifikation in dieser Hinsicht nicht allzu ernst nehmen.
Die Lösung lautet also: Schwitzen Sie nicht. Gehen Sie zu etwas über, das wirklich wichtig ist. :) :)
quelle
Ich denke, die beste Antwort ist das Schließen von Tags zur Lesbarkeit oder Fehlererkennung. Wenn Sie jedoch viel generiertes HTML (z. B. Datentabellen) haben, können Sie erhebliche Bandbreite sparen, indem Sie optionale Tags weglassen.
quelle
Meine Empfehlung ist, dass Sie die meisten optionalen Close-Tags und alle optionalen Attribute, mit denen Sie durchkommen können, weglassen. Viele IDEs werden sich beschweren, so dass Sie möglicherweise nicht in der Lage sind, einige davon wegzulassen, aber es ist im Allgemeinen besser für kleinere Dateigrößen und weniger Unordnung. Wenn Sie Codegeneratoren haben, lassen Sie dort definitiv End-Tags weg, da Sie dadurch eine gute Größenreduzierung erzielen können. Normalerweise spielt es auf die eine oder andere Weise keine Rolle.
Aber wenn es darauf ankommt, dann handeln Sie danach. Bei einigen meiner jüngsten Arbeiten konnte ich die Größe meines gerenderten HTML-Codes von 1,5 MB auf 800 KB reduzieren, indem ich die meisten generierten End- und redundanten Wertattribute für das offene Tag eliminierte, bei dem der Text des Elements mit dem Text identisch war Wert. Ich habe ungefähr 200 Tags. Ich könnte dies auf eine ganz andere Weise implementieren, aber das wäre mehr Arbeit ($$$), so dass ich die Seite auf einfache Weise reaktionsfähiger machen kann.
Nur aus Neugier stellte ich fest, dass ich 20 KB sparen könnte, wenn ich Anführungszeichen um Attribute entferne, die sie nicht benötigen, aber meine IDE (Visual Studio) mag es nicht. Ich war auch überrascht, dass die wirklich lange ID, die ASP.NET generiert, 20% meiner Datei ausmacht.
Die Idee, dass wir jemals einen relevanten Bruchteil von HTML streng gültig bekommen könnten, war in erster Linie falsch. Tun Sie also, was für Sie und Ihre Kunden am besten funktioniert. Die meisten Tools, die ich jemals gesehen oder verwendet habe, sagen, dass sie xhtml generieren, aber sie funktionieren nicht wirklich zu 100%, und die strikte Einhaltung hat sowieso keinen Vorteil.
quelle
</p>
oder</li>
) ist gemäß der HTML-Spezifikation vollkommen in Ordnung. Wenn der Browser das nicht versteht, liegt ein Problem mit dem Browser vor.Persönlich bin ich ein Fan von XHTML und wie Ghoppe: "Ich versuche, End-Tags niemals wegzulassen, weil es mir hilft, streng zu sein und keine notwendigen Tags wegzulassen."
aber
Wenn Sie absichtlich HTML 4.n verwenden, kann man nicht behaupten, dass das Einschließen von HTML 4.n das Konsumieren des Dokuments erleichtert, da der Begriff der Wohlgeformtheit im Gegensatz zur Gültigkeit ein XML-Konzept ist und Sie diesen Vorteil verlieren, wenn Sie bestimmte enge Tags verbieten . Das einzige Problem wird also die Gültigkeit ... und wenn es ohne sie noch gültig ist ... können Sie genauso gut die Bandbreite sparen, nein?
quelle
Die Verwendung von End-Tags erleichtert den Umgang mit Fragmenten, da deren Verhalten nicht von Geschwisterelementen abhängt. Dieser Grund allein sollte überzeugend genug sein. Beschäftigt sich jemand mehr mit monolithischen HTML-Dokumenten?
quelle
In einigen Sprachen mit geschweiften Klammern wie C # können Sie die geschweiften Klammern um eine if-Anweisung weglassen, wenn sie nur zwei Zeilen lang ist. beispielsweise...
if ([Bedingung])
[Code]
aber das kannst du nicht machen ...
if ([Bedingung])
[Code]
[Code]
Die dritte Zeile ist nicht Teil der if-Anweisung. Es beeinträchtigt die Lesbarkeit, und Fehler können leicht eingeführt und schwer zu finden sein.
Aus den gleichen Gründen schließe ich alle Tags. Tags wie das img-Tag müssen noch geschlossen werden, nur nicht mit einem separaten schließenden Tag.
quelle
Wenn Sie einen HTML-Parser schreiben würden, wäre es einfacher, HTML zu analysieren, das optionale schließende Tags enthält, oder HTML, das dies nicht tut? Ich denke, die optionalen schließenden Tags würden es einfacher machen, da ich nicht ableiten müsste, wo sich das schließende Tag befinden sollte.
Aus diesem Grund füge ich immer die optionalen schließenden Tags hinzu - in der Theorie, dass meine Seite möglicherweise schneller gerendert wird, da ich weniger Arbeit für den HTML-Parser des Browsers erstelle.
quelle
<li>
Tag ohne schließendes Tag einfügen, muss der Browser irgendwann entscheiden, wo das Element endet, und so tun, als hätten Sie an diesem Punkt ein End-Tag eingefügt. Dies mag eine relativ triviale Menge an Logik sein, aber "einige" sind immer noch mehr als "keine", und ich halte es nicht für unangemessen anzunehmen, dass das Weglassen optionaler End-Tags mehr Arbeit für den Browser bedeutet, als sie einzuschließen.</table>
und Ihr Stapel enthält<table><tbody><tr><td>
, können Sie einfach alles schließen, bis Sie mit dem übereinstimmen<table>
. Ähnliches gilt für das Öffnen<p>
in einem Nicht-Uhr-Kontext. Aber es kann viel schwierigere Fälle geben, ich weiß es nicht.Tun Sie alles, was Sie für besser lesbar und wartbar halten.
Persönlich wäre ich immer geneigt zu schließen
<td>
und<tr>
, aber ich würde mich nie darum kümmern<li>
.quelle
<td>
und<li>
das macht dich nicht störend<li>
? Für mich gibt es kaum einen Unterschied.Verwenden Sie für verbotene Schließarten folgende Syntax:
<img />
Mit dem/>
, um das in XML akzeptierte Tag zu schließenquelle