Pergunta

O que é a melhor maneira / mais simples / mais preciso para detectar o navegador de um usuário?

Facilidade de extensibilidade e implementação é um plus.

As tecnologias menos usado, o melhor.

A solução pode ser do lado do servidor, do lado do cliente, ou ambos. Os resultados devem, eventualmente, acabar no servidor, no entanto.

A solução pode ser quadro agnóstico.

A solução será usado somente para fins de relatório.

Foi útil?

Solução

No servidor você está praticamente limitado à string UserAgent o navegador fornece (que é cheio de problemas, ter uma leitura sobre o história da corda UserAgent ).

No cliente (ou seja, em Javascript), você tem mais opções. Mas a melhor opção é não realmente preocupação sobre como trabalhar fora qual navegador é. Simplesmente certifique-se de tudo o recurso que você deseja usar realmente existe.

Por exemplo, você pode querer usar SetCapture, que só MSIE fornece:

if (element.setCapture) element.setCapture()

Ao invés de trabalhar para fora o que é o navegador, e depois inferir as suas capacidades, estamos simplesmente vendo se ele suporta algo antes de usá-lo - quem sabe o que navegadores irá apoiar o que, no futuro, você realmente quer ter que ir volta e atualizar seus scripts se Safari decide SetCapture suporte?

Outras dicas

O JQuery navegador Plugin vai fazê-lo do lado do cliente para você.

O que é o Navegador jQuery Plugin?

O Navegador de Plugin jQuery é um addon para jQuery que torna mais fácil para identificar exclusivamente navegadores dos seus visitantes.

O que ele faz?

Ele lhe dá um objeto em javascript que contém todas as informações sobre o navegador que está sendo usado. Ele também adiciona seletores navegador CSS, o que significa que você pode elementos de estilo ou funções de gravação para navegadores específicos, versões do navegador, layouts, versões de layout e até mesmo sistemas operacionais. Imagem do navegador jQuery Plugin em ação.

O plug-in marcas $.browser disponível, que você pode re-enviar para o servidor por meio de uma chamada de AJAX, se você realmente precisa dele do lado do servidor.

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

O plug-in só será tão eficaz como os navegadores tem sido testadas contra, no entanto. O plug-in listados acima tem uma lista de navegadores reconhecidos em sua testes , mas há sempre o risco que um novo navegador virá esgueirando-se ( Google Chrome .. ) que vai exigir uma re-gravação do regras de reconhecimento. Dito isto, este plug-in parece ser regularmente actualizado.

Ao usar javascript: Não use o navegador de detecção

Escrever código que os testes de si mesmo para casos dados exibidos por navegadores, caso contrário você vai ser simplesmente escrever código para uma muito, muito pequena população. Seus truques específicos melhor usar "typeof foo == 'undefined'" e do navegador onde você precisar deles.

jQuery faz isso todo o seu código base (se você olhar para o código que você vai vê-lo implementar comportamentos para diferentes tecnologias de navegador)

Seu melhor no longo prazo.

Desde que eu só postou isso em uma (questão agora suprimido) e ainda está na minha memória de reposição, eu só vou repost. Nota: esta é uma solução do lado do servidor PHP

Actualmente, eu uso o seguinte código para isso. Não é quase uma solução desgastante, mas deve ser fácil de implementar mais navegadores. Eu não sabia sobre user-agents.org (graças PConroy), "um destes dias" Eu 'laço ll através dele e ver se consigo atualizar e adicionar à minha 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;
  }
}

como Dan disse: depende da tecnologia utilizada.

Para a detecção do navegador do lado do servidor PHP eu recomendo a detecção do navegador de Harald Hope:

http://techpatterns.com/downloads/php_browser_detection.php

Publicado sob a GPL.

Não use a detecção do navegador:

  • detecção de navegador não é 100% confiável, o melhor dos tempos, mas as coisas ficam pior do que isso:
  • Existem muitas variantes de navegadores (MSIE personalizações etc)
  • Os navegadores podem mentir sobre sua identidade (Opera realmente tem esta funcionalidade built-in)
  • hide Gateways ou ofuscar a identidade do navegador
  • Personalização e fornecedores de gateway escrever seu próprio lixo no USER_AGENT

É melhor fazer a detecção de recurso no cliente-script. Você espero que só precisa de detecção de navegador para o trabalho em torno de um bug em um navegador e versão específica.

Eu originalmente fez a pergunta, porque eu quero ser capaz de gravar os navegadores e sistemas operacionais que as pessoas usam para acessar o meu site. Sim, a seqüência do agente do usuário não pode ser confiável, e sim, você não deve usar a detecção do navegador para determinar o código para ser executado em JS, mas, eu gostaria de ter o mais preciso possível estatísticas.

Eu fiz o seguinte.

Eu estou usando uma combinação de JavaScript e PHP para gravar as estatísticas. JavaScript para determinar qual navegador e sistema operacional (como este é provavelmente o mais preciso), e PHP para gravá-lo:

O JavaScript vem Quirksmode , o PHP é bastante evidente. Eu uso o MooTools JS quadro.

Adicione o seguinte para o script 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();
    }
});

Esta determina o navegador, versão do navegador e sistema operacional do navegador do usuário e envia-lo para o script record_browser.php. O script record_browser.php apenas das informações acrescentar, juntamente com o session_id PHP eo user_id atual, se estiver presente.

MySQL Table:

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`)
)

Código 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
                ));
}

Como dito por muitos, a detecção do navegador pode ir muito errado ... no entanto, no interesse de Código Golf.

Esta é uma maneira muito rápida para detectar IE.

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

Sua bastante puro, porque na verdade ele escolhe IE sem tropeçar em cima Opera.

Os pontos de bónus se você sabe por Isso funciona no IE. ; -)

Este é o código C # eu uso, eu espero que seja ú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 );

Editar : A solução abaixo não é recomendada. Tente isto em vez disso: http://whichbrowser.net/

Esta já trabalhou para mim, mas olhando para o código agora, eu não tenho nenhuma idéia de como. Use acima em vez: - /

<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>

Não se esqueça que você precisa para inicializar-lo para usá-lo, por isso, colocar isso em seu código:

var UserBrowser = new BrowserCheck();

E, em seguida, verificar se há um tipo de navegador e versão da seguinte forma: (por exemplo, Internet Explorer 8)

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

etc.

Hope ele faz o trabalho para você como ele tem para nós, mas lembre-se que não há detecção de navegador é à prova de bala!

Para o Internet Explorer e folhas de estilo você pode usar a seguinte sintaxe:

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

Este applys para IE 6 ou anterior. Você pode alterar a versão do IE e também tem:

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

Im não tem certeza se isso funciona com outras partes da página, mas funciona quando colocado dentro da tag <head>. Veja este exemplo para mais informações

Geralmente, quando um navegador faz uma solicitação, ele envia um monte de informações para você (hora, data nome, user-agent ...). Você deve tentar olhar para os cabeçalhos do enviado cliente e ir para o que você diz seu navegador (eu acho que é "User-Agent:".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top