Browser 浏览器检测

Browser 浏览器检测,browser,browser-detection,Browser,Browser Detection,检测用户浏览器的最佳/最简单/最准确的方法是什么 易于扩展和实现是一个加号 使用的技术越少越好 解决方案可以是服务器端、客户端,也可以两者兼而有之。不过,最终结果应该会出现在服务器上 解决方案可以是框架无关的 此解决方案将仅用于报告目的。将在客户端为您执行此操作 什么是jQuery浏览器插件? jQuery浏览器插件是jQuery的一个插件,它可以方便地唯一标识访问者的浏览器 它有什么作用? 它为您提供一个javascript对象,其中包含有关所使用浏览器的所有信息。它还添加了CSS浏览器选择器

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

易于扩展和实现是一个加号

使用的技术越少越好

解决方案可以是服务器端、客户端,也可以两者兼而有之。不过,最终结果应该会出现在服务器上

解决方案可以是框架无关的

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

将在客户端为您执行此操作

什么是jQuery浏览器插件?

jQuery浏览器插件是jQuery的一个插件,它可以方便地唯一标识访问者的浏览器

它有什么作用?

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

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

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

然而,插件的有效性将取决于它所测试的浏览器。上面列出的插件有一个识别规则的列表,但总有一个风险,即新的浏览器将潜入()需要重新写入识别规则。这就是说,这个插件似乎定期更新。

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

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


在GPL下发布。

因为我刚刚在一个(现在已删除的问题)中发布了这个,而且它仍然在我的粘贴缓冲区中,所以我将重新发布。 注意:这是一个服务器端PHP解决方案

我目前为此使用以下代码。这几乎不是一个让人筋疲力尽的解决方案,但应该很容易实现更多的浏览器。我不知道(谢谢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;
  }
}

在服务器上,浏览器提供的用户代理字符串几乎是有限的(这充满了问题,请阅读有关的内容)

在客户端(即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]-->

这适用于IE6或更早版本。 您可以更改IE版本,还可以:

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

不使用浏览器检测:

  • 浏览器检测在最好的时候并不是100%可靠,但情况比这更糟:
  • 浏览器有很多变体(MSIE自定义等)
  • 浏览器可能会隐瞒自己的身份(Opera实际上内置了此功能)
  • 网关隐藏或混淆浏览器的标识
  • 定制和网关供应商在用户代理中编写自己的垃圾

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

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

我做了以下几件事

我使用JavaScript和PHP的组合来记录统计数据。JavaScript来确定什么浏览器和操作系统(因为这可能是最准确的),PHP来记录它:

JavaScript来自PHP,PHP是不言而喻的。我使用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\u browser.php
脚本。
record\u browser.php
脚本只添加了信息,以及php
session\u id
和当前的
用户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
                ));
}

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

正如许多人所说,浏览器检测可能会出错……但是为了代码高尔夫的利益

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

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

如果('\v'='v'){
警惕(“我是IE”);
}否则{
警惕(“非IE”);
}
事实上,它非常整洁,因为它在挑选IE时不会被歌剧绊倒


如果您知道为什么这在IE中有效;-)

编辑:不建议使用下面的解决方案。请尝试以下方法:

这曾经奏效
<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();
if ((UserBrowser.msie == true) && (UserBrowser.version == 8))
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 );