Come rilevo IE 8 con jQuery?


102

Devo rilevare non solo il tipo di browser ma anche la versione utilizzando jQuery. Per lo più ho bisogno di scoprire se è IE 8 o no.

Non sono sicuro di farlo correttamente.

Se lo faccio:

if (jQuery.browser.version >= 8.0) {
dosomething}

Non sono sicuro che funzionerà per la versione 8.123.45.6 o lo farà?

Modifica: nota che JQuery 2+ ha abbandonato il supporto per IE8 e versioni precedenti e quindi non può più essere utilizzato per rilevare IE8. Se si utilizza una versione corrente di JQuery, è necessario utilizzare una soluzione non JQuery.


11
le risposte suggerite di seguito suggeriscono di utilizzare jQuery.browser. Tuttavia, la documentazione di jQuery depreca l'uso di jQuery.browser. Invece, ti suggeriscono di utilizzare jQuery.support e puntare a una funzionalità che non è supportata per contrassegnare il browser. Ad esempio, puoi utilizzare if (jQuery.support.opacity == false) {your IE8 and IE7 code}
IberoMedia,

Questo ha jquery.support.opacityfatto solo quello che volevo. Grazie ...
nrod


Se stai facendo le cose correttamente, non dovresti quasi mai aver bisogno di rilevare la versione del browser. C'è un motivo per cui questa funzione è stata rimossa da jQuery, e questo motivo è che il rilevamento della versione del browser è una cattiva pratica. L'uso del rilevamento delle funzionalità risolverà invece il problema in quasi tutti i casi.
Spudley

2
Devo rilevare IE8 perché è l'unico browser il cui motore javascript è così lento che fa apparire una finestra di dialogo che dice "vuoi interrompere l'esecuzione dello script" su questa pagina e l'impostazione predefinita è "sì". Se esiste un meccanismo di rilevamento delle funzionalità per questo, lo userò. Altrimenti è se browser == IE8. Non posso ottimizzare il javascript, perché è il codice treeview di Kendo che lo causa
PandaWood

Risposte:


79

È documentato nella documentazione dell'API jQuery . Verificare la presenza di Internet Explorer con $.browser.msiee quindi verificare la sua versione con$.browser.version .

AGGIORNAMENTO: $ .browser rimosso in jQuery 1.9

Il metodo jQuery.browser () è stato deprecato da jQuery 1.3 ed è stato rimosso nella 1.9. Se necessario, è disponibile come parte del plug-in jQuery Migrate. Si consiglia di utilizzare il rilevamento delle funzionalità con una libreria come Modernizr.


se lo faccio: if (jQuery.browser.version> = 8.0) {dosomething} Non sono sicuro che funzionerà per la versione 8.123.45.6 o lo farà?
salmane

13
È una stringa, quindi dovresti farlo if(jQuery.browser.version.substring(0, 2) == "8.") { ... }. In questo modo funzionerà con tutte le versioni di IE8.
AndiDog

13
jQuery.browserè stato deprecato nella 1.3 e potrebbe essere spostato in un plugin in futuro. Vedi i documenti di jQuery.browser
bendytree

Per fortuna è ancora in giro e non si parla di deprecazione, @bendytree
Alastair

47
jquery.browser è stato rimosso nella versione 1.9
Mandeep Jain il

173

Penso che il modo migliore sarebbe questo:

Da HTML5 boilerplate:

<!--[if lt IE 7]> <html lang="en-us" class="no-js ie6 oldie"> <![endif]-->
<!--[if IE 7]>    <html lang="en-us" class="no-js ie7 oldie"> <![endif]-->
<!--[if IE 8]>    <html lang="en-us" class="no-js ie8 oldie"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en-us" class="no-js"> <!--<![endif]-->

in JS:

if( $("html").hasClass("ie8") ) { /* do your things */ };

soprattutto da quando $.browserè stato rimosso da jQuery 1.9+.


11
Questo è un modo molto intelligente per rilevare le versioni di IE. Mi piace molto!
Greg

ma non funziona se il tuo sito web viene fornito con l'intestazione "Content-type: application / xhtml + xml", quindi questi commenti condizionali vengono ignorati
philipp

1
Molto intelligente ... ma vale la pena notare che è necessario controllare le classi correnti aggiunte dai condizionali in HTML5BP. Al momento penso che la classe sia lt-ie9AOTie8
byronyasgur

