2012-09-21 5 views
5

Quiero ejecutar un fragmento de Javascript si el navegador no es IE o si es IE 9+. Si el navegador es IE8 o una versión inferior, se debe ejecutar otra parte de Javascript.¿Cómo hacer que su Javascript se ejecute condicionalmente, dependiendo del navegador?

He intentado utilizar 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]--> 

Pero IE6 y IE7 todavía estaban ejecutar código . Y Firefox estaba ejecutando código 2 ...

No jQuery, por favor.

Edit: En realidad, mi expresión condicional era incorrecta. Pero todavía fue con la detección de características propuestas en la respuesta elegida.

+4

En general, es mucho, mucho mejor hacer la detección de funciones que la detección del navegador. Por lo tanto, si describe qué característica desea usar en IE9 y otros navegadores, pero no en IE8 y abajo, entonces puede usar una detección de funciones en tiempo de ejecución que generalmente es más precisa que la detección de navegadores. – jfriend00

+0

Quiero usar document.getElementByClass(), que solo está disponible en IE8 + –

Respuesta

5

Desde su comentario, parece que usted está tratando de decidir si se puede usar document.getElementsByClassName(). Si ese es el caso, puede utilizar la detección de características como esto:

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

Puede ser más limpio que acaba de instalar un polyfill para que pueda usarlo en versiones antiguas de IE sin tener que comprobar en primer lugar. Hay varios disponibles que puedes encontrar con una búsqueda en Google. Aquí está 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

Puede hacer esto mejor mediante un control dentro de javascript en lugar de uno en HTML. En JS tiene la propiedad navigator.userAgent que devuelve una cadena única para cada navegador (e incluso IE en sus diferentes versiones de compatibilidad). Así que yo sugeriría para ejecutar todo el bloque JS en todos los navegadores y simplemente añadir algo como esto añadir la parte superior de la misma:

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

Para un enfoque más sofisticado ver este post navigator.userAgent

+1

Esto no maneja IE 10, 11, 12, 13, etc. ... y no implementa la lógica que el OP solicitó. Además, la detección de características es probablemente una forma mucho más inteligente de resolver este problema. – jfriend00

0

Como estados jfriend00 función de detección puede ser una solución mejor, pero aquí están los comentarios condicionales que satisfacen sus requisitos.

<!--[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/

Cuestiones relacionadas