una ternario sola operador linea condicionales abreviado javascript internet-explorer browser-detection conditional-comments

javascript - sola - operador ternario c++



Javascript IE detección, ¿por qué no utilizar comentarios condicionales simples? (15)

¿Por qué no solo programa en HTML5 y comprueba que

if ( window.navigator.product !== "Gecko" )

?? Es cierto, esto incluirá IE11 en el grupo "Gecko", pero ¿no se supone que es lo suficientemente bueno ahora?

Nota: la especificación HTML5. dice que navigator.product debe devolver "Gecko" ... e IE10 y anteriores todos devuelven algo más.

Para detectar IE, la mayoría de las librerías de Javascript hacen todo tipo de trucos.

  • jQuery parece agregar un objeto temporal al DOM de tus páginas para detectar algunas características,
  • YUI2 regex en el agente de usuario en su YAHOO.env.ua = function() (archivo yahoo.js )

Después de leer esta respuesta, me vino a la mente que es cierto, para detectar simplemente IE en Javascript, simplemente podríamos agregar a nuestras páginas:

<!--[if IE]><script type="text/javascript">window[''isIE''] = true;</script><![endif]--> <script type="text/javascript" src="all-your-other-scripts-here.js"></script>

Ahora la variable window.isIE se establece para todo nuestro código Javascript, simplemente haciendo:

if(window.isIE) ...

Además del hecho de que esto podría resultar en un problema porque debe ser agregado en todas las páginas, ¿hay algún problema / consideración que pueda desconocer?

FYI: Sé que es mejor usar la detección de objetos en lugar de la detección del navegador , pero hay casos en los que aún tiene que usar la detección del navegador.



Comprobar los navegadores es una mala idea; en cambio, es mejor verificar las características del navegador. Por ejemplo, generalmente verifica si el usuario está usando IE porque quiere usar alguna característica no admitida en IE. Sin embargo, ¿puedes saber que TODOS los navegadores actuales y futuros que no sean IE admitirán esa función? No. Por lo tanto, la forma en que jQuery lo utiliza es mejor: crea y ejecuta testcases pequeños para verificar ciertos errores / características, y simplemente puede verificar cosas como si (browser_supports_XYZ) en lugar de verificar si el usuario está usando un navegador específico.

De todos modos, siempre hay casos en que es necesario verificar el navegador porque es un error visual que no se puede probar con un script. En este caso, es mejor usar javascript en lugar de comentarios condicionales porque tienes el buscador en el lugar donde lo necesitas en lugar de hacerlo en otro lugar (imagina un archivo .js donde compruebas que no está definido en ese archivo). )


Creo que respondiste tu propia pregunta: primero, solo detecta IE, por lo que el script en esencia estaría dividiendo el universo de navegadores en 2 partes: IE y <everythingelse>.

En segundo lugar, tendría que agregar un comentario raro a cada página HTML. Dado que las bibliotecas de JavaScript de gran alcance como jQuery y YUI tienen que ser "fáciles" de insertar / utilizar para una gran cantidad de sitios, automáticamente harías que sea más difícil usarlas fuera de la puerta.


Creo que tengo lo que estás buscando. Puede obtener la versión completa de Internet Explorer como una cadena "AA.BB.CCCC.DDDD" utilizando JavaScript y clientCaps.

http://www.pinlady.net/PluginDetect/IE/

Parece funcionar para IE 5.5 y superior (incluido IE 10). Es inmune al modo navigator.userAgent / document mode / browser. No hay necesidad de comentarios condicionales ni elementos HTML adicionales. Es una solución pura de Javascript.

No estoy seguro en este momento de cómo se comporta IE Mobile, pero siempre puedes utilizar un método de detección de respaldo en caso de que este método clientCaps falle.

Hasta ahora, tengo que decir que funciona bastante bien.


Esto funciona bastante bien,
var isIe = !!window.ActiveXObject;


Estoy usando ese código

var isIE = navigator.userAgent.indexOf (''MSIE'')> -1;


IE 11 ha cambiado mucho y ahora muchos métodos pasados ​​de detección de navegador no funcionan. El siguiente código funciona para IE 11 y versiones anteriores.

