JavaScript: posso rilevare IE9 se è in modalità di compatibilità IE7 o IE8?


87

Ho bisogno di sapere se il browser che si identifica tramite la stringa dell'agente utente come IE7 o IE8 è davvero quei browser, o se è IE9 in modalità di compatibilità 7 o 8.

Da quello che posso vedere nella stringa del programma utente, un IE9 in modalità di compatibilità IE7, fornisce una stringa identica a un vero IE7. C'è una proprietà / elemento / oggetto extra che posso testare per vedere se è "davvero" IE9 sotto mentite spoglie?

Presumo che la modalità documento non sia d'aiuto poiché la pagina in cui è caricato il mio script potrebbe forzare stranezze o forzare un'impostazione specifica.

Spero che IE9 abbia alcune proprietà esistenti e testabili indipendentemente dal fatto che sia in modalità 7, 8 o 9.


Modificato per aggiungere ...

OK, ora capisco dove stavo sbagliando. Stavo usando il menu a discesa "Modalità browser" e lo passavo a IE8 e IE7 e pensavo che fosse rispettivamente "Modalità compatibilità IE8" e "Modalità compatibilità IE7". Questo ovviamente non è vero. La modalità Browser degli strumenti di sviluppo la sta davvero cambiando in "essere come" quei vecchi browser, quindi è giusto che vengano riportate le stringhe dell'agente utente originale.

Se lascio la modalità browser nella compatibilità con IE9 o IE9 e provo invece le varianti a discesa della modalità documento, in effetti ottengo "Trident / 5.0" presente in tutte le 8 combinazioni (due modalità browser e 4 modalità documento). Devo solo evitare di scegliere la modalità browser IE7 e IE8 perché sono realmente (simulati) IE7 e IE8.

Quindi non è possibile che una pagina, un utente non sviluppatore, un meta tag o l'elenco di compatibilità di Microsoft possano mettere IE9 in questo stato non identificabile.

Il solo utilizzo if(navigator.userAgent.indexOf("Trident/5")>-1)sarà sufficiente.

Non preoccuparti, non si tratta di stili, formattazione, logica o contenuto della pagina. Uso il rilevamento delle funzionalità per queste cose. Devo solo rilevare IE9 (indipendentemente dalla modalità in cui si trova) e prendere una decisione sul contenuto non di pagina su questo.

Grazie per avermi indirizzato verso la risposta con i tuoi suggerimenti e link.


1
Non fidarti mai dell'agente utente ... può mentire perfettamente e non c'è modo di essere sicuro se sta dicendo la verità o no ... dovresti invece testare funzioni o caratteristiche specifiche
JCOC611

2
@ JCOC611 Sì e no. Questa è una domanda specifica su come scoprire se è IE9 in visualizzazione compatibilità, che è una domanda ragionevole. In generale non si dovrebbe fare affidamento sulle stringhe dell'agente utente per la funzionalità del sito poiché si può facilmente fingere, è vero.
Dennis G

1
Anche se l'agente utente è accurato, è di gran lunga preferibile utilizzare il rilevamento delle funzionalità, se possibile. Quindi, non è necessario sapere se IE è in modalità di compatibilità in primo luogo.
Dave Ward

1
Voglio solo aggiungere che questo è molto utile se vuoi fornire un rapido tutorial agli utenti che utilizzano una modalità di browser sbagliata.
Joost

1
@ JCOC611 chi avrebbe falsificato il proprio agente utente e si sarebbe aspettato che le cose funzionassero correttamente - dovremmo davvero preoccuparci di quel caso?
JohnnyFaldo

Risposte:


67

In realtà la stringa del programma utente è diversa per IE9 quando viene eseguita in modalità di compatibilità IE7, quindi questo sarebbe uno dei modi migliori per distinguere tra le diverse versioni di IE.

Presentazione della stringa agente utente di IE9 :

Simile a IE8, la Visualizzazione compatibilità di IE9 verrà mappata alla modalità standard di IE7 e la stringa UA di IE9 in Visualizzazione compatibilità sarà:

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

In Visualizzazione Compatibilità, IE9 si segnala come IE7 tramite il numero di versione dell'applicazione (Mozilla / 4.0) e il token di versione (MSIE 7.0). Questo viene fatto per compatibilità. Un token Trident incrementato, da "Trident / 4.0" a "Trident / 5.0", consente ai siti Web di distinguere tra IE9 in esecuzione in Compat View e IE8 in esecuzione in Compat View .

(enfasi aggiunta da me). Quindi la stringa del programma utente è la stessa che riporta di essere "Mozilla / 4.0" e MSIE 7.0, ma IE9 sarà sempre Trident / 5.0 - non importa se dice MSIE 7.0, MSIE 8.0 o MSIE 9.0.

In realtà dovresti dare un'occhiata a questa fantastica raccolta: Stringhe ID browser (agente utente) o ancora meglio useragentstrings.com


