2010-02-04 14 views

Respuesta

31

comentarios condicionales son una buena alternativa:

<!--[if IE 6]> 
<script> 
var everythingIsBroken = true; 
</script> 
<![endif]--> 

Editar: Si todavía está buscando para apoyar el IE 6 en 2017 o después. .. bueno, mi corazón está contigo. La respuesta a esta pregunta en 2017 es realmente no preocuparse por IE 6. Ya no es un navegador compatible. Cualquier sistema operativo que pueda ejecutar este navegador y el propio navegador ya no recibe actualizaciones de seguridad. Esto significa que los usuarios que usan este software corren un gran riesgo de ser explotados. Este es un gran problema para las personas que no pueden darse el lujo de actualizar.

+0

¿Es esta una respuesta seria? – TIMEX

+7

Debería ser.Los comentarios condicionales son algo introducido por Microsoft como una forma de ejecutar solo cierto código en (versiones específicas de) IE. Debido a que están en comentarios HTML, otros navegadores lo ignorarán. – Aistina

+2

Los comentarios condicionales no son una alternativa viable. Mientras trabajan en IE directamente, se pueden desactivar en otro navegador similar cuando se utiliza el Control WebBrowser. En ese caso, su comentario condicional se vuelve inútil. La mayoría de los navegadores de terceros que usan el motor Trident4 tienen comentarios condicionales desactivados. –

6
var ua = window.navigator.userAgent; 
    var msie = ua.indexOf ("MSIE "); 

    if (msie > 0)  // If Internet Explorer, return version number 
    return parseInt (ua.substring (msie+5, ua.indexOf (".", msie))); 
    else     // If another browser, return 0 
    return 0; 

Fuente: http://support.microsoft.com/kb/167820

+1

-1: Nunca use user-agent para identificar un navegador. Use la detección basada en características en su lugar. –

+0

¿Por qué cuál es el motivo? ¡quedó bien en IE, FF y Chrome! –

+0

@Yassir: Hay muchos navegadores usando el mismo motor (Trident 4) que MSIE 6. El uso de la detección de características frente a la detección del agente de usuario las detecta. También tiene menos falsos positivos que la detección del agente de usuario (una gran cantidad de navegadores tienen la opción de cambiar su UA para que pase como otro navegador). –

5

No base su detección en el agente de usuario. Hay muchos otros navegadores que usan el motor Trident 4 (el que usa IE6) que no son IE6.

La respuesta es sencilla: no detectan el navegador , detectar el motor . Para hacer eso, debe usar lo que se llama detección basada en características.


Uso de la detección basada característica tiene las siguientes ventajas:

  • detecta todos los navegadores utilizando motor de representación similar a objetivo.
  • Codificación de código más fácil para evitar problemas de un motor de renderizado.
  • Menos falsos positivos (los UA pueden modificarse para pasar como otro navegador, las características no pueden).

La siguiente secuencia de comandos utiliza las características del navegador para detectar el motor. Crédito al equipo de producción de MooTools (http://mootools.net/developers/).

Nota: El siguiente fragmento se ha modificado para funcionar sin el marco de JavaScript MooTools. Si desea trabajar con MooTools, ya no necesita este código, es parte de la distribución.

function $tryCatch(){ 
    for (var i = 0, l = arguments.length; i < l; i++){ 
     try { 
      return arguments[i](); 
     } catch(e){} 
    } 
    return null; 
}; 

var Browser = { 

    Engine: {name: 'unknown', version: 0}, 

    Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()}, 

    Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)}, 

    Plugins: {}, 

    Engines: { 

     presto: function(){ 
      return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); 
     }, 

     trident: function(){ 
      return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); 
     }, 

     webkit: function(){ 
      return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419); 
     }, 

     gecko: function(){ 
      return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18); 
     } 

    } 

}; 

Browser.Platform[Browser.Platform.name] = true; 

Browser.detect = function(){ 

    for (var engine in this.Engines){ 
     var version = this.Engines[engine](); 
     if (version){ 
      this.Engine = {name: engine, version: version}; 
      this.Engine[engine] = this.Engine[engine + version] = true; 
      break; 
     } 
    } 

    return {name: engine, version: version}; 

}; 

Browser.detect(); 

