Ist Schreiben selbstschließenden Tags für Elemente, die nicht traditionell leer schlechte Praxis?

StackOverflow https://stackoverflow.com/questions/348736

  •  20-08-2019
  •  | 
  •  

Frage

Ich habe jQuery bemerkt (oder ist es Firefox) werden einige meiner <span class="presentational"></span> into <span class="presentational" /> drehen

Nun meine Frage ist, ist das in Ordnung meinen Markup wie diese zu schreiben? Werden alle Browser ersticken es?

Ich persönlich denke, es ist sauberer aussieht <span class="presentational" /> zu tun, wenn es leer sein wird.

War es hilfreich?

Lösung

ich Ihre Frage gehe davon hat mit dem roten Schrägstrich auf selbstschließenden Elemente zu tun, wenn Sie Quelle in Firefox anzuzeigen. Wenn ja, haben Sie in einer der heftigsten gestolpert, doch gleichzeitig passiven aggressiven Debatten im Browser-Herstellern vs. Web-Entwickler Kriege. XHTML ist nicht nur ein Dokument Markup. Es geht auch darum, wie Dokumente gemeint sind über das Internet bedient werden.

Bevor ich beginne; Ich versuche hier Seiten schwer, nicht zu nehmen.

Die XHTML 1.1 Spezifikation sagt, dass ein Web-Server XHTML mit einem Content-Type application / xhtml + xml dienen sollten. Firefox ist Vereinzelung jene folgende Schrägstriche als ungültig, weil Ihr Dokument als text / html bedient wird, anstatt application / xhtml + xml. Nehmen Sie diese beiden Beispiele; identischer Markup ein, das als application / xhtml + xml, die andere als text / html.

http://alanstorm.com/testbed/xhtml-as-html.php

http://alanstorm.com/testbed/xhtml-as-xhtml.php

Firefox-Flags des Schrägstrich in dem Meta-Tag als ungültig für das Dokument mit Text / html serviert und gültig für das Dokument serviert mit application / xhtml + xml.

Warum ist dies Umstrittenes

Um einen Browser-Entwickler, der Punkt von XHTML ist, dass Sie Ihr Dokument als XML behandeln können, was bedeutet, wenn jemand etwas sendet, die nicht gültig ist, die Spezifikation sagt, dass Sie es nicht analysieren müssen. Also, wenn ein Dokument als application / xhtml + xml serviert wird und nicht gut ausgebildet Inhalt wird der Entwickler erlaubt zu sagen, „nicht mein Problem“. Sie können diese in Aktion sehen hier

http://alanstorm.com/testbed/xhtml-not-valid.php

Wenn ein Dokument als text / html serviert wird, Firefox es als das gute alte HTML-Dokument behandelt und verwendet das Verzeihen, reparieren es für Sie, Parsing-Routinen

http://alanstorm.com/testbed/xhtml-not -Gültig-as-html.php

Also, um einen Browser-Hersteller, XHTML, das als text / html ist lächerlich, weil es nie als XML durch den Browser-Rendering-Engine behandelt wird.

Ein Bündel von Jahren, Web-Suche Entwickler mehr sein, als Tag-Affen (Disclaimer: Ich schließe mich als einer von ihnen) suchte nach Möglichkeiten, bewährtes Verfahren zu entwickeln, das nicht dreimal verschachtelte Tabellen beteiligt hat, aber erlaubt noch ein zwingende Design-Erfahrung. Sie / wir eingeklinkt auf XHTML / CSS, weil das W3C sagte dies die Zukunft ist, und die einzige andere Wahl war eine Welt, in der ein einzelnen Anbieter (Microsoft), um die De-facto-Markup-Spec gesteuert. Das eigentliche Übel da zu sein, die einziger Anbieter , und nicht so sehr Microsoft. Ich schwöre es.

