题
什么是最好/最简单的最准确的方式来检测浏览器的用户?
易可扩展性和执行是一个加。
较少使用的技术,更好。
该解决方案能够服务器方、客户身边,或两者。结果应最终端服务器,虽然。
该解决方案可能的框架不可知论者。
该方案将只用于报告目的。
解决方案
在服务器你几乎局限于简串的浏览器提供的(其是充满问题,有一个阅读有关的 简串的历史).
在客户(即在Javascript),你有更多的选择。但最好的选择是实际上不担心工作的浏览器。简单地检查,以确保无论你想要使用实际存在。
例如,可能需要使用setCapture,这只MSIE提供:
if (element.setCapture) element.setCapture()
而不是什么浏览器,然后推断其能力,我们简单地看到,如果它支持的东西之前使用它-谁知道什么浏览器将支持什么样的未来,你真的想要回去和更新你的脚本,如果Safari决定支持setCapture?
其他提示
的 JQuery Browser Plugin 将做客户的侧为你。
是什么s Browser Plugin?
S Browser Plugin是一个插件。这使得它很容易的唯一标识你的访问者浏览器。
它有什么作用?
它给你一个目javascript中包含的所有信息有关的浏览器被使用。它还增加了CSS浏览器选择的,这意味着你可以式件或写入功能,用于具体的浏览器,浏览器版本的布局,布局版本,甚至操作系统。图像的s Browser Plugin行动。
插在使 $.browser
可以,你可以重新提交给你的服务器经由阿贾克斯呼叫,如果你真的需要它的服务器。
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 server侧浏览器检测我建议Harald希望的浏览器检测:
http://techpatterns.com/downloads/php_browser_detection.php
发表下GPL。
不用浏览器检测:
- 浏览器检测是不是100%可靠的,在最好的时代,但事情变得更糟比这样的:
- 有很多变的浏览器(MSIE定制等)
- 浏览器能撒谎他们的身份(歌剧真的有这个功能的内置)
- 关隐藏或模糊的浏览器的标识
- 定制和网关供应商编写他们自己的垃圾在垃圾用户代理
这是更好地做到功能检测在客户机-脚本。你希望只需浏览器的检测工作围绕一个错误,在一个特定的浏览器和版本。
我原本要求的问题,因为我希望能够记录的浏览器和操作系统使用的人访问我的网站。是的,用户代理串不可信任的,是的,你不应该使用浏览器检测以确定是什么代码运行在JS,但是,我想尽可能准确的统计数据。
我做了以下。
我使用一个组合JavaScript and PHP记录的统计数据。JavaScript确定什么浏览器和操作系统(作为这是 大概 最精确),并PHP记录:
JavaScript来自 Quirksmode, 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_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 Code:
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
));
}
正如很多,浏览器检测可以去非常错误...然而在利益码的高尔夫球。
这是一个非常快速的方式来检测。
<script>
if('\v'=='v'){
alert('I am IE');
} else {
alert('NOT IE');
}
</script>
它漂亮整洁的实际,因为它拿出即没有跳闸了在歌剧院。
奖励点如果你知道 为什么 这一工作在即。;-)
这是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 );
编辑:在下面的解决方案不建议。试试这个代替: 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 Explorer8)
if ((UserBrowser.msie == true) && (UserBrowser.version == 8))
等等。
希望它的工作对于你喜欢它对我们来说,但请记住,没有浏览器检测是防弹的!
对于互联网浏览器和样式表可以使用的语法如下:
<!--[if lte IE 6]><link href="/style.css" rel="stylesheet" type="text/css" /><![endif]-->
这个产品,即6或更早。你可以改变即版本,也有:
<!--[if eq IE 7]> = Equal too IE 7
<!--[if gt IE 6]> = Greater than IE 6
我不知道,如果这工作其他部分的页面,但适当放置在 <head>
标记。看看这个 例 更多信息
一般来说,当浏览器发出请求时,发送了一堆的信给你的信(时间、姓名日期、用户代理...).你应该试试看头的客户发送去的一个告诉你他们的浏览器(我认为这是"User-Agent:".