Browser.Request = function(){ 
    return $tryCatch(function(){ 
     return new XMLHttpRequest(); 
    }, function(){ 
     return new ActiveXObject('MSXML2.XMLHTTP'); 
    }, function(){ 
     return new ActiveXObject('Microsoft.XMLHTTP'); 
    }); 
}; 

Browser.Features.xhr = !!(Browser.Request()); 

Browser.Plugins.Flash = (function(){ 
    var version = ($tryCatch(function(){ 
     return navigator.plugins['Shockwave Flash'].description; 
    }, function(){ 
     return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); 
    }) || '0 r0').match(/\d+/g); 
    return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0}; 
})(); 

function $exec(text){ 
    if (!text) return text; 
    if (window.execScript){ 
     window.execScript(text); 
    } else { 
     var script = document.createElement('script'); 
     script.setAttribute('type', 'text/javascript'); 
     script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text; 
     document.head.appendChild(script); 
     document.head.removeChild(script); 
    } 
    return text; 
}; 

basta con incluir esta clase de JavaScript y se puede detectar IE6 y cualquier otro navegador usando el motor trident4 de la siguiente manera:

if(Browser.Engine.trident4) { 
    alert('IE6 or similar...'); 
} elseif(Browser.Engine.name == "trident") { 
    alert('Internet Explorer Trident Rendering Engine Version ' + Browser.Engine.version); 
} 
+2

Esto no parece ser la detección de características que está recomendando en sus comentarios a otras respuestas a esta pregunta. –

+0

@Tim Down: Dije detección de ** función ** basada, no detección de características. La detección basada en características intentó identificar un ** motor ** en función de las características implementadas en el motor de JavaScript de ese motor de representación particular. La detección de funciones le permite activar o desactivar las funciones en función de si se detectó como compatible. Conocer el motor utilizado para representar la página le permite corregir peculiaridades con la representación de elementos dinámicos en esa página. Este método también se llama detección basada en objetos. –

+4

Esta es la función de inferencia y escamosa. ¿Qué inferencias debería/debería hacer basándose en la existencia de 'document.getBoxObjectFor' o' window.mozInnerScreenX' o 'navigator.taintEnabled'? Si vas a utilizar estos para variar el comportamiento que no está relacionado con estos objetos que se están probando, es solo un pequeño paso adelante el examinar la cadena userAgent para mí. Estos objetos pueden ser reemplazados por JavaScript y generalmente no son estándar y por lo tanto están sujetos a los caprichos de los fabricantes de navegadores: MooTools fue picado por esto recientemente (http://ajaxian.com/archives/mootools-call-to-upgrade). –

1

¿Cuál es la mejor manera de detectar <browser_x> usando JavaScript?

By not.

Como ha mencionado Andrew Moore en los comentarios de esta publicación, debería utilizar la detección de características. Esto hará que su código sea más "a prueba de futuro".Si otro navegador incluye o ya no admite una función en el futuro, entonces su código estará seguro. Hay varios sitios que explican cómo manejar esto. El concepto es enorme y abarca una gran cantidad de conceptos, por lo que en lugar de escribir un ensayo/libro sobre esto, he aquí algunos recursos a utilizar:

+0

Digamos que hay un error de renderizado en una versión de navegador particular que desea solucionar, pero SÓLO apunte su solución a ese navegador y a su versión (por ejemplo, digamos que los fondos transparentes se representan incorrectamente en los botones o algo así). No existe la detección de características en ese escenario; no se puede "detectar la detección" de un error de representación. En el mundo real, no todas las peculiaridades de un navegador pueden detectarse mediante funciones, y no se puede simplemente asumir que las personas que preguntan sobre la detección del navegador tienen menos conocimiento que usted o no tienen una buena razón para hacerlo. – thomasrutter

+0

@thomasrutter No todos los errores de representación son imposibles de detectar. Pero, en general, los errores de representación son un problema de CSS que tiene su propio conjunto de estrategias que están separadas del JavaScript específico del navegador. Esta pregunta se refería específicamente a * JavaScript *, que * casi * nunca necesita detección de navegador si está escrito correctamente. El autor de la pregunta no era específico sobre el motivo por el que quería hacer la detección del navegador, y ya hay suficientes estrategias de detección de IE6 mencionadas aquí. He proporcionado una alternativa que el solicitante podría no haber tenido conocimiento de que funcionará mejor en el 90% de los casos. –

+0

Color me impresionó que volvieras a responder a un nuevo comentario en una publicación que hiciste hace más de 2 años :) – thomasrutter

