2008-09-19 6 views
10

¿Cuál es la mejor manera de/simple/más preciso para detectar el navegador de un usuario?navegador

Facilidad de extensibilidad e implementación es un plus.

Las tecnologías utilizadas menos, mejor.

La solución puede ser del lado del servidor, del lado del cliente o de ambos. Sin embargo, los resultados finalmente deberían terminar en el servidor.

La solución puede ser marco agnóstico.

La solución solo se utilizará para generar informes.

+3

No es realmente una respuesta, pero es posible que desee leer http://www.webaim.org/blog/user-agent-string-history/. Si nada más, es realmente divertido. – dsm

Respuesta

12

En el servidor que está bastante limitado a la cadena de agente de usuario proporciona el navegador (que está plagado de problemas, tienen una lectura acerca de la UserAgent string's history).

En el cliente (es decir, en Javascript), tiene más opciones. Pero la mejor opción es no preocuparse por averiguar qué navegador es. Simplemente verifique para asegurarse de que existe la función que desea utilizar.

Por ejemplo, es posible que desee utilizar setCapture, que sólo ofrece MSIE:

if (element.setCapture) element.setCapture() 

En lugar de elaboración de lo que es el navegador, y luego inferir sus capacidades, simplemente estamos viendo si es compatible con algo antes de usarlo, ¿quién sabe qué navegadores soportarán qué en el futuro, realmente desea tener que volver atrás y actualizar sus scripts si Safari decide admitir setCapture?

+0

Realmente disfruté (y aprendí mucho) de la publicación de blog del historial de cadenas de Useragent. – billmalarky

+0

Gran respuesta. Mientras que muchos todavía confían en los comentarios condicionales o en el rastreo del navegador, siempre es mejor para una web con visión de futuro si simplemente busca la detección de características. A medida que los estándares web progresan y los navegadores adoptan nuevas funcionalidades sobre las versiones anteriores de las especificaciones, incluso confiar en un navegador específico puede hacer que su sitio web determine incorrectamente que un sitio es capaz de manejar la funcionalidad deseada. La detección de funciones es la única forma de determinar que su sitio funcionará ahora y en el futuro. Gracias por compartir la respuesta simple y precisa. – tobint

6

El JQuery Browser Plugin lo hará por el lado del cliente.

¿Qué es el complemento jQuery Browser?

El navegador jQuery Plugin es un complemento para jQuery que hace que sea fácil de identificar de forma única los navegadores de sus visitantes.

¿Qué hace?

Le da un objeto en javascript que contiene toda la información sobre el navegador que se está utilizando. También agrega selectores CSS del navegador, lo que significa que puede estilo de elementos o escribir funciones para navegadores específicos, versiones de navegadores, diseños, versiones de diseño, y incluso sistemas operativos. Imagen del plugin jQuery Browser en acción.

El plug-in hace $.browser disponibles, que se puede volver a presentar a su servidor a través de una llamada AJAX, si realmente lo necesita en el servidor.

alert($.browser.name); // Alerts Firefox for me 

Sin embargo, el plug-in solo será tan efectivo como los navegadores contra los que se haya probado. El plugin mencionado anteriormente tiene una lista de browsers recognised in it's tests, pero siempre existe el riesgo de que un nuevo navegador llegará a escondidas (Google Chrome..) que requerirá una re-escritura de las reglas de reconocimiento. Dicho esto, este complemento parece actualizarse regularmente.

+0

ewww jQuery upvote malo por buena respuesta. – Prospero

1

Como acabo de publicar esto en una (pregunta ahora eliminada) y todavía está en mi búfer de pegado, voy a volver a publicar. Nota: esta es una solución PHP del lado del servidor

Actualmente uso el siguiente código para esto. No es una solución casi extenuante, pero debería ser fácil implementar más navegadores. No sabía acerca de user-agents.org (gracias PConroy), "uno de estos días" Lo revisaré y veré si puedo actualizar y agregar a mi lista.

define("BROWSER_OPERA","Opera"); 
define("BROWSER_IE","IE"); 
define("BROWSER_OMNIWEB","Omniweb"); 
define("BROWSER_KONQUEROR","Konqueror"); 
define("BROWSER_SAFARI","Safari"); 
define("BROWSER_MOZILLA","Mozilla"); 
define("BROWSER_OTHER","other"); 

$aBrowsers = array 
(
    array("regexp" => "@Opera(/|)([0-9].[0-9]{1,2})@", "browser" => BROWSER_OPERA, "index" => 2), 
    array("regexp" => "@MSIE ([0-9].[0-9]{1,2})@", "browser" => BROWSER_IE, "index" => 1), 
    array("regexp" => "@OmniWeb/([0-9].[0-9]{1,2})@", "browser" => BROWSER_OMNIWEB, "index" => 1), 
    array("regexp" => "@(Konqueror/)(.*)(;)@", "browser" => BROWSER_KONQUEROR, "index" => 2), 
    array("regexp" => "@Safari/([0-9]*)@", "browser" => BROWSER_SAFARI, "index" => 1), 
    array("regexp" => "@Mozilla/([0-9].[0-9]{1,2})@", "browser" => BROWSER_MOZILLA, "index" => 1) 
); 

foreach($aBrowsers as $aBrowser) 
{ 
    if (preg_match($aBrowser["regexp"], $_SERVER["HTTP_USER_AGENT"], $aBrowserVersion)) 
    { 
    define("BROWSER_AGENT",$aBrowser["browser"]); 
    define("BROWSER_VERSION",$aBrowserVersion[$aBrowser["index"]]); 
    break; 
    } 
} 
+1

Gracias por reenviar. La pregunta borrada obviamente no era muy buena. – Jrgns

+0

La pregunta en sí obtuvo un par de votos negativos por alguna razón, el solicitante debe haber decidido no tomar ningún riesgo adicional en su representante. ¡Puede ser molesto cuando has puesto un poco de pensamiento en una respuesta! – ConroyP

+0

Comenzó a bajar, y me di cuenta de que la pregunta podía estar mejor formateada, así que la eliminé. Perdón por la pérdida de respuestas ... – Jrgns

2

Al usar javascript: No utilice la detección del navegador

Escribir código que pone a prueba en sí para los casos dados exhibidos por los navegadores, de lo contrario, simplemente estará escribiendo código para una población muy pequeña. Es mejor utilizar "typeof foo == 'undefined'" y trucos específicos del navegador donde los necesite.

jQuery hace esto todo lo largo de su código base (si nos fijamos en el código verás que la implementación de comportamientos para diferentes tecnologias navegador)

Su mejor en el largo plazo.

+0

Si desea rendimiento, la ejecución de cheques puede ser costosa. Hay algunos casos en los que saber de antemano qué técnicas usar es mejor que utilizar la comprobación de errores y cambiar el rumbo cada vez que te encuentres con una. –

+1

La pregunta no era sobre por qué o por qué no utilizar una técnica en particular, sino sobre cómo implementar mejor la técnica que había elegido. Por lo que usted sabe, él no quiere detectar navegadores para darle forma al sitio, puede querer que registre las estadísticas del navegador. –

-1

para Internet Explorer y hojas de estilo que puede utilizar la siguiente sintaxis:

<!--[if lte IE 6]><link href="/style.css" rel="stylesheet" type="text/css" /><![endif]--> 

Este applys a IE 6 o anterior. Puede cambiar la versión de IE y también tienen:

<!--[if eq IE 7]> = Equal too IE 7 
<!--[if gt IE 6]> = Greater than IE 6 

No estoy seguro si esto funciona con otras partes de la página, pero funciona cuando se coloca dentro de la etiqueta <head>. Ver este example para más información

+0

Este fue un mecanismo probado y verdadero para las versiones de IE anteriores (ver: http://www.quirksmode.org/css/condcom.html). Esto ha sido privado a favor de la detección de características. Consulte http://msdn.microsoft.com/en-us/library/ms537512%28v=VS.85%29.aspx donde dice específicamente: * "** Importante ** A partir de Internet Explorer 10, comentarios condicionales ya no son compatibles con el modo estándar. Use la detección de características para proporcionar estrategias de respaldo efectivas para las características del sitio web que no son compatibles con el navegador. Para más información sobre el modo estándar, consulte Definición de compatibilidad de documentos. "* – tobint

0

No utilice la detección del navegador:

  • detección navegador no es fiable al 100% en el mejor de los casos, pero las cosas se ponen peor que esto:
  • Hay un montón de variantes de los navegadores (personalizaciones de MSIE, etc)
  • navegadores pueden mentir sobre su identidad (Opera en realidad tiene esta función incorporada)
  • Gateways ocultar o ofuscar la identidad del navegador
  • Los vendedores de personalización y puerta de enlace escriben sus propios desperdicios en USER_AGENT

Es mejor hacer la detección de características en el cliente-script. Es de esperar que solo necesites detección de navegador para solucionar un error en un navegador y una versión específicos.

+1

La pregunta no era por qué o por qué no utilizar una técnica en particular, sobre cómo implementar mejor la técnica que eligió. Por lo que usted sabe, él no quiere detectar navegadores para darle forma al sitio, puede querer que registre las estadísticas del navegador. –

0

Originalmente hice la pregunta porque quiero poder registrar los navegadores y los sistemas de operaciones que las personas usan para acceder a mi sitio.Sí, no se puede confiar en la cadena del agente de usuario, y sí, no se debe usar la detección del navegador para determinar qué código ejecutar en JS, pero me gustaría tener las estadísticas más precisas posibles.

hice lo siguiente.

estoy usando una combinación de JavaScript y PHP para registrar las estadísticas. JavaScript para determinar qué navegador y sistema operativo (ya que esto es probablemente el más preciso), y PHP para grabarlo:

La JavaScript proviene de Quirksmode, el PHP es bastante evidente. Yo uso el framework MooTools JS.

Añadir lo siguiente a la secuencia de comandos BrowserDetect:

window.addEvent('domready', function() { 
    if (BrowserDetect) { 
     var q_data = 'ajax=true&browser=' + BrowserDetect.browser + '&version=' + BrowserDetect.version + '&os=' + BrowserDetect.OS; 
     var query = 'record_browser.php' 
     var req = new Request.JSON({url: query, onComplete: setSelectWithJSON, data: q_data}).post(); 
    } 
}); 

Esto determina el navegador, la versión del navegador y el sistema operativo del navegador del usuario, y la envía a la secuencia de comandos record_browser.php. El script record_browser.php acaba de agregar la información, junto con el PHP session_id y el user_id actual, si está presente.

MySQL tabla: Código

CREATE TABLE `browser_detects` (
    `id` int(11) NOT NULL auto_increment, 
    `session` varchar(255) NOT NULL default '', 
    `user_id` int(11) NOT NULL default '0', 
    `browser` varchar(255) NOT NULL default '', 
    `version` varchar(255) NOT NULL default '', 
    `os` varchar(255) NOT NULL default '', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `sessionUnique` (`session`) 
) 

PHP:

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    $session = session_id(); 
    $user_id = isset($user_id) ? $user_id ? 0; 
    $browser = isset($_POST['browser']) ? $_POST['browser'] ? ''; 
    $version = isset($_POST['version']) ? $_POST['version'] ? ''; 
    $os = isset($_POST['os']) ? $_POST['os'] ? ''; 
    $q = $conn->prepare('INSERT INTO browser_detects (`session`, `user`, `browser`, `version`, `os`) VALUES (:session :user, :browser, :version, :os)'); 
    $q->execute(array(
        ':session' => $session, 
        ':user' => $user_id, 
        ':browser' => $browser, 
        ':version' => $version, 
        ':os' => $os 
       )); 
} 
-1

En general, cuando un navegador hace una petición, envía un montón de información (hora, fecha nombre, user-agent ...). Debería tratar de ver los encabezados que el cliente envió e ir al que le dice su navegador (creo que es "User-Agent").

0

Según lo expresado por muchos, la detección del navegador puede salir muy mal ... sin embargo, en interés de Código de golf.

Esta es una manera muy rápida para detectar IE.

<script> 
    if('\v'=='v'){ 
    alert('I am IE'); 
    } else { 
    alert('NOT IE'); 
    } 
</script> 

Su bastante limpio en realidad, ya que escoge IE sin tropezar sobre el Opera.

los puntos de bonificación si conoce por qué esto funciona en IE. ;-)

