5

Al investigar los comentarios condicionales de JavaScript para IE, me encontré con @cc_on. Esto parece funcionar Sin embargo, el wikipedia entry en los comentarios condicionales proporciona el código siguiente para obtener más robustos detecciones de IE, específicamente IE6:/* @ cc_on y detección de IE6

/*@cc_on 
    @if (@_jscript_version > 5.7) 
    document.write("You are using IE8+"); 

    @elif (@_jscript_version == 5.7 && window.XMLHttpRequest) 
    document.write("You are using IE7"); 

    @elif (@_jscript_version == 5.6 || (@_jscript_version == 5.7 && !window.XMLHttpRequest)) 
    document.write("You are using IE6"); 

    @elif (@_jscript_version == 5.5) 
    document.write("You are using IE5.5"); 

    @else 
    document.write("You are using IE5 or older"); 

@end 

@*/ 

La cuestión es, estoy recibiendo una "espera constante" javascript error en !window.XMLHttpRequest.

Claramente, Wikipedia necesita ayuda, y necesito hacerlo funcionar. ¿Puede alguien ayudarme?

+0

"más robustos detecciones IE"? Creo que los comentarios condicionales proporcionan la forma más robusta de detección de IE posible. ** No ** confíe en la versión de JScript para determinar la versión de IE, ya que son independientes. Consulte el punto 4 de http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html#c1774947112904387635 Además, no debe usar la detección del navegador en absoluto ; use detección de características: http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/ –

+1

@_jscript_version detección debe usarse solo si conoce la diferencia exacta entre el versiones del motor jscript y desea apuntar a esa diferencia de alguna manera, por ejemplo, emular una característica faltante. Por ejemplo, jscript 5.1 no tenía definidos los métodos call/apply de Function, ni tenía Array.prototype.push. Por lo tanto, es seguro detectar esta @_jscript_version y agregar soporte programático para estas características. Sin embargo, como dijo Marcel, no es seguro suponer que @_jscript_version de 5.1 se asigna a IE5.01 ya que puede obtener fácilmente jscript actualizado de Windows Update. –

+1

@Vitaly: no quiero criticar demasiado, pero los ejemplos que dio se pueden probar con la detección de características, por lo que no tiene que probar también la versión de Javascript> = 1.3 o algo así. Solo use 'if (! Function.prototype.call) {Function.prototype.call = foo; } ', etc., como lo hace Oz.js: http://code.google.com/p/oz-js/source/browse/trunk/oz.js#224 –

Respuesta

4

Definitivamente ningún experto JS, pero algunas búsquedas encontraron esta para aislar IE6 de Internet Explorer 7 utilizando jscript_version == 5.7:

/*@cc_on 
if (@_jscript_version==5.6 || 
    (@_jscript_version==5.7 && 
     navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1)) { 
    //ie6 code 
} 
@*/ 

Tal vez le señalará en la dirección correcta.

Fuente: http://sharovatov.wordpress.com/2009/06/03/efficient-ie-version-targeting/

+0

Me gustaría aclarar esto un poco, pero tienes razón. El problema fue tratar de invocar el JavaScript normal dentro de los opperadores de comentarios condicionales precompilados "@elif", etc. Cuando precompila la versión de jscript y ejecuta todo lo demás como JavaScript tradicional, las cosas se compilan y ejecutan sin problemas. – Jack

+0

@Marcel Korpel: ¿has leído mi blog al que se está refiriendo JBickford? userAgent check se usa * dentro * bloque de compilación condicional (aplicado solo a IEs) y no hay otra manera de determinar la diferencia entre IE7 que tiene jscript 5.7 e IE6 en Windows XP SP3 que también tiene jscript 5.7. –

+0

@Vitaly: Tengo que admitir que no leí su artículo y fui un poco duro en mi comentario original, por lo que me disculpo (y eliminé el comentario). Tiene sentido que puede detectar de forma segura la versión de IE en un bloque de compilación condicional (y eso sería suficiente, también es innecesaria la comprobación de la versión de JScript), y la * detección del navegador * es necesaria para comprobar las posibilidades ': hover' (no pueden ser detectados, por lo que sé), pero creo que el uso de comentarios condicionales es una forma más clara de hacer esto. Dicho esto, en la mayoría de los casos, podrías y deberías usar la detección de funciones. –

3

he encontrado una solución. El código es el siguiente.

<script type="text/javascript" charset="utf-8"> 
/*@cc_on 
if (@_jscript_version > 5.7) 
document.write("You are using IE8"); 
else if (@_jscript_version == 5.7 && window.XMLHttpRequest) 
document.write("You are using IE7"); 
else if (@_jscript_version == 5.6 || (@_jscript_version == 5.7 && !window.XMLHttpRequest)) 
document.write("You are using IE6"); 
else if (@_jscript_version == 5.5) 
document.write("You are using IE5.5"); 
else 
document.write("You are using IE5 or older"); 
@*/ 
</script> 
+1

¿Estás ciego? Ese es el mismo pedazo de código que incluyó en su pregunta. –

+7

Hola Josh, cambié @if ... @ elif ... @ else ... @ end to if ... else if ... else. Encontré algún código en @if ... @ elif ... @ else ... @ end no se ejecutará correctamente, como la parte ** window.XMLHttpRequest **. Pero funciona bien en declaraciones normales. –

2

He estado usando este bonito de una sola línea desde hace años:

var IE; //@cc_on IE = parseFloat((/MSIE[\s]*([\d\.]+)/).exec(navigator.appVersion)[1]); 

pequeña y precisa (probado en IE 6-10).

Nota para quienes usan ronco. asegúrese de establecer preserveComments: 'algunos' si usa el complemento uglify para asegurarse de que los comentarios condicionales no se eliminen.

+0

¿Dónde encontraste este lindo trazador de líneas? – yckart

+0

@yckart Lo escribí. Puedes ver mi última versión en https://github.com/willfarrell/angular-io/blob/master/src/scripts/ie.js que incluye una verificación de chromeframe (que será innecesaria en enero de 2014, debido a la fama de Chrome no más tiempo se mantiene). –

0

tal vez un poco tarde a la fiesta, pero también me encontré con este problema, pasamos de maravilla en ella y mi solución fue la siguiente, espero que ayude https://github.com/davesmiths/isIE

var isIE = false; 
/*@cc_on isIE = @_jscript_version;@*/ 
if (isIE !== false) { 
    if (isIE == 5.8) 
     isIE = 8; 
    else if (isIE == 5.7 && window.XMLHttpRequest) 
     isIE = 7; 
    else if (isIE == 5.7 || isIE == 5.6) 
     isIE = 6; 
    else if (isIE <= 5.5) 
     isIE = 5; 
}