0

No estoy seguro de si hay un motivo especial por el que desea detectar IE 6 pero, en general, es mejor tratar de detectar las características del navegador en lugar de detectarlo. Puede hacerlo fácilmente con JQuery utilizando jQuery.support: http://api.jquery.com/jQuery.support/.

+2

¿Es realmente una buena idea recomendar a alguien que use una biblioteca masiva de JavaScript o un marco para un problema simple que no requiere nada de el tipo de la solución? –

+0

No llamaría jQuery "masivo". Lo que el afiche pregunta cómo hacer es algo que prácticamente no se debe hacer, por lo que un consejo más valioso es por qué es eso y qué debe hacer él en su lugar para que siga una buena práctica de programación. – jhchen

26

En realidad el riesgo de responder a la pregunta que se hizo (y suponiendo por un momento el autor de la pregunta tiene una buena razón para detectar específicamente IE6):

if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) { 
    // yep, browser claims to be IE6 
} 
+9

+1 Gracias por responder realmente a la pregunta y no tener dudas acerca de por qué se debe usar la detección de funciones, la detección del navegador aún es completamente válida en algunos casos. – Lightweight

+3

La detección de características es preferible cuando la detección de características es realmente lo que desea hacer (que probablemente sea, en la mayoría de los casos, cuando las personas preguntan sobre la detección de navegadores). Sin embargo, cuando necesita aplicar un trabajo en busca de un error en una versión de navegador específica, la detección de características a menudo no es posible (por ejemplo, tal vez se trata de un error de representación, por lo que no se puede "detectar"). Si utiliza la detección de navegador basada en el agente de usuario, necesita asegurarse de que la expresión regular solo se dirige a la versión de buggy específica, y no a versiones futuras, o su código se romperá cuando las versiones futuras del navegador "corrijan" el error. – thomasrutter

+0

Mi razón para buscar esta información es detectar IE6 dentro de un archivo HTC, que ya está detectado defacto como Internet Explorer, pero IE6 e IE8, 9, 10, 11, 12. No requieren las mismas soluciones para arreglar CSS. Tu respuesta a la pregunta también responde mi pregunta. Me encantaría estar en un mundo en el que los navegadores IE funcionaran según los estándares, pero no lo estoy, y darles a esos usuarios páginas defectuosas no representa a las marcas con las que trabajo. Para bien o para mal, (sobre todo malo), tengo que lidiar con IE. – Wayne

2

además muy tarde.

Además de los comentarios condicionales HTML utilizados en apphacker's answer, JScript aplicación de Microsoft también proporciona conditional comments for JavaScript:

<script type="text/javascript"> 
    var isIE6 = /*@cc_on/*@if(@_jscript_version<=5.6)[email protected]@*/0/*@[email protected]*/; 

    if (isIE6) { 
     alert("You're screwed"); 
    } 
</script> 

Lo bueno es que también se puede utilizar en los archivos JavaScript externos (.js).

Para una tabla que enumera la versión de JScript que son implementados por las aplicaciones host de Microsoft: JavaScript Version Information

+0

Eso no es técnicamente comentarios condicionales: se llama compilación condicional y es un mecanismo separado. Tampoco es posible usarlo para detectar con precisión la versión de IE que se está ejecutando porque JScript se puede actualizar independientemente del navegador. –

3

La forma más confiable de hacer esto es utilizar los comentarios condicionales, como se ha mencionado por @apphacker. Sin embargo, algo que es aparentemente menos conocido es que los comentarios condicionales se pueden utilizar en JavaScript:

var div = document.createElement("div"); 
div.innerHTML = "<!--[if IE 6]><i></i><![endif]-->"; 
var isIe6 = (div.getElementsByTagName("i").length == 1); 

alert("Is IE 6: " + isIe6); 
0
<!--[if (IE 6)|(IE 7)]> 
<script> 
    alert("Lesser browser detected!"); 
</script> 
<![endif]--> 
Cuestiones relacionadas