Wie erkennt man, ob sich ein Browser im "Macken" -Modus befindet?

128

Nehmen wir an, Sie haben eine Seite mit einem relativ strengen Doctype und HTML-Markup, die nahezu konform ist, aber möglicherweise auf ein paar alberne Arten fehlt, möglicherweise aufgrund von Benutzerinhalten, die außerhalb Ihrer Kontrolle liegen. Angenommen, Sie arbeiten an einem Inhalt Managementsystem oder ein Thema für ein Content-Management-System, bei dem Sie eine grundlegende Struktur steuern und Javascript benötigen, aber nicht für alles andere verantwortlich sind, was in Seiten eingeht.

Wie können Sie feststellen (oder: was wird bestimmen), wann der Browser beschließt, in den "Macken" -Modus zu wechseln, anstatt die standardkonformere Engine zu verwenden?

Ich suche nach Antworten für jeden der wichtigsten Browser, da IE, Chrome, Safari und Firefox dies natürlich alle unterschiedlich handhaben. Reicht ein einziger Fehler aus, um ihn zu erzwingen, oder haben Sie einen gewissen Spielraum?

Joel Coehoorn
quelle

Antworten:

159

In Firefox und Opera können Sie feststellen, ob sich Ihr Browser im "Mackenmodus" befindet, indem Sie die Seiteninformationen überprüfen.

Wenn Sie verwenden document.compatMode, erfahren Sie, in welchem ​​Modus Sie sich mit den meisten Browsern befinden.

Führen Sie in Chrome, Safari und IE dieses Javascript in der Adressleiste aus:

 javascript:window.alert('You are in ' + (document.compatMode==='CSS1Compat'?'Standards':'Quirks') + ' mode.')

(Beachten Sie, dass Sie den javascript:Teil nach dem Einfügen in Ihre Adressleiste aufgrund der jüngsten Sicherheitsänderungen erneut eingeben müssen.)

Chris Ballance
quelle
Es gibt einen weiteren potenziellen Wert im IE, auf den ich gestoßen bin, als ich eine alte Seite in den "EDGE" -Modus gezwungen habe. Der Wert war "BackCompat"
Greg Woods
Ich habe BackCompat auch in Chrome erhalten, als ich DOCTYPE auf etwas völlig Ungültiges gesetzt habe. Laut dem Code in dieser Antwort befindet sich der Wert, wenn er nicht CSS1Compat ist, im Mackenmodus. Stimmt das wirklich? Was sind alle möglichen Werte?
still_dreaming_1
Anscheinend ist BackCompatible der Standardwert für den Modus "Macken" / "Kompatibilität". Es gibt nur die 2 Werte: developer.mozilla.org/en-US/docs/Web/API/Document/compatMode
still_dreaming_1
19

Da Sie den Rendermodus in JavaScript abfragen können, können Sie ein Lesezeichen erstellen, das Ihnen anzeigt, welchen Rendermodus eine Seite verwendet.

Ich habe dieses Lesezeichen für den Rendermodus gefunden, das für mich gut funktioniert:

javascript:m=(document.compatMode=='CSS1Compat')?'Standards':'Quirks';window.alert('You%20are%20in%20'%20+%20m%20+%20'%20mode.');
Dave Webb
quelle
11

Die vollständige Antwort auf Ihre aktuelle spezifische Frage: "Reicht ein einzelner Fehler aus, um ihn zu erzwingen, oder haben Sie einen gewissen Spielraum?" ist, dass es total auf den Fehler ankommt. Beispielsweise,

<!-- Comment -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Erzwingt den Quirks-Modus in IE 6 und 7, obwohl dies nicht wirklich ein Fehler ist (sie werfen nur ein totales Wackeln, wenn die allererste Zeile der Datei keine Deklaration ist). Eine kurze Liste der Typen / Macken finden Sie hier

Versuchen Sie, die folgende Zeile zum Testen in Ihren HTML-Code einzufügen (sehr schlechtes Javascript-Verhalten, das ich hier weitergebe - Entschuldigung ... stellen Sie sicher, dass dies niemals live geht :)

<a href="javascript:alert(document.compatMode);">What mode am I?</a>
Steerpike
quelle
Vielen Dank für den Javascript-Tester, da meine ersten beiden Versuche, dem Macken-Modus zu entkommen, nicht funktionierten.
Noumenon
css1compat! = Mackenmodus?
Mike Cole
4

Laut http://www.quirksmode.org/css/quirksmode.html : "Das Problem war, dass einige Seiten, die im Quirks-Modus geschrieben wurden, Doctypes hatten. Daher hat jeder Browser eine eigene Liste mit Doctypes, die den Quirks-Modus auslösen. Siehe diesen Browser Vergleichstabelle für eine Übersicht dieser Listen: http://hsivonen.iki.fi/doctype/ "

Hoffe das hilft

Sébastien Nussbaumer
quelle
3

Wenn Sie dem IE mitteilen, dass es streng sein soll (über doctype), ändert es seine Meinung nicht zur Hälfte der Seite.

i_am_jorf
quelle
2

Wenn ich den Mackenmodus richtig verstehe, reicht eine Seite, die nicht gegen den deklarierten Doctype validiert wird, nicht aus, um den Mackenmodus auszulösen. Es wird einfach nicht richtig angezeigt.

Die beste Ressource, die ich gefunden habe, um festzustellen, wie verschiedene Browser mit jedem Doctype umgehen, ist hier .

Bill die Eidechse
quelle
2

Für das Add-On Firefox mit Web Developer Toolbar können Sie sich die drei Symbole rechts in der Leiste ansehen. Ganz links sehen Sie, in welchem ​​Modus Sie sich befinden.

Arieleo
quelle
2

Im IE sehen Sie es in den Entwicklertools (drücken Sie F12), es steht im Menü: Dokumentmodus: ... und Sie können dort auch einen anderen Modus erzwingen.

Ronen Festinger
quelle
Dies verfehlt den Punkt der Frage. Das hilft Ihnen nicht, Javascript zu schreiben, das einen Pfad für den Mackenmodus und einen anderen Pfad für den Standardmodus ausführt.
Joel Coehoorn
Eigentlich haben Sie nicht gefragt, wie es in Javascript geht, sondern wie man weiß, welchen Modus der Browser verwendet. Selbst wenn Sie es nicht so gemeint haben, kann es anderen helfen, die danach suchen. Ich selbst musste wissen, wie man es in Firefox kennt, und kam zu dieser Frage.
Ronen Festinger
@JoelCoehoorn Das eigentliche Problem ist, dass Sie nie erklärt haben, was ein "relativ strenger Doctype" ist!
Herr Lister
0

Schreiben Sie auf der HTML5-Seite " <!DOCTYPE html>" Start mit Seite kann sich in document.compatMode = 'CSS1Compat' ändern.

Miro
quelle