DokumentumfangDieser Artikel behandelt den Moduswechsel für Firefox und andere Gecko-basierte Browser, Safari, Chrome und andere Webkit-basierte Browser, Opera, Konqueror, Internet Explorer für Mac, Internet Explorer für Windows und den eingebetteten IE-Browser. Vermeiden Sie die Erwähnung des Namens der Browser-Engine. Nennen Sie stattdessen den Namen des bekanntesten Browsers, der diese Engine verwendet. Dieser Artikel konzentriert sich auf den Mechanismus der Modusauswahl und nicht auf die Dokumentation des genauen Verhaltens jedes Modus. ModellDie verschiedenen Modi sind: Modus mit Inhaltstyp Text/HTMLDie Modusauswahl für Text-/HTML-Inhalte basiert auf Doctype-Sniffing (wird später in diesem Artikel besprochen). Im IE8 hängt der Modus auch von anderen Faktoren ab. Allerdings ist in IE8 der Modus für Nicht-Intranet-Sites, die nicht auf der von Microsoft bereitgestellten Blacklist stehen, standardmäßig vom Dokumenttyp abhängig. Es kann nicht genug betont werden, dass das genaue Verhalten der Modi von Browser zu Browser unterschiedlich ist, auch wenn sie in diesem Artikel einheitlich besprochen werden.
Modus mit Inhaltstyp application/xhtml+xml (XML-Modus)In Firefox, Safari, Chrome und Opera löst der HTTP-Inhaltstyp application/xhtml+xml (nicht das Metaelement oder der Doctype!) den XML-Modus aus. Im XML-Modus versuchen Browser, XML-Dokumente spezifikationsgerecht zu verarbeiten, soweit dies im jeweiligen Browser möglich ist. IE6, 7 und 8 unterstützen application/xhtml+xml nicht, ebenso wenig wie Mac IE5. Im WebKit-basierten Nokia S60-Browser löst der HTTP-Inhaltstyp application/xhtml+xml den XML-Modus nicht aus, da der Schwerpunkt in mobilen Walled Gardens auf der Kompatibilität mit nicht standardmäßigen Inhalten liegt. (Ältere „mobile Browser“ können keinen echten XML-Parser verwenden, da der nicht standardmäßige Inhalt als XML gekennzeichnet ist.) Ohne Konqueror vollständig getestet zu haben, kann ich nicht genau sagen, was in diesem Browser passieren wird. Nicht-Web-ModiEinige Engines haben Modi, die nichts mit Webinhalten zu tun haben. Sie werden hier nur der Vollständigkeit halber erwähnt. Opera hat einen WML2.0-Modus. WebKit unter Leopard verfügt über einen speziellen Modus für ältere Dashboard-Widgets. BeeinflussenDies sind die wichtigsten Auswirkungen dieser Modi: LayoutDer Text/HTML-Modus beeinflusst hauptsächlich das CSS-Layout. Beispielsweise ist es eine Eigenart, dass Tabellen keine Stile erben. Im Quirks-Modus einiger Browser wird das Box-Modell zum IE5.5-Box-Modell. In diesem Dokument werden nicht alle Layout-Eigenheiten aufgeführt. Im Semistandardmodus (in Browsern, die über einen solchen Modus verfügen) ist die Höhe von Tabellenzellen, die nur Bilder enthalten, anders als im Standardmodus. Im XML-Schema weisen Selektoren unterschiedliche Verhaltensweisen hinsichtlich der Groß- und Kleinschreibung auf. Darüber hinaus gelten bestimmte Regeln für das HTML-Body-Element nicht für ältere Browser, in denen die neuesten CSS 2.1-Änderungen nicht implementiert wurden. AnalyseEs gibt auch einige Macken, die sich auf die Analyse von HTML und CSS auswirken und dazu führen können, dass standardkonforme Webseiten falsch analysiert werden. Das Macken-Layout bestimmt, ob diese Macken ein- oder ausgeschaltet sind. Unabhängig davon ist es wichtig, die wichtigsten Ähnlichkeiten und Unterschiede zwischen dem Quirks-Modus und dem Standardmodus in Bezug auf CSS-Layout und -Analyse (nicht HTML-Analyse) zu verstehen. Manche Leute bezeichnen den Standardmodus fälschlicherweise als „strikten Analysemodus“, was den Browser dazu verleitet, die HTML-Syntaxregeln durchzusetzen und die Korrektheit der Auszeichnung zu überprüfen. Das ist nicht der Fall. Auch wenn das Layout im Standardmodus aktiviert ist, führen Browser weiterhin Korrekturen an Tag-Soup (http://en.wikipedia.org/wiki/Tag_soup) durch. (Vor der Veröffentlichung von Netscape 6 im Jahr 2000 verfügte Mozilla über Parsing-Modi zur Durchsetzung der HTML-Syntaxregeln. Diese Modi wurden als mit vorhandenen Webinhalten nicht kompatibel abgelehnt.) Ein weiteres häufiges Missverständnis betrifft die XHTML-Analyse. Es wird allgemein angenommen, dass die Verwendung des XHTML-Dokumenttyps zu einer anderen Analyse führt. Tatsächlich ist dies nicht der Fall. XHTML-Dokumente mit dem Inhaltstyp text/html verwenden denselben Parser wie HTML-Dokumente. Derzeit berücksichtigen Browser, dass XHTML mit einem Dokumenttyp vom Typ „Text/HTML“ lediglich eine „Tag-Suppe mit Croutons“ (mit zusätzlichen Schrägstrichen hier und da) ist. Nur Dokumente, die den XML-Dokumenttyp verwenden (z. B. application/xhtml+xml oder xmapplication/), lösen den XML-Modus zum Parsen aus, und der Parser zu diesem Zeitpunkt unterscheidet sich völlig vom HTML-Parser. SkriptWährend es im Quirks-Modus hauptsächlich um CSS geht, gibt es auch einige Dinge zum Thema Skripting. Beispielsweise erstellen HTML-ID-Attribute im Firefox-Quirks-Modus Objektreferenzen im globalen Skriptbereich, genau wie im Internet Explorer. Die Auswirkungen von Skripting sind im IE8 stärker ausgeprägt als in anderen Browsern. Im XML-Modus verhalten sich einige DOM-APIs völlig anders, da das DOM-API-Verhalten für XML als inkompatibel mit dem Verhalten für HTML definiert wurde. Doctype-Sniffing (auch Doctype-Konvertierung genannt)Moderne Browser verwenden Doctype-Sniffing, um den Engine-Modus für Text-/HTML-Dokumente zu bestimmen. Dies bedeutet, dass die Wahl des Modus auf der Dokumenttypdeklaration (oder dem Fehlen einer solchen) am Anfang des HTML-Dokuments basiert. (Dies gilt nicht für Dokumente, die den XML-Dokumenttyp verwenden.) Die Dokumenttypdeklaration (Doctype) ist eine syntaktische Fälschung von SGML, dem alten Markup-Framework, anhand dessen HTML vor HTML5 definiert wurde. In der HTML4.01-Spezifikation beschreibt die Dokumenttypdeklaration die Versionsinformationen von HTML. Trotz des Namens „Dokumenttypdeklaration“ und trotz der Beschreibung der „Versionsinformationen“ in der HTML 4.01-Spezifikation ist mit der Dokumenttypdeklaration nicht beabsichtigt, ein SGML- oder XML-Dokument als einen bestimmten Dokumenttyp zu klassifizieren, selbst wenn es (aufgrund des Namens) so aussieht. (Mehr im Anhang) Weder die HTML 4.01-Spezifikation noch ISO 8879 (SGML) sagen etwas über die Verwendung von Dokumenttypdeklarationen als Engine-Modusschalter aus. Doctype Sniffing basiert auf der Beobachtung, dass zum Zeitpunkt der Entwicklung von Doctype Sniffing die überwiegende Mehrheit der Quirks-Dokumente weder eine Dokumenttypdeklaration noch einen Verweis auf eine alte DTD hatte. HTML5 akzeptiert diese Tatsache und definiert den Dokumenttyp „Text/HTML“ als einzigen Modusschalter. Eine typische Dokumenttypdeklaration vor HTML5 enthält (durch Leerzeichen getrennt) die Zeichenfolge „<!DOCTYPE“, den universellen Bezeichner des Stammelements („html“), die Zeichenfolge „PUBLIC“, den öffentlichen Bezeichner der DTD in Anführungszeichen, einen möglichen Systembezeichner (URL) derselben DTD und das Zeichen ">". Die Dokumenttypdeklaration wird vor dem Starttag des Stammelements des Dokuments platziert. Dokumenttyp auswählentext/htmlHier ist eine einfache Anleitung zum Auswählen eines Dokumenttyps beim Erstellen eines neuen Text-/HTML-Dokuments:
Ich empfehle keinen XHTML-Dokumenttyp, da die Verwendung von XHTML als schädlich gilt. Unabhängig davon, ob Sie den XHTML-Dokumenttyp verwenden, beachten Sie bitte, dass die XML-Deklaration dazu führt, dass IE6 (aber nicht IE7!) den Quirks-Modus auslöst. Anwendung/xhtml+xmlEine einfache Richtlinie für application/xhtml+xml besteht darin, niemals Doctype zu verwenden. Die Webseiten in diesem Modus sind nicht „streng konform“ mit XHTML1.0, aber das ist nicht wichtig. (Bitte beachten Sie den Anhang unten) IE8-KomplikationenA List Apart hat einmal eingeführt, dass IE8 zusätzlich zum Doctype Modusübergänge basierend auf Metaelementen als einen der Faktoren für die Modusauswahl verwenden wird. (Siehe Kommentare von Ian Hickson, David Baron, nochmals David Baron, Robert O'Callahan und Maciej Stachowiak.) IE8 hat 4 Modi: IE5.5-Quirks-Modus, IE7-Standards-Modus, IE8-Semi-Standards-Modus und IE8-Standards-Modus. Der gewählte Modus basiert auf Daten aus mehreren Quellen: Dokumenttyp, Metaelemente, HTTP-Header, regelmäßig heruntergeladene Daten von Microsoft, die LAN-Domäne, vom Benutzer vorgenommene Einstellungen, vom LAN-Administrator vorgenommene Einstellungen, der Modus des übergeordneten Frames (sofern vorhanden) und ob die Schaltfläche „Kompatibilitätsansicht“ in der Adressleiste vom Benutzer ausgelöst wird. (Bei anderen Anwendungen, in die die Engine eingebettet ist, hängt der Modus auch von der eingebetteten Anwendung ab.) Glücklicherweise verwendet IE8 Doctype-Sniffing größtenteils wie andere Browser, wenn die folgenden Bedingungen erfüllt sind:
IE8 führt Doctype-Sniffing genauso durch wie IE7, mit Ausnahme der beiden oben bezüglich X-UA-Compatible genannten Fälle. Die IE7-Emulation wird als Kompatibilitätsansicht bezeichnet. Im Fall von X-UA-Compatible verhält sich IE8 völlig anders als andere Browser. Möchten Sie den Anhang dieser Seite oder das Flussdiagramm im PDF- und PNG-Format sehen? Ohne den X-UA-kompatiblen HTTP-Header oder Meta-Tag ermöglicht IE8 den Benutzern leider, Seiten versehentlich vom IE8-Standardmodus in den IE7-Modus herunterzustufen, bei dem es sich um einen emulierten IE7-Standardmodus handelt, selbst wenn der entsprechende Dokumenttyp verwendet wird. Schlimmer noch: LAN-Administratoren können dasselbe tun. Microsoft kann auch alle von Ihnen verwendeten Domänen auf eine schwarze Liste setzen. Um diesen Effekten entgegenzuwirken, reicht der Doctype nicht aus; Sie benötigen den X-UA-kompatiblen HTTP-Header und das Meta-Tag. Nachfolgend finden Sie eine einfache Anleitung zum Auswählen des X-UA-kompatiblen HTTP-Headers oder Meta-Tags für neue Text-/HTML-Dokumente, die bereits über einen Dokumenttyp verfügen, der in anderen Browsern den Standardmodus oder nahezu den Standardmodus auslöst:
Weiterführende Links
Nachtrag: Ein Appell an XML-Implementierer und SpezifikationsautorenBitte bringen Sie kein Doctype-Sniffing in XML ein. Doctype-Sniffing ist eine Tag-Soup-Lösung für ein Tag-Soup-Problem. Doctype Sniffing ist eine Heuristik, die nach der Veröffentlichung der HTML4- und CSS2-Spezifikationen entwickelt wurde, um veraltete Dokumente von Dokumenten zu unterscheiden, die dem von ihren Autoren erwarteten Verhalten entsprechen. Gelegentlich wurde vorgeschlagen, Doctype-Sniffing auf XML anzuwenden, um unterschiedliche Verarbeitungen zu planen, das verwendete Vokabular zu ermitteln oder Funktionen zu aktivieren. Das ist eine schlechte Idee. Die Disposition und Vokabularidentifizierung sollten Namespace-basiert sein, während die Funktionsaktivierung auf expliziten Verarbeitungsanweisungen oder Elementen basieren sollte. Die gesamte Idee der Wohlgeformtheit wurde eingeführt, um eine DTD-lose Analyse von XML zu ermöglichen und Doctype-lose Dokumente zu fördern. Im formellen Fall gilt: Wenn zwei XML-Dokumente die gleiche kanonische Form haben und von einer Anwendung unterschiedlich verarbeitet werden (und der Unterschied nicht auf einen Mangel an Auswahlmöglichkeiten bei der Verarbeitung externer Entitäten zurückzuführen ist), kann die Anwendung beschädigt werden. Wenn in der Praxis zwei XML-Dokumente dazu führen, dass der gleiche Inhalt an einen SAX2-Inhaltsprozessor gemeldet wird (qnames werden ignoriert), eine Anwendung die Dokumente jedoch unterschiedlich verarbeitet, ist die Anwendung wahrscheinlich defekt. Da Sie als Webautor nicht darauf vertrauen können, dass jeder seine Seiten mit einem XML-Prozessor analysiert, der zusätzliche Entitäten auflöst (selbst wenn es bei einigen Browsern so aussieht, als ob sie dies tun, weil sie bestimmte allgemeine Bezeichner einer verkürzten DTD zuordnen, die die Entitäten definiert), ist das Einfügen eines Doctypes in XML für das Web sinnlos und führt normalerweise zu Cargo-Kult-Gewohnheiten. (Sie können mit der DTD-Override-Funktion des W3C-Validators immer noch eine Validierung anhand einer DTD durchführen, obwohl der W3C-Validator angibt, dass das Ergebnis nur vorläufig gültig ist. Oder noch besser: Sie können eine entspannte NG-Validierung verwenden, die das Dokument nicht mit Schemaverweisen verunreinigt.) Die Anforderung eines Doctypes zum Zwecke des Sniffings ist ziemlich albern, auch wenn dies in der HTML-Praxis der richtige Weg ist. Wenn eine Spezifikation auf niedriger Ebene zwei Dinge als gleich definiert, sollte eine Spezifikation auf hoher Ebene außerdem nicht versuchen, ihnen unterschiedliche Bedeutungen zu geben. Erwägen Sie <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> . Wenn der öffentliche Bezeichner entfernt wird, wird immer noch dieselbe DTD angegeben, sodass der Dokumenttyp <!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> dasselbe bedeutet wie der vorherige Dokumenttyp. Sollten sie anders beschnüffelt werden? Die Theorie lässt sich noch weiter ausbauen. Angenommen, example.com erhält eine DTD namens foobar.dtd: <!DOCTYPE html SYSTEM "http://example.com/foobar.dtd"> . Wie kann man das riechen? Es sollte dasselbe bedeuten. Sogar die gesamte DTD kann in das Dokument eingefügt werden. Mit anderen Worten, wenn Sie #include "foo.h" haben, sollten Sie keine schwarze Magie auf den Namen foo.h anwenden, weil es möglich sein sollte, den Inhalt von foo.h in das Dokument zu kopieren oder foo.h in bar.h zu kopieren und #include "bar.h" zu sagen. Der Grund, weshalb ich mir keine Sorgen darüber mache, dass HTML und SGML die gleichen Parameter konstruieren, liegt darin, dass Webbrowser keinen echten SGML-Parser zum Parsen von HTML verwenden. Daher halte ich es für sinnlos, so zu tun, als sei es SGML. Wenn Sie immer noch nicht überzeugt sind, lesen Sie W. Eliot Kimbers Artikel zu diesem Thema comp.text.sgml Anhang: Umgang mit einigen Doctypes in Text/HTMLIn der folgenden Tabelle werden der Quirks-Modus, der Standard-Modus und der Semi-Standard jeweils als Q, S und A bezeichnet. Wenn der Browser nur über zwei Modi verfügt, wird der Standardmodus als „S“ gekennzeichnet, wenn sich die Zeilenhöhe der Tabellenzellen wie im Standardmodus von Mozilla verhält, und als „A“, wenn sich die Zeilenhöhe der Tabellenzellen wie im Semistandardmodus von Mozilla verhält. Beachten Sie, dass XHTML, das unter Verwendung des XML-Inhaltsmodells bereitgestellt wird, im XML-Modus gerendert wird. Der Zweck dieser Tabelle besteht nicht darin, zu behaupten, dass alle Dokumenttypen in der Tabelle eine sinnvolle Wahl für neue Seiten darstellen. Der Zweck dieser Tabelle besteht darin, anzuzeigen, auf welchen Daten meine Empfehlungen basieren. Für Spaltenüberschriften werden folgende Abkürzungen verwendet:
GeschichteDer Doctype-Sniffing-Code von Moziila wurde im Oktober 2000, September 2001 und Juni 2002 erheblich geändert. Dieses Dokument beschreibt den Status der unter ftp.mozilla.org verfügbaren Builds von Mozilla (und Netscape 6.x) vom 19.10.2000. Dieses Dokument behandelt nicht die Funktionsweise von Doctype-Sniffing in Mozilla M18 (und Netscape 6.0 PR3). Auch der Doctype-Sniffing-Code von Safari wurde seit der ersten öffentlichen Betaversion erheblich geändert. Dieses Dokument behandelt kein Verhalten vor Version V73, auch bekannt als 0.9. Der Doctype-Sniffing-Code in Konqueror vor 3.5 scheint aus einer sehr alten Version von Safari zu stammen. Konqueror entspricht jetzt Safari, mit Doctype-Sniffing-Code von Mozilla. Wie aus der Tabelle ersichtlich, verändert sich das Doctype-Sniffing von Opera von eher IE-ähnlich zu eher Mozilla-ähnlich, obwohl Opera 9.5 und 9.6 auf dem Rückweg sind. Gleichzeitig wurde das Layoutverhalten des Quirks-Modus von Opera von der Emulation des Quirks-Modus von IE6 auf den Quirks-Modus von Mozilla umgestellt. Anhang: IE8-Modusauswahl
Diese Schritte sind als Flussdiagramme in den Formaten PDF und PNG verfügbar. DanksagungIch danke Simon Pieters, Simon Pieters und Anne van Kesteren für ihre Hilfe beim Korrigieren der Modustabellen für verschiedene Opera-Versionen und für ihre Kommentare. Danke an Simon Pieters für ein weiteres IE8-Flussdiagramm. |
<<: Informationen zur Nginx-GZIP-Konfiguration
>>: Beispielcode zur Implementierung des Aushöhlungseffekts mit CSS
ausstellen Design Passwortstärke-Analyse Das Pass...
1. Warum maxPostSize festlegen? Der Tomcat-Contai...
Einführung Die meisten Leute, die schon einmal Da...
Alphabetisch DTD: Gibt an, in welcher XHTML 1.0 D...
30 kostenlose englische Ribbon-Schriftarten in hoh...
Originaltext: http://www.planabc.net/2008/08/05/u...
JBoss verwendet Tomcat als Webcontainer. Die Konf...
Inhaltsverzeichnis Vorwort Erster Blick auf React...
Übersicht über die Clusterbereitstellung 172.22.1...
Inhaltsverzeichnis Vorwort Untergeordnete Kompone...
Inhaltsverzeichnis Überblick Durchführung Schutz-...
Code kopieren Der Code lautet wie folgt: jQuery.c...
1. Herunterladen Gehen Sie zur offiziellen Apache...
Inhaltsverzeichnis Was ist ein Versprechen? Verwe...
Funktion 0. Aktuelle Uhrzeit anzeigen Befehl: sel...