0

Editar: La solución a continuación no se recomienda. Pruebe esto en su lugar: http://whichbrowser.net/

Esto una vez funcionó para mí, pero mirando el código ahora, no tengo idea de cómo. Usar la anterior en su lugar: -/

<script type="text/javascript"> 
    // <![CDATA[ 
    var BrowserCheck = Class.create({ 
     initialize: function() { 
      var userAgent = navigator.userAgent.toLowerCase(); 
      this.version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1]; 
      this.safari = /webkit/.test(userAgent) && !/chrome/.test(userAgent); 
      this.opera = /opera/.test(userAgent); 
      this.msie = /msie/.test(userAgent) && !/opera/.test(userAgent); 
      this.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent); 
      this.chrome = /chrome/.test(userAgent); 
     } 
    });  
    // ]]> 
</script> 

No se olvide que usted necesita para inicializar para usarlo, por lo que poner esto en su código:

var UserBrowser = new BrowserCheck(); 

y para verificar si un tipo de navegador y versión de esta manera: (por ejemplo, Internet Explorer 8)

if ((UserBrowser.msie == true) && (UserBrowser.version == 8)) 

etc.

espero que hace el trabajo para usted como lo ha para nosotros, pero recuerde que ninguna detección de navegador es a prueba de balas!

