2012-09-21 7 views
5

Voglio un pezzo di Javascript da eseguire se il browser non è IE o è IE 9+. Se il browser è IE8 o una versione precedente, dovrebbe essere eseguito un altro pezzo di Javascript.Come far funzionare il tuo javascript in modo condizionale, a seconda del browser?

Ho cercato di usare Conditional Comments:

<!--[if (!IE)|(gte IE 9)]> 
    <script type="text/javascript"> /* code 1 */ </script> 
<![endif]--> 

<!--[if (lt IE 9)]> 
    <script type="text/javascript"> /* code 2 */ </script> 
<![endif]--> 

Ma IE6 e IE7 ancora erano in esecuzione codice 1. E Firefox stava eseguendo il codice codice 2 ...

No jQuery, per favore.

Modifica: In realtà, la mia espressione condizionale era errata. Ma è andato ancora con il rilevamento delle funzioni proposto nella risposta scelta.

+4

In genere è molto, molto meglio fare il rilevamento delle funzioni rispetto al rilevamento del browser. Quindi, se si descrive quale funzione si desidera utilizzare in IE9 e altri browser, ma non in IE8 o in basso, è possibile utilizzare un rilevamento di funzionalità in fase di esecuzione che in genere è più accurato del rilevamento del browser. – jfriend00

+0

Voglio usare document.getElementByClass(), che è disponibile solo in IE8 + –

risposta

5

Dal tuo commento, suona come si sta solo cercando di decidere se è possibile utilizzare document.getElementsByClassName(). Se questo è il caso, è possibile utilizzare il rilevamento caratteristica come questa:

if (document.getElementsByClassName) { 
    // code here that uses getElementsByClassName 
} else { 
    // code here that doesn't use getElementsByClassName 
} 

Si può essere più pulito per installare solo un polyfill in modo che si può utilizzare in vecchie versioni di IE senza dover controllare prima. Ci sono un numero di loro disponibili che puoi trovare con una ricerca su Google. Ecco one:

// Add a getElementsByClassName function if the browser doesn't have one 
// Limitation: only works with one class name 
// Copyright: Eike Send http://eike.se/nd 
// License: MIT License 

if (!document.getElementsByClassName) { 
    document.getElementsByClassName = function(search) { 
    var d = document, elements, pattern, i, results = []; 
    if (d.querySelectorAll) { // IE8 
     return d.querySelectorAll("." + search); 
    } 
    if (d.evaluate) { // IE6, IE7 
     pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]"; 
     elements = d.evaluate(pattern, d, null, 0, null); 
     while ((i = elements.iterateNext())) { 
     results.push(i); 
     } 
    } else { 
     elements = d.getElementsByTagName("*"); 
     pattern = new RegExp("(^|\\s)" + search + "(\\s|$)"); 
     for (i = 0; i < elements.length; i++) { 
     if (pattern.test(elements[i].className)) { 
      results.push(elements[i]); 
     } 
     } 
    } 
    return results; 
    } 
} 
0

È possibile eseguire questa operazione con un controllo in javascript anziché uno in HTML. In JS si ha la proprietà navigator.userAgent che restituisce una stringa univoca per ogni browser (e persino IE nelle sue diverse versioni di compatibilità). Quindi, vorrei suggerire di eseguire l'intero blocco JS in tutti i browser e semplicemente aggiungere qualcosa di simile aggiungere la parte superiore di esso:

if(navigator.userAgent.indexOf('MSIE 9.0') !== -1) 
{ 
    // call IE9 specific method 
} 
else 
{ 
    // call method for other browsers 
} 

Per un approccio più sofisticato vedere questo post navigator.userAgent

+1

Questo non gestisce IE 10, 11, 12, 13, ecc ... e non implementa la logica richiesta dall'OP. Inoltre, il rilevamento delle funzionalità è probabilmente un modo molto più intelligente per risolvere questo problema. – jfriend00

0

Come afferma jfriend00 funzione di rilevamento potrebbe essere una soluzione migliore ma ecco i commenti condizionali che soddisfano le tue esigenze.

<!--[if gte IE 9]> --> 
    <script type="text/javascript"> alert('ie9+ and not ie') </script> 
<!-- <![endif]--> 
<!--[if lt IE 9]> 
    <script type="text/javascript"> alert(' < ie9') </script> 
<![endif]--> 

http://jsfiddle.net/szF4J/1/

Problemi correlati