浏览器检测

时间:2008-09-19 10:11:56

标签: browser browser-detection

检测用户浏览器的最佳/最简单/最准确的方法是什么?

易于扩展和实施是一个优势。

使用的技术越少越好。

解决方案可以是服务器端,客户端或两者。但结果应该最终会在服务器上结束。

解决方案可以与框架无关。

该解决方案仅用于报告目的。

12 个答案:

答案 0 :(得分:12)

在服务器上,你几乎只限于浏览器提供的UserAgent字符串(这里充满了问题,请阅读UserAgent string's history)。

在客户端(即在Javascript中),您有更多选择。但最好的选择是不要真正担心它是哪个浏览器。只需检查以确保您想要使用的任何功能实际存在。

例如,您可能希望使用只有MSIE提供的setCapture:

if (element.setCapture) element.setCapture()

不是弄清楚浏览器是什么,然后推断它的功能,我们只是看看它在使用之前是否支持某些东西 - 谁知道将来支持哪些浏览器,你真的想要去如果Safari决定支持setCapture,请返回并更新脚本吗?

答案 1 :(得分:6)

JQuery Browser Plugin将为您做客户端。

  

什么是jQuery Browser Plugin?

     

jQuery Browser Plugin是jQuery的插件,可以轻松识别访问者的浏览器。

     

它做了什么?

     

它为您提供了一个javascript对象,其中包含有关正在使用的浏览器的所有信息。它还添加了CSS浏览器选择器,这意味着您可以为特定浏览器,浏览器版本,布局,布局版本甚至操作系统设置元素或编写函数。正在运行的jQuery Browser插件的图片。

该插件使$.browser可用,如果您确实需要服务器端,可以通过AJAX调用将其重新提交给服务器。

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

然而,插件只会与测试的浏览器一样有效。上面列出的插件有一个browsers recognised in it's tests列表,但总是存在新浏览器潜入(Google Chrome..)的风险,这需要重新编写识别规则。也就是说,这个插件似乎会定期更新。

答案 2 :(得分:2)

使用javascript时:不要使用浏览器检测

编写针对浏览器展示的特定案例测试自身的代码,否则您只需为非常小的人口编写代码。最好在需要的地方使用"typeof foo == 'undefined'"和浏览器特定的技巧。

jQuery在其代码库中完成了这一切(如果你看一下代码,你会看到它实现了不同浏览器技术的行为)

从长远来看,它会更好。

答案 3 :(得分:1)

由于我刚刚将其发布在(现已删除的问题)并且它仍然在我的粘贴缓冲区中,我将重新发布。 注意:这是服务器端PHP解决方案

我目前使用以下代码。它不是一个令人筋疲力尽的解决方案,但应该很容易实现更多的浏览器。我不知道user-agents.org(感谢PConroy),“其中一天”我将循环浏览它,看看我是否可以更新并添加到我的列表中。

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

答案 4 :(得分:0)

丹说:这取决于使用的技术。

对于PHP服务器端浏览器检测,我推荐Harald Hope的浏览器检测:

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

根据GPL发布。

答案 5 :(得分:0)

请勿使用浏览器检测:

  • 浏览器检测在最好的情况下并非100%可靠,但事情变得更糟:
  • 有很多种浏览器(MSIE自定义等)
  • 浏览器可以欺骗自己的身份(Opera实际上内置了此功能)
  • 网关隐藏或混淆浏览器的身份
  • 自定义和网关供应商在USER_AGENT中编写自己的垃圾

最好在客户端脚本中进行功能检测。您希望只需要浏览器检测来解决特定浏览器和版本中的错误。

答案 6 :(得分:0)

我最初提出这个问题是因为我希望能够记录人们用来访问我网站的浏览器和操作系统。是的,用户代理字符串不可信,是的,您不应该使用浏览器检测来确定在JS中运行的代码,但是,我希望尽可能准确地进行统计。

我做了以下事情。

我正在使用JavaScript和PHP的组合来记录统计数据。 JavaScript确定哪些浏览器和操作系统(因为这可能最准确),以及用于记录它的PHP:

JavaScript来自Quirksmode,PHP非常明显。我使用MooTools JS框架。

将以下内容添加到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();
    }
});

这决定了用户浏览器的浏览器,浏览器版本和操作系统,并将其发送到record_browser.php脚本。 record_browser.php脚本只是添加了信息,以及PHP session_id和当前user_id(如果存在)。

MySQL表:

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
                ));
}

答案 7 :(得分:0)

正如许多人所说,浏览器检测可能非常错误......但是为了Code Golf的利益。

这是一种非常快速的方法来检测IE。

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

它非常整洁,实际上是因为它在没有踩到Opera的情况下选择了IE。

如果你知道为什么这可以在IE中运行,那么可以获得积分。 ; - )

答案 8 :(得分:0)

修改:建议不要使用以下解决方案。请改为尝试:http://whichbrowser.net/

这曾经对我有用,但现在看代码,我不知道怎么做。请改用以上内容: - /

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

不要忘记你需要初始化它才能使用它,所以把它放在你的代码中:

var UserBrowser = new BrowserCheck();

然后检查浏览器类型和版本如下:(例如Internet Explorer 8)

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

希望它能为您完成这项工作,但请记住,没有浏览器检测是防弹的!

答案 9 :(得分:0)

这是我使用的C#代码,希望对您有所帮助。

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

答案 10 :(得分:-1)

对于Internet Explorer和样式表,您可以使用以下语法:

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

这适用于IE 6或更早版本。 您可以更改IE版本,并且还具有:

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

我不确定这是否适用于页面的其他部分,但在放置在<head>标记内时有效。有关详细信息,请参阅此example

答案 11 :(得分:-1)

通常,当浏览器发出请求时,它会向您发送一堆信息(时间,名称日期,用户代理......)。您应该尝试查看客户端发送的标头,然后转到告诉您浏览器的标头(我认为它是“用户代理:”。