web-dev-qa-db-de.com

JavaScript: Kann ich IE9 im IE7- oder IE8-Kompatibilitätsmodus erkennen?

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

Nach dem, was ich in der Benutzeragentenzeichenfolge sehen kann, stellt ein IE9 im IE7-Kompatibilitätsmodus eine identische Zeichenfolge für einen echten IE7 bereit. Gibt es eine zusätzliche Eigenschaft/Element/Objekt, die ich testen kann, um festzustellen, ob es sich um "wirklich" IE9 handelt?

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

Ich hoffe, dass IE9 über eine Eigenschaft verfügt, die vorhanden und testbar ist, unabhängig davon, ob sie 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ü "Browser-Modus" verwendet und es auf IE8 und IE7 umgestellt. Dabei dachte ich, dies sei "IE8-Kompatibilitätsmodus" bzw. "IE7-Kompatibilitätsmodus". Das stimmt natürlich nicht. Der Browsermodus der Entwicklertools ändert sich tatsächlich so, dass er den alten Browsern ähnelt. 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" in allen 8 Kombinationen (zwei Browsermodi und 4 Dokumentmodi) angezeigt. Ich muss nur vermeiden, den Browsermodus IE7 und IE8 zu wählen, da es sich tatsächlich um (simulierte) IE7 und IE8 handelt.

Eine Seite, ein Benutzer, der kein Entwickler ist, ein Meta-Tag oder die Kompatibilitätsliste von Microsoft können den IE9 auf keinen Fall in diesen nicht identifizierbaren Zustand versetzen.

Es reicht aus, if(navigator.userAgent.indexOf("Trident/5")>-1) zu verwenden.

Keine Sorge, dies gilt nicht für Stile, Formatierungen, Logik oder Seiteninhalte. Ich benutze Feature-Erkennung für diese Dinge. Ich muss nur den IE9 erkennen (unabhängig davon, in welchem ​​Modus er sich befindet) und eine Entscheidung darüber treffen, dass kein Seiteninhalt vorhanden ist.

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

87
Dee2000

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, zwischen verschiedenen IE Versionen zu unterscheiden.

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

Ähnlich wie in 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 Versionsnummer der Anwendung (Mozilla/4.0) und das Versionstoken (MSIE 7.0) als IE7. Dies geschieht aus Kompatibilitätsgründen. Mit einem inkrementellen Trident-Token von "Trident/4.0" auf "Trident/5.0" können Websites zwischen IE9, das in der Kompatibilitätsansicht ausgeführt wird, und IE8, das in der Kompatibilitätsansicht ausgeführt wird, unterscheiden .

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

Eigentlich solltest du dir diese großartige Zusammenstellung ansehen: Browser ID (User-Agent) Strings oder noch besser seragentstrings.com

67
Dennis G

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

47
Yuhong Bao

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)
20
Greg
17

Ich hoffe, dass IE9 über eine Eigenschaft verfügt, die vorhanden und testbar ist, unabhängig davon, ob sie sich im Modus 7, 8 oder 9 befindet.

Überprüfen Sie z. für style.opacity wurde es 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]>
11
Dr.Molle

Es ist manchmal erforderlich, die Benutzer-Agent-Zeichenfolge von der Servervariablen und nicht vom Javascript-Navigatorobjekt zu lesen.

Vergleichen Sie die Unterschiede:

  • ASP classic, 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; .NET 4.0C; .NET 4.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; .NET 4.0C; .NET 4.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 CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

3
Pažout

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

Angenommen, Sie haben ein verstecktes Element mit der ID compat-Warnung:

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 Hölle der Kompatibilität.

0
TylerY86