+0

En IE9 obtengo 'La clase no está definida.' a través de la consola. – mrswadge

+0

@mrswadge Sí, tengo el mismo problema. Lo siento por eso. Pruebe esto en su lugar: http://whichbrowser.net/ –

+0

@mrswadge Parece que usa la biblioteca Prototype. No tengo idea de por qué una vez funcionó para mí. –

0

Este es el código de C# que uso, espero que sea útil.

StringBuilder strb = new StringBuilder(); 
strb.AppendFormat ("User Agent: {0}{1}", Request.ServerVariables["http_user_agent"].ToString(), Environment.NewLine); 
strb.AppendFormat ("Browser: {0}{1}", Request.Browser.Browser.ToString (), Environment.NewLine); 
strb.AppendFormat ("Version: {0}{1}", Request.Browser.Version.ToString (), Environment.NewLine); 
strb.AppendFormat ("Major Version: {0}{1}", Request.Browser.MajorVersion.ToString (), Environment.NewLine); 
strb.AppendFormat ("Minor Version: {0}{1}", Request.Browser.MinorVersion.ToString (), Environment.NewLine); 
strb.AppendFormat ("Platform: {0}{1}", Request.Browser.Platform.ToString (), Environment.NewLine); 
strb.AppendFormat ("ECMA Script version: {0}{1}", Request.Browser.EcmaScriptVersion.ToString (), Environment.NewLine); 
strb.AppendFormat ("Type: {0}{1}", Request.Browser.Type.ToString (), Environment.NewLine); 
strb.AppendFormat ("-------------------------------------------------------------------------------{0}", Environment.NewLine); 
strb.AppendFormat ("ActiveX Controls: {0}{1}", Request.Browser.ActiveXControls.ToString (), Environment.NewLine); 
strb.AppendFormat ("Background Sounds: {0}{1}", Request.Browser.BackgroundSounds.ToString (), Environment.NewLine); 
strb.AppendFormat ("AOL: {0}{1}", Request.Browser.AOL.ToString (), Environment.NewLine); 
strb.AppendFormat ("Beta: {0}{1}", Request.Browser.Beta.ToString (), Environment.NewLine); 
strb.AppendFormat ("CDF: {0}{1}", Request.Browser.CDF.ToString (), Environment.NewLine); 
strb.AppendFormat ("ClrVersion: {0}{1}", Request.Browser.ClrVersion.ToString (), Environment.NewLine); 
strb.AppendFormat ("Cookies: {0}{1}", Request.Browser.Cookies.ToString (), Environment.NewLine); 
strb.AppendFormat ("Crawler: {0}{1}", Request.Browser.Crawler.ToString (), Environment.NewLine); 
strb.AppendFormat ("Frames: {0}{1}", Request.Browser.Frames.ToString (), Environment.NewLine); 
strb.AppendFormat ("Tables: {0}{1}", Request.Browser.Tables.ToString (), Environment.NewLine); 
strb.AppendFormat ("JavaApplets: {0}{1}", Request.Browser.JavaApplets.ToString (), Environment.NewLine); 
strb.AppendFormat ("JavaScript: {0}{1}", Request.Browser.JavaScript.ToString (), Environment.NewLine); 
strb.AppendFormat ("MSDomVersion: {0}{1}", Request.Browser.MSDomVersion.ToString (), Environment.NewLine); 
strb.AppendFormat ("TagWriter: {0}{1}", Request.Browser.TagWriter.ToString (), Environment.NewLine); 
strb.AppendFormat ("VBScript: {0}{1}", Request.Browser.VBScript.ToString (), Environment.NewLine); 
strb.AppendFormat ("W3CDomVersion: {0}{1}", Request.Browser.W3CDomVersion.ToString (), Environment.NewLine); 
strb.AppendFormat ("Win16: {0}{1}", Request.Browser.Win16.ToString (), Environment.NewLine); 
strb.AppendFormat ("Win32: {0}{1}", Request.Browser.Win32.ToString (), Environment.NewLine); 
strb.AppendFormat ("-------------------------------------------------------------------------------{0}", Environment.NewLine); 
strb.AppendFormat ("MachineName: {0}{1}", Environment.MachineName, Environment.NewLine); 
strb.AppendFormat ("OSVersion: {0}{1}", Environment.OSVersion, Environment.NewLine); 
strb.AppendFormat ("ProcessorCount: {0}{1}", Environment.ProcessorCount, Environment.NewLine); 
strb.AppendFormat ("UserName: {0}{1}", Environment.UserName, Environment.NewLine); 
strb.AppendFormat ("Version: {0}{1}", Environment.Version, Environment.NewLine); 
strb.AppendFormat ("UserInteractive: {0}{1}", Environment.UserInteractive, Environment.NewLine); 
strb.AppendFormat ("UserDomainName: {0}{1}", Environment.UserDomainName, Environment.NewLine);