JavaScript: Kann ich IE9 erkennen, wenn es sich im IE7- oder IE8-Kompatibilitätsmodus befindet?

87

Ich muss wissen, ob der Browser, der sich über die Benutzeragentenzeichenfolge als IE7 oder IE8 identifiziert, wirklich diese Browser sind oder ob es sich um IE9 im 7- oder 8-Kompatibilitätsmodus handelt.

Nach dem, was ich in der Benutzeragentenzeichenfolge sehen kann, bietet ein IE9 im IE7-Kompatibilitätsmodus eine identische Zeichenfolge wie ein echter IE7. Gibt es eine zusätzliche Eigenschaft / ein zusätzliches Element / Objekt, die ich testen kann, um festzustellen, ob es sich um "wirklich" verkleideten IE9 handelt?

Ich gehe davon aus, dass der Dokumentmodus nicht hilft, da die Seite, auf die mein Skript geladen wird, entweder Macken erzwingen oder eine bestimmte Einstellung erzwingen kann.

Ich hoffe, dass IE9 eine Eigenschaft hat, die existiert und testbar ist, unabhängig davon, ob es sich im 7-, 8- oder 9-Modus befindet.


Bearbeitet, um hinzuzufügen ...

OK, ich sehe, wo ich jetzt falsch liege. Ich habe das Dropdown-Menü "Browsermodus" verwendet und auf IE8 und IE7 umgeschaltet und dachte, dies sei "IE8-Kompatibilitätsmodus" bzw. "IE7-Kompatibilitätsmodus". Das stimmt natürlich nicht. Der Browsermodus der Entwicklertools schaltet ihn wirklich auf "wie" diese alten Browser um, daher ist es nur richtig, dass die ursprünglichen Useragent-Zeichenfolgen gemeldet werden.

Wenn ich den Browsermodus in IE9- oder IE9-Kompatibilität verlasse und stattdessen die Dropdown-Varianten für den Dokumentmodus ausprobiere, wird "Trident / 5.0" tatsächlich in allen 8 Kombinationen (zwei Browsermodi und 4 Dokumentmodi) angezeigt. Ich muss mich nur von der Auswahl des Browsermodus IE7 und IE8 fernhalten, da es sich tatsächlich um (simulierte) IE7 und IE8 handelt.

Es gibt also keine Möglichkeit, dass eine Seite, ein Nicht-Entwickler-Benutzer, ein Meta-Tag oder die Kompatibilitätsliste von Microsoft IE9 in diesen nicht identifizierbaren Zustand versetzt.

Nur die Verwendung if(navigator.userAgent.indexOf("Trident/5")>-1)wird ausreichen.

Keine Sorge, dies gilt nicht für Stile, Formatierungen, Logik oder Seiteninhalte. Ich benutze die Feature-Erkennung für diese Dinge. Ich muss nur IE9 erkennen (unabhängig davon, in welchem ​​Modus es sich befindet) und eine Entscheidung über den Inhalt ohne Seiten treffen.

Vielen Dank, dass Sie mich mit Ihren Vorschlägen und Links zur Antwort geführt haben.

Dee2000
quelle
1
Vertraue niemals dem Benutzeragenten ... es kann perfekt lügen und es gibt keine Möglichkeit, sicher zu sein, ob es die Wahrheit sagt oder nicht ... du solltest stattdessen auf bestimmte Funktionen oder Merkmale testen
JCOC611
2
@ JCOC611 Ja und nein. Dies ist eine spezielle Frage, um herauszufinden, ob es sich in der Kompatibilitätsansicht um IE9 handelt. Dies ist eine vernünftige Frage. Im Allgemeinen sollte man sich nicht auf Benutzeragentenzeichenfolgen für die Site-Funktionalität verlassen, da man sie leicht fälschen kann, stimmt.
Dennis G
1
Selbst wenn der Benutzeragent genau ist, ist es sehr vorzuziehen, die Feature-Erkennung zu verwenden, wenn dies überhaupt möglich ist. Dann müssen Sie nicht wissen, ob sich der IE überhaupt im Kompatibilitätsmodus befindet oder nicht.
Dave Ward
1
Ich möchte nur hinzufügen, dass dies sehr nützlich ist, wenn Sie Benutzern, die einen falschen Browsermodus verwenden, ein kurzes Tutorial zur Verfügung stellen möchten.
Joost
1
@ JCOC611 Wer würde seinen Useragent fälschen und erwarten, dass die Dinge richtig funktionieren - sollten wir uns wirklich um diesen Fall kümmern?
JohnnyFaldo