Also, wo ist der Streit? Es gibt zwei Probleme mit application / xhtml + xml. Der erste ist der Internet Explorer. Es gibt eine Legacy-Bug / Feature in IE, wo Inhalte diente als application / xhtml + xml wird den Benutzer auffordern, das Dokument herunterzuladen. Wenn Sie versucht, die xhtml-as-xhtml.php oben mit IE aufgeführt zu besuchen, die wahrscheinlich ist, was passiert ist. Das bedeutet, wenn Sie application / xhtml + xml verwenden möchten, müssen Sie Browser sniff für IE , überprüfen Sie die Header akzeptiert und nur application / xhtml + xml zu diesen Browsern, die es akzeptieren dienen. Dies ist nicht so trivial , wie es klingt richtig zu machen, und ging auch gegen den „write once“ -Prinzip, dass der Web-Entwickler für strebt.

Das zweite Problem ist die Härte von XML. Dies ist wiederum ein jene Flamme anfällig Probleme, aber manche Leute es gibt, die einen einzigen schlechten Tag denken, oder einzelne Zeichen nicht ordnungsgemäß in einem Benutzer codiert sollten nicht nicht dazu führen, das Dokument sie wollen sehen zu. Mit anderen Worten, ja, sagt der spec sollten Sie die Verarbeitung von XML zu stoppen, wenn es nicht gut ausgebildet ist, aber der Benutzer über die spec kümmert sich nicht darum, sie kümmern, dass ihre Katze Webseite gebrochen ist.

Hinzufügen von noch mehr Benzin zu dem Thema ist die XHTML 1.0 (nicht 1.1) Spezifikation sagt, dass XHTML-Dokumente können als text / html serviert werden, vorausgesetzt, bestimmte Kompatibilitätsrichtlinien befolgt werden. Dinge wie das img-Tag ist selbstschließend und dergleichen. Das Schlüsselwort hier ist können . In RFC rel="nofollow sprechen können Mittel optional. Firefox hat sich entschieden, nicht Dokumente mit einem XHTML-Doctype serviert zu behandeln, sondern ein Inhaltstyp text / html als XHTML. Allerdings wird der W3C-Validator glücklich, diese Dokumente als gültig melden.

Ich werde den Leser überlassen, den gleichzeitigen Wunder / Horror einer Kultur, darüber nachzudenken, die ein Dokument schreibt zu definieren, was sie durch das Wort bedeuten kann .

Moving Forward

Schließlich ist das, was die ganze HTML 5 Sache geht. XHTML wurde eine solche politische heiße Kartoffel, die eine Gruppe von Leuten, die die Sprache nach vorn entschieden bewegen wollte in eine andere Richtung zu gehen. Sie produzierten eine Spezifikation für HTML 5. Das derzeit in der W3C gehasht geführt wird, und erwartet, irgendwann in den nächsten zehn Jahren zu beenden. In der Zwischenzeit Browser-Hersteller sind Kommissionierung und Features aus dem in-progress spec Auswahl und deren Umsetzung.

Updates aus den Anmerkungen

In den Kommentaren, Alex dass weist darauf hin, wenn Sie etwas schnüffeln gehen, sollten Sie prüfen, die Accept header zu sehen, ob application / xhtml + xml vom Benutzerprogramm akzeptiert wird.

Das ist absolut richtig. Im Allgemeinen, wenn Sie schnüffeln gehen, schnüffelt für die Funktion, nicht für den Browser.

Andere Tipps

Eine Ergänzung zu den anderen Antworten: in IE, Elementen wie <span /> in Ihrem Aufschlag mit wird alle Arten von Problemen mit DOM-Traversal-Methoden in JavaScript verursacht . Haben Sie einen Blick auf die folgende XHTML-Dokument:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Test</title>
    <script type="text/javascript">
        function show() {
            var span = document.getElementById("span");
            alert(span.innerHTML);
        }
    </script>
</head>
<body onload="show();">
<p id="p1">Paragraph containing some text followed by
           an empty span<span id="span"/></p>