2
@meo Anche a me piace questa implementazione. Ma c'è un motivo per cui la classe è attaccata <html>invece di <body>?
riposo il

@meo interessante. Grazie.
riposo il

89

Questo dovrebbe funzionare per tutte le versioni minori di IE8

if ($.browser.msie  && parseInt($.browser.version, 10) === 8) {
  alert('IE8'); 
} else {
  alert('Non IE8');
}

-- aggiornare

Tieni presente che $ .browser è stato rimosso da jQuery 1.9


56

Non dimenticare che puoi anche utilizzare HTML per rilevare IE8.

<!--[if IE 8]>
<script type="text/javascript">
    ie = 8;
</script>
<![endif]-->

Averlo prima di tutti i tuoi script ti permetterà semplicemente di controllare la variabile "ie" o qualsiasi altra cosa.


4
Questa sintassi supporta anche i comparatori "minore di" ("[if lt IE 7]") e "maggiore di" ("[if gt IE 8]").
spiffytech

1
<! - [if lte IE 8]> per includere ie8
user227353

1
Questo è il modo migliore per farlo, basta reindirizzare a un'altra pagina che dice "Perché stai usando IE8?" AGGIORNA ORA!
Leon Gaban

2
Secondo gli standard odierni, chiederei loro perché utilizzano IE.
TheBuzzSaw

Questa sembra la soluzione migliore ora poiché JQuery 2.1.1 non funziona con IE8 e quindi non può essere utilizzata per rilevare IE8!
Dave

27

document.documentMode non è definito se il browser non è IE8,

restituisce 8 per la modalità standard e 7 per "compatibile con IE7"

Se è in esecuzione come IE7, ci sono molte funzionalità CSS e dom che non saranno supportate.


9
Nota che IE9 restituisce 9. Questa dovrebbe essere una risposta più votata, però, ora che $ .browser non è più una buona soluzione. Prova:if ((document.documentMode || 100) < 9) { // IE8
Don McCurdy

if (document.documentMode! == undefined && document.documentMode == 8) {...}
jpprade

Per alcune applicazioni in cui IE8 è ancora molto in uso, ovvero le scuole statunitensi, l'approccio di @ Don McCurdy è sia semplice che efficace. In tandem con Modernizr funziona bene.
cbmtrx

Bella risposta! Questo restituisce i numeri di versione da IE8 a IE11 (rispetto a IE5 fino a IE9 per i commenti condizionali - se qualcuno ha ancora bisogno di rilevare anche IE7 o IE6 autentici, dovrai usare commenti condizionali). Si noti che secondo i documenti potrebbe tornare 0durante il caricamento della pagina - "provare a determinare la modalità di compatibilità del documento in un secondo momento" (cioè dopo che il documento è pronto).
user56reinstatemonica8

15

Assumendo ...

  • ... che è il motore di rendering crunky delle vecchie versioni di IE che ti interessa rilevare, per far sembrare uno stile giusto nel vecchio IE (altrimenti, usa il rilevamento delle funzionalità)
  • ... che non puoi semplicemente aggiungere commenti condizionali all'HTML , ad esempio per i plugin JS che possono essere applicati a qualsiasi pagina (altrimenti, fai semplicemente il trucco delle classi condizionali su <body>o <html>)

... allora questo è probabilmente il miglior trucco (basato su questa variante non jQuery, leggermente meno flessibile ). Crea quindi test per quindi rimuove un commento condizionale appropriato.

(I commenti condizionali vengono ignorati nella 'modalità standard' di IE10 +, ma dovrebbe andare bene poiché la 'modalità standard' di IE10 + non ha un motore di rendering pazzo!)

Rilascia questa funzione:

function isIE( version, comparison ){
    var $div = $('<div style="display:none;"/>');

    // Don't chain these, in IE8 chaining stops some versions of jQuery writing the conditional comment properly
    $div.appendTo($('body'));
    $div.html('<!--[if '+(comparison||'')+' IE '+(version||'')+']><a>&nbsp;</a><![endif]-->');

    var ieTest = $div.find('a').length;
    $div.remove();
    return ieTest;
}

Quindi usalo in questo modo:

if(isIE()){ /* runs in all versions of IE after 4 before standards-mode 10 */ }

if(isIE(8)){ /* runs in IE8 */ }

if(isIE(9)){ /* runs in IE9 */ }

if(isIE(8,'lte')){ /* runs in IE8 or below */ }

if(isIE(6,'lte')){ /* if you need this, I pity you... */ }

Suggerirei anche di memorizzare nella cache i risultati di questa funzione in modo da non doverla ripetere. Ad esempio, potresti usare la stringa (comparison||'')+' IE '+(version||'')come chiave per memorizzare e controllare il risultato di questo test in un oggetto da qualche parte.


9

Nota:

1) $ .browser sembra essere rilasciato in jQuery 1.9+ (come notato da Mandeep Jain). Si consiglia invece di utilizzare .support .

