2008-10-16 14 views
14

Estoy acostumbrado a usar Atlas. Recientemente comencé a hacer la transición a jQuery y, en ocasiones, a prototipos. El proyecto en el que estoy trabajando actualmente es usando un prototipo.Navegador y versión en la biblioteca de prototipos?

En Prototype, ¿hay alguna manera fácil de obtener el nombre y la versión del navegador? Revisé la documentación de la API y parece que no puedo encontrarla.

+0

Y, aparte, entiendo los inconvenientes de la codificación hacia un navegador específico y su versión, en contraposición a la codificación hacia 'características' disponibles. – EvilSyn

+0

Más fregado, y veo Prototype.Browser que me dará boolean en IE o Gecko, etc. Así que eso ayuda ... Sería bueno si también tuviera la versión allí, pero supongo que puedo escribir un JS antiguo simple para eso . – EvilSyn

Respuesta

3

Tiene razón: el prototipo no proporciona una utilidad para determinar el nombre o la versión del navegador.

Si específicamente necesita para obtener la información del navegador como un plugin, sugeriría añadiendo lo siguiente (tomado directamente de jQuery):

var Browser = Class.create({ 
    initialize: function() { 
    var userAgent = navigator.userAgent.toLowerCase(); 
    this.version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1]; 
    this.webkit = /webkit/.test(userAgent); 
    this.opera = /opera/.test(userAgent); 
    this.msie = /msie/.test(userAgent) && !/opera/.test(userAgent); 
    this.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent); 
    } 
}); 
+2

Eres algo incorrecto, Prototype proporciona una utilidad para adivinar el nombre del navegador como se muestra a continuación. Y adivinar es realmente lo mejor que puede hacer, ya que cualquier navegador puede mentir sobre su cadena de agente de usuario. – nertzy

+0

Esta es una gran solución, gracias.(Funciona mejor que Prototype, que solo distingue entre IE, Opera, WebKit, MobileSafari y Gecko, y sin números de versión sin codificarlo usted mismo). –

+0

Agregando la línea: this.chrome = /chrome/.test (userAgent) ; agrega reconocimiento por ... lo adivinaste. (Nota: También debe agregar: "&&!/Chrome/.test (userAgent);" a la línea de Safari.) –

7

Prototype ofrece algunas banderas se puede comprobar para tener una idea en cuanto a qué navegador se está ejecutando. Tenga en cuenta que es una práctica mucho mejor comprobar la funcionalidad que desea utilizar en lugar de buscar un navegador en particular.

Aquí es la parte en navegador y la función de detección de prototype.js actualmente en el árbol de fuentes:

var Prototype = { 
    Browser: { 
    IE:  !!(window.attachEvent && 
     navigator.userAgent.indexOf('Opera') === -1), 
    Opera: navigator.userAgent.indexOf('Opera') > -1, 
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, 
    Gecko: navigator.userAgent.indexOf('Gecko') > -1 && 
     navigator.userAgent.indexOf('KHTML') === -1, 
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) 
    }, 

    BrowserFeatures: { 
    XPath: !!document.evaluate, 
    SelectorsAPI: !!document.querySelector, 
    ElementExtensions: !!window.HTMLElement, 
    SpecificElementExtensions: 
     document.createElement('div')['__proto__'] && 
     document.createElement('div')['__proto__'] !== 
     document.createElement('form')['__proto__'] 
    }, 
} 

Así se puede comprobar si el navegador actual es IE investigando el valor de Prototype.Browser.IE, o alternativamente, más compatible con el futuro y verifique una característica particular como XPath con Prototype.BrowserFeatures.XPath.

18

Como conclusión a la respuesta de nertzy puede agregar la capacidad para detectar las versiones de IE que utilizan este:

Prototype.Browser.IE6 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6; 
Prototype.Browser.IE7 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 7; 
Prototype.Browser.IE8 = Prototype.Browser.IE && !Prototype.Browser.IE6 && !Prototype.Browser.IE7; 

Por otra parte hay que detectar los detalles del agente de usuario en el lado del servidor, también. De todos modos, la detección del navegador es una estrategia seriamente defectuosa para escribir scripts entre navegadores, que solo debe usarse cuando falla la detección de características del navegador. Es bastante fácil para un usuario alterar los detalles de su agente de usuario.

+0

Por favor, no es que esta respuesta no se ocupe de IE9 (ya que probablemente aún no existía) cuando fue publicado). –

+0

Supongo que menos del 10% de los usuarios no saben cómo cambiar su agente de usuario, así que supongo que no es una mala estrategia –

+0

¡Es necesario actualizar la última línea para IE9! Prototype.Browser.IE8 devuelve verdadero cuando se utiliza la última versión del impresionante navegador. – jmlnik

2

que tienen prototype.js extendidas después:

var Prototype = { ... }; 

con esto:

// extension 
if (Prototype.Browser.IE) { 
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { 
     Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1); 
    } 
} 

funciona bien para mí, es como vocación:

if (Prototype.Browser.IE && Prototype.BrowserFeatures['Version'] == 8) { ... } 
3

utilizo esto una y encima de las definiciones del navegador de Prototype.

Object.extend(Prototype.Browser, { 
    ie6: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 6 ? true : false) : false, 
    ie7: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 7 ? true : false) : false, 
    ie8: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 8 ? true : false) : false, 
    ie9: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 9 ? true : false) : false 
}); 

Espero que ayude!

0
  <script type="text/JavaScript"> 

       function getBrowserVersion() 
       { 
        var msg = "Not Recognised Browser"; 

        if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) 
        { 
         var ffversion = new Number(RegExp.$1) 

         for (var i = 1; i < 20; i++) 
         { 
          if (ffversion == i) 
          { 
           msg = "FF" + i + "x"; 
           break; 
          } 
         } 
        } 
        else if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) 
        { 
         var ieversion = new Number(RegExp.$1) 

         for (var i = 1; i < 20; i++) 
         { 
          if (ieversion == i) 
          { 
           msg = "IE" + i + "x"; 
           break; 
          } 
         } 
        } 

        alert(msg); // return msg; 
       } 

      </script> 
+0

Las respuestas con solo el código no son buenas. Por favor explica la respuesta junto con tu código. –

Cuestiones relacionadas