Antworten:

67

Tatsächlich unterscheidet sich die Benutzeragentenzeichenfolge für IE9, wenn sie im IE7-Kompatibilitätsmodus ausgeführt wird. Dies ist daher eine der besten Möglichkeiten, um zwischen verschiedenen IE-Versionen zu unterscheiden.

Einführung in die User Agent-Zeichenfolge von IE9 :

Ähnlich wie bei IE8 wird die Kompatibilitätsansicht von IE9 dem IE7-Standardmodus zugeordnet, und die UA-Zeichenfolge von IE9 in der Kompatibilitätsansicht lautet:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

In der Kompatibilitätsansicht meldet sich IE9 über die Anwendungsversionsnummer (Mozilla / 4.0) und das Versions-Token (MSIE 7.0) als IE7. Dies erfolgt aus Kompatibilitätsgründen. Mit einem inkrementierten Trident-Token von 'Trident / 4.0' auf 'Trident / 5.0' können Websites zwischen IE9 in Compat View und IE8 in Compat View unterscheiden .

(Hervorhebung von mir hinzugefügt). Die Benutzeragentenzeichenfolge ist also dieselbe wie die, die sich als "Mozilla / 4.0" und MSIE 7.0 meldet, aber IE9 ist immer Trident / 5.0 - unabhängig davon, ob MSIE 7.0, MSIE 8.0 oder MSIE 9.0 angezeigt wird.

Eigentlich sollten Sie sich diese großartige Zusammenstellung ansehen : Browser ID (User-Agent) Strings oder noch besser useragentstrings.com

Dennis G.
quelle
1
Hallo Moontear. Ich habe auch gesehen, dass "Trident / 5.0" vorhanden sein soll, wenn sich IE9 im IE7-Modus befindet, aber das sehe ich nicht auf meinem (endgültigen) IE9 unter Win7 Pro x64. Es zeigt überhaupt keinen Dreizack im IE7-Modus (so sieht echter IE7 aus) und es zeigt Dreizack 4 im IE8-Modus (wieder, wie der echte IE8 aussieht). Ich verwende die IE9-Entwicklertools zuerst, um den Browsermodus auszuwählen, und dann in der Adressleiste, um Javascript zu alarmieren: alert (navigator.userAgent)
Dee2000
1
"Trident / 5.0" ist in allen Modi in der Benutzeragentenzeichenfolge von IE9 vorhanden.
EricLaw
Wie EricLaw sagt, Dee. Trident / 5.0 muss vorhanden sein, wenn Sie den Kompatibilitätsmodus verwenden (kann im Browser-Modus anders sein?). Wie überprüfen Sie die Benutzeragentenzeichenfolge? Versuchen Sie, über whatsmyuseragent.com zu überprüfen und sich zu melden.
Dennis G
Siehe meine Antwort unten (ich musste eine andere ID Dee2001 verwenden, da ein Stapelüberlauf eine 8-Stunden-Regel zum Hinzufügen einer Antwort zu Ihrer eigenen Nachricht enthält). Ja, Eric und Moontear sind beide korrekt. Trident / 5.0 ist in allen IE9-Modi vorhanden. Mein großer Fehler war, den "Browser-Modus" in den Entwicklertools auf IE7 oder IE8 zu ändern, aber das ist kein "Modus", den eine Seite / Meta-Tag / Kompatibilitätsliste erzwingen kann. Stattdessen werden die Browser selbst wirklich simuliert, sodass die Useragent-Zeichenfolge natürlich IE7 / 8 ähnelt.
Dee2000
1
Dies ist perfekt! Vielen Dank. Ich gestalte nicht basierend auf dem gemeldeten Browser, aber ich richte oben auf der Site, an der ich arbeite, eine Warnleiste ein, die besagt, dass der Benutzer ein Upgrade durchführen muss (wenn dh bedingte Tags angeben, dass sie kleiner oder gleich ie7 sind). - Ich möchte nicht, dass in diesem Fall ein Upgrade
Chelsea Urquhart,
47

