Il modo migliore per verificare IE meno di 9 in JavaScript senza libreria

Quale sarebbe il modo più veloce, il più breve (il migliore) per rilevare il browser che è IE e la versione inferiore a 9 in JavaScript, senza utilizzare jQuery o eventuali librerie aggiuntive?

Javascript

var ie = (function(){ var undef, v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i'); while ( div.innerHTML = '', all[0] ); return v > 4 ? v : undef; }()); 

Puoi quindi fare:

 ie < 9 

Di James Panolsey da qui: http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments

per quello che vale:

  if( document.addEventListener ){ alert("you got IE9 or greater"); } 

Questo ha scelto con successo IE 9+ perché il metodo addEventListener era supportato molto presto per tutti i principali browser, ma IE. (Chrome, Firefox, Opera e Safari) Riferimento MDN . Attualmente è supportato in IE9 e possiamo aspettarci che continui a essere supportato qui in uscita.

Utilizzando i commenti condizionali, è ansible creare un blocco di script che verrà eseguito solo in IE meno di 9.

  

Ovviamente, è ansible precedere questo blocco con un blocco universale che dichiara var is_ie_lt9=false , che questo sovrascriverà per IE meno di 9. (In tal caso, si vorrebbe rimuovere la dichiarazione var , in quanto sarebbe ripetitiva) .

EDIT : Ecco una versione che non si basa su blocchi di script in linea (può essere eseguito da un file esterno), ma non utilizza lo sniffing di user-agent:

Via @cowboy :

 with(document.createElement("b")){id=4;while(innerHTML="",innerHTML>0);var ie=id>5?+id:0} 

bah ai commenti condizionali! Codice condizionale fino in fondo !!! (sciocco IE)

  

Seriamente, butta fuori tutto questo nel caso ti si addica meglio ... sono la stessa cosa, questo può essere solo in un file .js invece che inline HTML

Nota: è del tutto casuale che qui il controllo jscript_version sia "9". Impostandolo su 8, 7, ecc NON si verificherà "is IE8", avresti bisogno di cercare le versioni jscript per quei browser.

Di seguito è riportato un miglioramento rispetto alla soluzione di James Padolsey:

1) Non inquina la memoria (James snippet crea 7 frammenti di documenti non rimossi quando rileva IE11, ad esempio).
2) È più veloce poiché controlla un valore documentMode prima di generare markup.
3) È molto più leggibile, soprattutto per iniziare i programmatori JavaScript.

Link Gist: https://gist.github.com/julianshapiro/9098609

 /* - Behavior: For IE8+, we detect the documentMode value provided by Microsoft. - Behavior: For  0; i--) { var div = document.createElement("div"); div.innerHTML = ""; if (div.getElementsByTagName("span").length) { return i; } } } return undefined; })(); 
 var ie = !-[1,]; // true if IE less than 9 

Questo hack è supportato in ie5,6,7,8. È fisso in ie9 + (quindi soddisfa le esigenze di questa domanda). Questo hack funziona in tutte le modalità di compatibilità IE.

Come funziona : vale a dire il motore tratta array con elemento vuoto (come questo [, 1]) come array con due elementi, invece altri browser pensano che ci sia solo un elemento. Quindi quando convertiamo questo array in numero con operatore + facciamo qualcosa del genere: (‘, 1’ in ie / ‘1’ negli altri) * 1 e otteniamo NaN in ie e 1 in altri. Di quanto lo trasformiamo in valore booleano e inverso con! Semplice. Tra l’altro possiamo usare la versione più breve senza! firmare, ma il valore sarà invertito.

Questo è il più breve hack ormai. E io sono l’autore;)

Ho deciso di andare con il rilevamento degli oggetti, invece.

Dopo aver letto questo: http://www.quirksmode.org/js/support.html e questo: http://diveintohtml5.ep.io/detect.html#canvas

Userei qualcosa di simile

 if(!!document.createElement('canvas').getContext) alert('what is needed, supported'); 

Questo link contiene informazioni rilevanti sul rilevamento di versioni di Internet Explorer:

http://tanalin.com/en/articles/ie-version-js/

Esempio:

 if (document.all && !document.addEventListener) { alert('IE8 or older.'); } 

Potresti farlo in modo rapido e sporco con un’espressione regolare e .match() :

 if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) { // ie less than version 9 } 

Se fossi in te, userei la compilazione condizionale o il rilevamento di funzionalità.
Ecco un’altra alternativa:

    

Deve essere fatto in JavaScript?

In caso contrario, è ansible utilizzare la syntax dei commenti condizionali specifica per IE:

  

Mi è piaciuta la risposta di Mike Lewis ma il codice non ha superato jslint e non ho capito il funky loop. Il mio caso d’uso è di pubblicare un messaggio browser non supportato se inferiore o uguale a IE8.

Ecco una versione gratuita di jslint basata su Mike Lewis:

 /*jslint browser: true */ /*global jQuery */ (function () { "use strict"; var browserNotSupported = (function () { var div = document.createElement('DIV'); // http://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx div.innerHTML = ''; return div.getElementsByTagName('I').length > 0; }()); if (browserNotSupported) { jQuery("html").addClass("browserNotSupported").data("browserNotSupported", browserNotSupported); } }()); 
 if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) { // IE8 or less } 
  • estrai la versione di IE con: /MSIE\s(\d+)/.exec(navigator.userAgent)
  • se è un browser non IE questo restituirà null , in tal caso ||0 cambierà quel valore null a 0
  • [1] otterrà la versione principale di IE o undefined se non fosse un browser IE
  • leading + lo convertirà in un numero, undefined verrà convertito in NaN
  • il confronto di NaN con un numero restituirà sempre false

State tutti provando a complicare eccessivamente queste cose semplici. Basta usare un commento condizionale JScript semplice e semplice. È il più veloce perché aggiunge il codice zero ai browser non IE per il rilevamento e ha compatibilità risalente alle versioni di IE prima che i commenti condizionali HTML fossero supportati. In breve,

 var IE_version=(-1/*@cc_on,@[email protected]*/); 

Attenzione ai minificatori: la maggior parte (se non tutti) confonderà il commento condizionale speciale per un commento regolare e lo rimuoverà

Fondamentalmente, quindi il codice sopra imposta il valore di IE_version alla versione di IE che stai usando, oppure -1 f non stai usando IE. Una dimostrazione dal vivo:

 var IE_version=(-1/*@cc_on,@[email protected]*/); if (IE_version!==-1){ document.write("

You are using Internet Explorer " + IE_version + "

"); } else { document.write("

You are not using a version of Internet Explorer less than 11

"); }