我感兴趣的是哪个是检测客户端的用户代理,客户端(javascript)或服务器端的最佳位置?我提出这个问题是因为一些IE8用户收到的消息称他们正在使用IE6。
答案 0 :(得分:8)
简短而正确的答案是:不要使用任何依赖于UserAgent嗅探的东西。
为了能够可靠地调整代码路径,您应该测试代码路径调整的特定“事物”,主要是功能。这称为Feature Detection。
因此,如果支持功能X,我们会这样做,如果不是,我们会这样做。
如果基于哪个UserAgent支持某项功能,则推断会很快失败,尤其是当新浏览器加入标记时。 采用以下示例,实际上可以在几个主要库中找到它们(!)
if (isIE8) {
// use new feature provided by IE8
} else if (isIE7) {
// use not so new feature provided by IE7 (and IE8)
} else {
// use fallback for all others (which also works in IE7 and IE8)
}
您认为IE9出现后会发生什么?
在这种情况下,正确的模式是
if ("addEventListener" in foo) {
// use DOM level 2 addEventListener to attach events
foo.addEventListener(...
} else if ("attachEvent" in foo) {
// use IE's proprietary attachEvent method
foo.attachEvent(...
} else {
// fall back to DOM 0
foo["on" + eventName] = ....
}
答案 1 :(得分:5)
双方都可以使用的用户代理应该是相同的,除非有一些有趣的东西正在进行,通常不会。
如果您想向IE6用户显示消息,建议您使用conditional comments。它们是IE特有的功能,非常适合检测IE版本。
答案 2 :(得分:0)
通过客户端或服务器端检测发现的信息基本相同。
请记住,欺骗您所使用的浏览器非常容易。没有任何故障安全方法可以准确地检测所有浏览器类型。
答案 3 :(得分:0)
我不知道你是如何检查用户代理的,但我会这样做:
<%=
case request.env['HTTP_USER_AGENT']
when /Safari/
"it's a Mac!"
when /iPhone/
"it's a iPhone"
else
"i don't know :("
end
%>
直接检查用户请求似乎是验证用户浏览器最一致的方法。 request.env在你的控制器和视图中是可用的,所以如果需要你可以将它传递给rjs。
答案 4 :(得分:0)
对于那些需要使用JavaScript获取实际用户代理的人,您可以使用navigator.userAgent