哪种方法可以更好地检测客户端的用户代理?

时间:2010-06-03 18:30:12

标签: javascript ruby-on-rails ruby

我感兴趣的是哪个是检测客户端的用户代理,客户端(javascript)或服务器端的最佳位置?我提出这个问题是因为一些IE8用户收到的消息称他们正在使用IE6。

5 个答案:

答案 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