document.documentMode ist der beste Weg für den Dokumentmodus.

Yuhong Bao
quelle
17
Bitte erweitern Sie die Antwort ein wenig. Mehr Kontext.
random_user_name
3
Warum addieren die Leute das nicht, es ist genau das, was benötigt wird
Jamie Hutber
5
Das ist in der Tat der beste Weg. Sie können es folgendermaßen verwenden : <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. Der echte (!) IE7 und alle Nicht-IEs geben 'undefined' zurück, nur IE8 / 9 in Comp. mode return 7. Ich kann IE10 nicht testen, aber das sollte dasselbe sein.
Frank Conijn
2
Ich habe es gerade in IE10 auf einer Seite mit dem Rand-META-Tag versucht. Normalerweise wird "10" zurückgegeben. Erzwingen Sie den Kompatibilitätsmodus für alle Sites und es wird weiterhin "10" zurückgegeben.
Whelkaholism
Funktioniert für mich in IE10 und IE11 Vorschau
Simon Keep
20

IE7 enthält keine Informationen zu Trident

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 enthält diese Zeichenfolge: "Trident / 4.0"

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 enthält diese Zeichenfolge: "Trident / 5.0"

IE9 im Kompatibilitätsmodus:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

IE9 im normalen Modus:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
Greg
quelle
1
Das ist großartig, erhöht IE10 auch Trident?
Slotishtype
3
Internet Explorer 10 Benutzer Trident / 6.0 .... siehe blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype
1
und IE11 verwendet Trident / 7.0
Dee2000
11

Ich hoffe, dass IE9 eine Eigenschaft hat, die existiert und testbar ist, unabhängig davon, ob es sich im 7-, 8- oder 9-Modus befindet.

Überprüfen Sie zB auf style.opacity , es wurde in IE9 eingeführt und ist unabhängig vom Kompatibilitätsmodus verfügbar:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
Dr.Molle
quelle
1
Danke Dr.Molle, ich werde es versuchen und mich zurückmelden.
Dee2000
Leider funktioniert das nur im Browsermodus (das linke Dropdown-Menü in den IE9-Entwicklertools). Es funktioniert nicht im Dokumentmodus (das Dropdown-Menü auf der rechten Seite). Im Dokumentmodus funktioniert es nur im IE9-Dokumentmodus. Wenn es sich im IE8-, IE7- oder Quirks-Modus befindet, schlägt diese Logik fehl.
Dee2000
7
Verdammt, dein Recht. Ich habe eine andere Eigenschaft gefunden, funktioniert für mich in jedem Modus: window.performance
Dr.Molle
@ Dee2000: Es funktioniert auch bei DocumentMode. Dh NUR wenn DocumentMode = "Internet Explorer 9 Standard", ist dieser Test erfolgreich.
Niklas Bäckman
@ Dr.Molle danke dafür, window.performance macht den Job gut.
lewsid
3

Manchmal muss die Benutzeragentenzeichenfolge von der Servervariablen und nicht vom Javascript-Navigatorobjekt gelesen werden.

Vergleichen Sie die Unterschiede:

  • ASP-Klassiker, IE11

    • Client-Javascript, navigator.userAgent: " Mozilla / 5.0 (kompatibel; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

    • Server-ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) wie Gecko "

  • ASP classic, IE11-Kompatibilitätsmodus :

    • Client-Javascript, navigator.userAgent: " Mozilla / 5.0 (kompatibel; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)) "

    • Server-ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (kompatibel; MSIE 7.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET 3.0.30729 CLR; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

Pažout
quelle
0

Von https://stackoverflow.com/a/29288153/2879498

Angenommen, Sie haben ein verstecktes Element mit der ID-Kompatibilitätswarnung:

Javascript mit jQuery:

$(function(){
    function showCompatWarning() {
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    }
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
});

Erkennung und Warnungen, Ihre erste und letzte Verteidigungslinie gegen die Kompatibilitätshölle.

TylerY86
quelle