2) $ .browser.version può restituire "7" in IE> 7 quando il browser è in modalità "compatibilità".

3) A partire da IE 10, i commenti condizionali non funzioneranno più.

4) jQuery 2.0+ verrà rilasciato supporto per IE 6/7/8

5) document.documentMode sembra essere definito solo nei browser Internet Explorer 8+. Il valore restituito ti dirà in quale modalità di "compatibilità" è in esecuzione Internet Explorer. Tuttavia non è ancora una buona soluzione.

Ho provato numerose opzioni .support (), ma sembra che quando un browser IE (9+) è in modalità di compatibilità, si comporterà semplicemente come IE 7 ... :(

Finora ho scoperto che funziona solo (tipo a):

(se documentMode non è definito e htmlSerialize e opacity non sono supportati, allora molto probabilmente stai guardando IE <8 ...)

if(!document.documentMode && !$.support.htmlSerialize && !$.support.opacity) 
{
    // IE 6/7 code
}

5

Se giocherelli con le versioni del browser, molto spesso non va bene. Non vuoi implementarlo da solo. Ma puoi Modernizr realizzato da Paul Irish e altre persone intelligenti. Rileverà ciò che il browser può effettivamente fare e inserirà classi appropriate in <html>element. Tuttavia con Modernizr , puoi testare la versione di IE in questo modo:

$('html.lt-ie9').each() {
    // this will execute if browser is IE 8 or less
}

Allo stesso modo, puoi usare .lt-ie8e .lt-ie7.


3

Dovresti anche guardare jQuery.support . Il rilevamento delle funzionalità è molto più affidabile del rilevamento del browser per la codifica della funzionalità (a meno che non si stia solo tentando di registrare le versioni del browser).


3
come usereste jQuery.support per rilevare IE8?
BishopZ

se AJAX è quello che stai cercando, puoi usare jQuery.support.ajax che restituisce true se il browser supporta AJAX
Jonathan Lin

Questa risposta dovrebbe aiutare: stackoverflow.com/questions/1944169/...
helgatheviking

3

Puoi facilmente rilevare il tipo e la versione del browser, usando questo jquery

$(document).ready(function()
{
 if ( $.browser.msie ){
    if($.browser.version == '6.0')
    {   $('html').addClass('ie6');
    }
    else if($.browser.version == '7.0')
    {   $('html').addClass('ie7');
    }
    else if($.browser.version == '8.0')
    {   $('html').addClass('ie8');
    }
    else if($.browser.version == '9.0')
    {   $('html').addClass('ie9');
    }
 }
 else if ( $.browser.webkit )
 { $('html').addClass('webkit');
 }
 else if ( $.browser.mozilla )
 { $('html').addClass('mozilla');
 }
 else if ( $.browser.opera )
 { $('html').addClass('opera');
 }
});

1

Ecco il plug-in di rilevamento del browser Jquery per identificare il rilevamento del browser / sistema operativo.

Puoi usarlo per lo stile dopo aver incluso il plugin.

$("html").addClass($.os.name);
$("body").addClass($.browser.className);
$("body").addClass($.browser.name);

0

Puoi utilizzare $ .browser per rilevare il nome del browser. i valori possibili sono:

  • webkit (a partire da jQuery 1.4)
  • safari (obsoleto)
  • musica lirica
  • MSIE
  • mozilla

o ottieni un flag booleano: $ .browser.msie sarà vero se il browser è MSIE.

per quanto riguarda il numero di versione, se sei interessato solo al numero di versione principale, puoi usare parseInt ($. browser.version, 10). non è necessario analizzare da soli la stringa $ .browser.version.

Ad ogni modo, la proprietà $ .support è disponibile per il rilevamento del supporto per funzionalità particolari piuttosto che fare affidamento su $ .browser.

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.