浏览器检测

时间:2020-03-06 14:25:23  来源:igfitidea点击:

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

易于扩展和实施是一个加号。

使用的技术越少越好。

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

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

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

解决方案

JQuery Browser插件将为我们在客户端完成它。

What is the jQuery Browser Plugin?
  
  The jQuery Browser Plugin is an addon for jQuery that makes it easy to uniquely identify your visitors' browsers.
  
  What does it do?
  
  It gives you an object in javascript that contains all of the information about the browser being used. It also adds CSS browser selectors, which means you can style elements or write functions for specific browsers, browser versions, layouts, layout versions, and even operating systems. Image of the jQuery Browser Plugin in action.

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

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

但是,该插件将仅与经过测试的浏览器一样有效。上面列出的插件提供了在测试中可以识别的浏览器列表,但是始终有一个新浏览器即将推出(Google Chrome ..)的风险,这将需要重新编写识别规则。也就是说,该插件似乎已定期更新。

正如Dan所说:这取决于所使用的技术。

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

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

根据GPL发布。

由于我只是将其发布在(现在已删除的问题)中,并且仍在我的粘贴缓冲区中,因此我将重新发布。
注意:这是服务器端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;
  }
}

在服务器上,我们几乎仅限于浏览器提供的UserAgent字符串(充满问题,请阅读有关UserAgent字符串的历史记录)。

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

例如,我们可能想使用setCapture,它仅由MSIE提供:

if (element.setCapture) element.setCapture()

无需弄清楚浏览器是什么,然后推断其功能,我们只是在使用它之前先查看它是否支持某种东西,谁知道将来哪些浏览器将支持什么,我们真的要回头来更新浏览器吗? Safari是否决定支持setCapture的脚本?

使用javascript时:请勿使用浏览器检测

编写用于在浏览器出现的给定情况下进行自我测试的代码,否则,我们将只为极少数人群编写代码。最好在需要时使用" typeof foo =='undefined'"和浏览器特定的技巧。

jQuery在其所有代码库中都执行了此操作(如果我们查看代码,则会看到它实现了针对不同浏览器技术的行为)

从长远来看,它会更好。

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

我不确定这是否可以与页面的其他部分一起使用,但是当放在&lt;head>标记中时是否可以使用。有关更多信息,请参见此示例

不要使用浏览器检测:

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

最好在客户端脚本中进行特征检测。希望我们只需要检测浏览器即可解决特定浏览器和版本中的错误。

我最初问这个问题是因为我希望能够记录人们用来访问我的网站的浏览器和操作系统。是的,不能信任用户代理字符串,是的,我们不应该使用浏览器检测来确定要在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
                ));
}

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

正如许多人所说,浏览器检测可能会出错,但是……这符合Code Golf的利益。

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

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

实际上,它非常整洁,因为它可以选择IE,而不会影响Opera。

如果我们知道为什么这在IE中有效,则可以加分。 ;-)

编辑:不建议使用以下解决方案。请尝试以下方法: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))

等等。

希望它能像我们一样为我们完成工作,但是请记住,没有浏览器检测是防弹的!