<p id="p2">Second paragraph just containing text</p>
</body>
</html>

Die Idee ist, dass, wenn die Seite geladen wird, wird die JavaScript einen Verweis auf die leere Spanne erhalten und seinen HTML-Inhalt angezeigt werden soll. Das wird ein leerer String, richtig? Nicht in IE wird es nicht. Im IE Sie alle Inhalte nach der Spanne im gesamten Dokument erhalten:

</P>
<P id=p2>Second paragraph just containing text</P>

Auch zeigt die zweite <p> in der childNodes Sammlung auf der Spannweite. Das gleiche <p> ist auch in der childNodes Sammlung des Körpers, was bedeutet, ein Knoten effektiv mehrere Eltern haben kann. Das ist nicht sehr gute Nachricht für Skripte, die auf Durchlaufen des DOM verlassen.

Ich habe gebloggt diesem .

Ja. Es ist. Es wird Probleme in bestimmten Fällen für alten Browser führen.

<script type='text/javascript' src='script.js' />

In diesem Fall wird der alte Browser versteht vielleicht nicht, dass <script> Tag beendet ist.

Diente als application / xhtml + xml, bedeutet ein span-Element ohne Inhalt erstellen.

Served als text / html, bedeutet ein span-Element schaffen, in dem der Inhalt des Elements dieses Tag folgen, bis der Tag angetroffen wird, oder einem anderen Tag (oder EOF), die das Element implizit geschlossen ist angetroffen. das heißt in diesem Fall die gleiche Bedeutung wie .

Neben: HTML 5 definiert sowohl und HTML und XHTML Serialisierungen, damit es nicht zu diesem Problem eine oder andere Weise beeinflussen. Es erfordert, wie XHTML 1.1, dass XHTML als application / xhtml + xml bedient werden, im Gegensatz zu XHTML 1.0. obwohl in der Tat ändert dies nichts als alle Browser eine beliebige Version von XHTML behandeln diente als text / html als Tag Suppe.

Wert auch unter Hinweis darauf ist, dass eine <?xml ...?> Erklärung vor dem Doctype IE wirft in Quirks-Modus.

Siehe Hinweis auf das Thema der XHMTL-Arbeitsgruppe bilden: http: // www.w3.org/TR/xhtml-media-types/

Kurz gesagt - es ist in Ordnung, wenn Ihr XHTML als XHTML behandelt werden wird. Wenn Sie es so zu tun werden, ist HTML (was Sie tun müssen, wenn Sie es wollen von Internet Explorer (einschließlich Version 8, die zum Zeitpunkt des Schreibens) spätestens dann müssen Sie springen durch Reifen geladen werden).

Die Reifen ausreichend sind ärgerlich, dass ich die meisten Leute HTML 4.01 kleben würde empfehlen.

Generell ist es kein Problem, eine Abkürzung für leere Elemente zu verwenden, aber es gibt einige Ausnahmen, bei denen es zu Problemen führen kann.

<script> ist ein wichtiges Thema, das mit </script> geschlossen werden muss, um Probleme zu vermeiden.

Ein weiterer Grund ist <meta>, die viel besser mit Spinnen geschrieben als <meta></meta> statt <meta />

funktioniert

Nicht gerade die Frage, aber miteinander verbundene, in Bezug auf der Formatierung, IE-Versionen haben Probleme mit nur leeren Elementen wie <div></div> oder <div />. In diesem Fall wird <div>&nbsp;</div> erforderlich, um die Formatierung zu erhalten.

Es soll ausdrücklich gesagt wird, dass es keine Selbst geschlossen Tags in HTML ist, so, wenn ein Browser XHTML als HTML zu behandeln entscheidet, wird es nicht erkennen, dass der Tag geschlossen ist. Kein Problem für Tags, die in HTML geschlossen werden müssen, nicht wie <img>, aber offensichtlich schlecht mit Tags wie <span>.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top