1
Ciao moontear. Ho anche visto che "Trident / 5.0" dovrebbe essere presente quando IE9 è in modalità IE7, ma non è quello che vedo sul mio (finale) IE9 su Win7 Pro x64. Non mostra alcun tridente in modalità IE7 (che è l'aspetto reale di IE7) e mostra il tridente 4 in modalità IE8 (di nuovo, come appare il vero IE8). Sto utilizzando il menu a discesa degli strumenti per sviluppatori di IE9 per selezionare la modalità browser e poi nella barra degli indirizzi avviso javascript: alert (navigator.userAgent)
Dee2000

1
"Trident / 5.0" è presente nella stringa user-agent di IE9 in tutte le modalità.
EricLaw

Come dice EricLaw, Dee. Trident / 5.0 deve essere presente quando si utilizza la modalità di compatibilità (potrebbe essere diverso per la modalità browser?). Come controlli la stringa dell'agente utente? Prova a controllare tramite whatsmyuseragent.com e fai rapporto.
Dennis G

Vedi la mia risposta di seguito (ho dovuto usare un altro id Dee2001 a causa di una regola di 8 ore di overflow dello stack sull'aggiunta di una risposta al tuo messaggio). Sì, Eric e Moontear hanno entrambi ragione, Trident / 5.0 è presente in tutte le modalità di IE9. Il mio grosso errore è stato cambiare la "Modalità browser" in IE7 o IE8 negli strumenti per sviluppatori, ma non è una "modalità" che una pagina / meta tag / elenco di compatibilità può applicare. Invece sta davvero simulando i browser stessi, quindi naturalmente la stringa useragent è davvero come IE7 / 8.
Dee2000

1
Questo è perfetto! Grazie mille. Non ho stile in base al browser segnalato ma sto impostando una barra di avviso nella parte superiore del sito su cui sto lavorando che dice che l'utente deve eseguire l'aggiornamento (se i tag condizionali dicono che è inferiore o uguale a ie7) - Non voglio che il messaggio dica l'aggiornamento in questo caso, ma piuttosto disabilita la modalità di compatibilità
Chelsea Urquhart

47

document.documentMode è il modo migliore per la modalità documento.


17
Si prega di espandere un po 'la risposta. Più contesto.
random_user_name

3
Perché le persone non lo aggiungono, è esattamente ciò di cui ha bisogno
Jamie Hutber

5
Questo è davvero il modo migliore. Si può usare in questo modo: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. Il vero (!) IE7 e tutti i non IE restituiscono "indefinito", solo IE8 / 9 in Comp. modalità di ritorno 7. Non riesco a testare IE10, ma dovrebbe essere lo stesso.
Frank Conijn

2
Ho appena provato questo in IE10 su un lato con il tag META sul bordo; normalmente, restituisce "10". Forza l'attivazione della modalità di compatibilità per tutti i siti e restituisce ancora "10".
Whelkaholism

Funziona per me in IE10 e IE11 Preview
Simon Keep

20

IE7 non contiene alcuna informazione su Trident

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

IE8 contiene questa stringa: "Trident / 4.0"

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

IE9 contiene questa stringa: "Trident / 5.0"

IE9 in modalità compatibilità:

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

IE9 in modalità normale:

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

1
È fantastico, IE10 incrementa anche Trident?
slotishtype

3
Internet Explorer 10 utenti Trident / 6.0 .... vedi blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype

1
e IE11 utilizza Trident / 7.0
Dee2000


11

Spero che IE9 abbia alcune proprietà esistenti e testabili indipendentemente dal fatto che sia in modalità 7, 8 o 9.

Controlla ad esempio style.opacity , è stato introdotto in IE9 ed è disponibile indipendentemente dalla modalità di compatibilità:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>

1
Grazie dottor Molle, proverò e riferirò.
Dee2000

Sfortunatamente funziona solo per la modalità browser (il menu a discesa a sinistra negli strumenti per sviluppatori di IE9). Non funziona per la modalità Documento (il menu a discesa a destra). Per la modalità documento, funziona solo in modalità documento IE9. Se è in modalità IE8, IE7 o Quirks, quella logica fallisce.
Dee2000

7
Dannazione, hai ragione. Ho trovato un'altra proprietà, funziona per me in tutte le modalità: window.performance
Dr.Molle

@ Dee2000: funziona anche per me con DocumentMode. Cioè SOLO se DocumentMode = "Internet Explorer 9 standard" ha esito positivo questo test.
Niklas Bäckman

@ Dr.Molle, grazie per questo, window.performance fa bene il lavoro.
lewsid

3

A volte è necessario leggere la stringa dell'agente utente dalla variabile del server, non dall'oggetto del navigatore javascript.

Confronta le differenze:

  • ASP classico, IE11

    • javascript client, navigator.userAgent: " Mozilla / 5.0 (compatibile; 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) come Gecko "

  • ASP classico, modalità di compatibilità IE11 :

    • javascript client, navigator.userAgent: " Mozilla / 5.0 (compatibile; 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 (compatibile; 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) "


0

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

Supponendo che tu abbia un elemento nascosto con l'ID compat-warning:

Javascript con 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();
});

Rilevamento e avvertimenti, la tua prima e ultima linea di difesa contro l'inferno della compatibilità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.