检测用户浏览器的最佳/最简单/最准确的方法是什么?
易于扩展和实施是一个优点。
使用的技术越少越好。
解决方案可以是服务器端、客户端或两者兼而有之。不过,结果最终应该会出现在服务器上。
该解决方案可以与框架无关。
该解决方案将仅用于报告目的。
检测用户浏览器的最佳/最简单/最准确的方法是什么?
易于扩展和实施是一个优点。
使用的技术越少越好。
解决方案可以是服务器端、客户端或两者兼而有之。不过,结果最终应该会出现在服务器上。
该解决方案可以与框架无关。
该解决方案将仅用于报告目的。
在服务器上,您几乎受限于浏览器提供的 UserAgent 字符串(这充满了问题,请阅读有关UserAgent 字符串的历史记录)。
在客户端(即在 Javascript 中),您有更多选择。但最好的选择是实际上不必担心确定它是哪个浏览器。只需检查以确保您要使用的任何功能确实存在。
例如,您可能想要使用只有 MSIE 提供的 setCapture:
if (element.setCapture) element.setCapture()
与其弄清楚浏览器是什么,然后推断它的功能,我们只是在使用它之前看看它是否支持某些东西——谁知道未来哪些浏览器会支持什么,你真的想回去更新吗?如果 Safari 决定支持 setCapture,你的脚本呢?
JQuery 浏览器插件将在客户端为您完成。
什么是 jQuery 浏览器插件?
jQuery 浏览器插件是 jQuery 的一个插件,可以轻松地唯一识别访问者的浏览器。
它有什么作用?
它为您提供了一个 javascript 对象,其中包含有关正在使用的浏览器的所有信息。它还添加了 CSS 浏览器选择器,这意味着您可以为特定浏览器、浏览器版本、布局、布局版本甚至操作系统设置元素样式或编写函数。运行中的 jQuery 浏览器插件的图像。
该插件$.browser
可用,如果您确实需要服务器端,您可以通过 AJAX 调用将其重新提交到您的服务器。
alert($.browser.name); // Alerts Firefox for me
但是,该插件将仅与它所测试的浏览器一样有效。上面列出的插件有一个在其测试中识别的浏览器列表,但总是存在新浏览器会偷偷溜出的风险(谷歌浏览器..),这需要重新编写识别规则。也就是说,这个插件似乎会定期更新。
使用 javascript 时:不要使用浏览器检测
编写代码,针对浏览器展示的给定案例进行自我测试,否则您只会为非常少的人群编写代码。最好在需要的地方使用"typeof foo == 'undefined'"
和浏览器特定的技巧。
jQuery 在其代码库中执行此操作(如果您查看代码,您会看到它实现了针对不同浏览器技术的行为)
从长远来看它更好。
由于我刚刚在一个(现已删除的问题)中发布了它并且它仍在我的粘贴缓冲区中,所以我将重新发布。注意:这是一个服务器端的 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;
}
}
正如丹所说:这取决于所使用的技术。
对于 PHP 服务器端浏览器检测,我推荐 Harald Hope 的浏览器检测:
http://techpatterns.com/downloads/php_browser_detection.php
在 GPL 下发布。
不要使用浏览器检测:
最好在客户端脚本中进行特征检测。希望您只需要浏览器检测来解决特定浏览器和版本中的错误。
我最初问这个问题是因为我希望能够记录人们用来访问我的网站的浏览器和操作系统。是的,用户代理字符串不可信,是的,您不应该使用浏览器检测来确定在 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
脚本只是添加信息,以及 PHPsession_id
和 current 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
));
}
正如许多人所说,浏览器检测可能会出错……但是出于 Code Golf 的利益。
这是检测 IE 的一种非常快速的方法。
<script>
if('\v'=='v'){
alert('I am IE');
} else {
alert('NOT IE');
}
</script>
实际上它非常整洁,因为它可以在不触发 Opera 的情况下选择 IE。
如果您知道为什么这在 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))
等等
希望它能像对我们一样为您完成工作,但请记住,没有浏览器检测是防弹的!
这是我使用的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 );
对于 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>
标签内时有效。有关更多信息,请参阅此示例
通常,当浏览器发出请求时,它会向您发送一堆信息(时间、名称日期、用户代理...)。您应该尝试查看客户端发送的标头并转到告诉您浏览器的标头(我认为它是“User-Agent:”。