function isIE() { var isIE11 = navigator.userAgent.indexOf(".NET CLR") > -1; var isIE11orLess = isIE11 || navigator.appVersion.indexOf("MSIE") != -1; return isIE11orLess; }


James Padolsey puso un pequeño fragmento en GitHub que citaré aquí:

// ---------------------------------------------------------- // A short snippet for detecting versions of IE in JavaScript // without resorting to user-agent sniffing // ---------------------------------------------------------- // If you''re not in IE (or IE version is less than 5) then: // ie === undefined // If you''re in IE (>=5) then you can determine which version: // ie === 7; // IE7 // Thus, to detect IE: // if (ie) {} // And to detect the version: // ie === 6 // IE6 // ie > 7 // IE8, IE9 ... // ie < 9 // Anything less than IE9 // ---------------------------------------------------------- // UPDATE: Now using Live NodeList idea from @jdalton var ie = (function(){ var undef, v = 3, div = document.createElement(''div''), all = div.getElementsByTagName(''i''); while ( div.innerHTML = ''<!--[if gt IE '' + (++v) + '']><i></i><![endif]-->'', all[0] ); return v > 4 ? v : undef; }());

Por supuesto, todos los créditos deberían ir a James, solo soy el mensajero (pero por favor dispara al messenger si mi acción de copiar y pegar se equivocó).

También mire las horquillas que se crearon. Paul Irish explicó el funcionamiento interno en un comment .


La respuesta de Marcel Korpel ya no funciona (en IE 10 devuelve undef, por lo que IE 10 parece no ser IE). NOTA: ahora actualizado para trabajar con IE 11 también.

Esta es una variante de ese código, pero que proviene de las recomendaciones de Microsoft . Si estaba usando el código anterior, puede agregar este reemplazo ya que está diseñado para ser llamado de la misma manera.

A diferencia de los comentarios / compilación condicional, también debería funcionar bien con los minimizadores.

// ---------------------------------------------------------- // If you''re not in IE (or IE version is less than 5) then: // ie === undefined // If you''re in IE (>=5) then you can determine which version: // ie === 7; // IE7 // Thus, to detect IE: // if (ie) {} // And to detect the version: // ie === 6 // IE6 // ie > 7 // IE8, IE9, IE10 ... // ie < 9 // Anything less than IE9 // ---------------------------------------------------------- var ie = (function(){ var undef,rv = -1; // Return value assumes failure. var ua = window.navigator.userAgent; var msie = ua.indexOf(''MSIE ''); var trident = ua.indexOf(''Trident/''); if (msie > 0) { // IE 10 or older => return version number rv = parseInt(ua.substring(msie + 5, ua.indexOf(''.'', msie)), 10); } else if (trident > 0) { // IE 11 (or newer) => return version number var rvNum = ua.indexOf(''rv:''); rv = parseInt(ua.substring(rvNum + 3, ua.indexOf(''.'', rvNum)), 10); } return ((rv > -1) ? rv : undef); }());

actualizado para trabajar con IE11. Gracias ''acarlon'' por señalar que no estaba funcionando, y ''mario'' por el código en el que basé la corrección.


Para mi caso de uso, realmente solo necesito detectar si es menor que IE9, entonces uso

if (document.body.style.backgroundSize === undefined && navigator.userAgent.indexOf(''MSIE'') > -1) { //IE8- stuff }


Si quieres hacerlo de esa manera, creo que es mucho mejor usar la compilación condicional, ya que puedes hacerlo dentro de javascript sin necesidad de cambiar el html:

var isIE = /*@cc_on!@*/false;


navigator.userAgent existe si la detección del navegador (en lugar de la detección de características) es realmente necesaria, y jQuery la usa para obtener la información del objeto $.browser . Es mucho más agradable que tener que incluir un comentario condicional específico de IE en cada página.



  • Contamina el espacio de nombres global
  • Requiere cambios en dos archivos.
  • Funciona solo en IE
  • Técnicamente, un comentario condicional sigue siendo un comentario