我们正在构建一个书签,我们想知道我们是否可以在客户端使用 JavaScript 检测浏览器和版本号,而不是使用代理在服务器端进行检测。
我们会将检测结果推送到主请求的服务器。
问题是,这种方法能否更好、更准确?或者两者都可以犯同样的错误,JavaScript 本身从用户代理计算(可以通过插件/代理更改)。
重要的
请不要忘记我们正在构建一个书签,因此我们无法加载像 Modernizr 和 JQuery 这样的花哨的工具,因为它不能快速运行。
我们正在构建一个书签,我们想知道我们是否可以在客户端使用 JavaScript 检测浏览器和版本号,而不是使用代理在服务器端进行检测。
我们会将检测结果推送到主请求的服务器。
问题是,这种方法能否更好、更准确?或者两者都可以犯同样的错误,JavaScript 本身从用户代理计算(可以通过插件/代理更改)。
重要的
请不要忘记我们正在构建一个书签,因此我们无法加载像 Modernizr 和 JQuery 这样的花哨的工具,因为它不能快速运行。
我可能错了,但我认为 JS 也使用了用户代理。到目前为止,我还没有看到不是从用户代理计算的 JS 浏览器检测代码。如果我错了,请纠正我。如果这有助于您尝试使用 JQuery$.support
属性来检测/支持您需要的特定功能,而不是依赖于浏览器名称和版本。伪造您的用户代理很容易。
根据this对象使用navigator
用户代理标头。
为什么要检测用户代理?您是否要根据用户代理运行不同的 javascript?JQuery 和/或 Mootools 提供了一个抽象层来处理不同的浏览器 JS。此外,媒体查询和其他 API 可以检测视口大小、分辨率等以促进内容适应。如果您想为不同的用户代理提供完全不同的资源,那么服务器端内容协商是更可取的。在这种情况下,您可以使用 Apache Mobile Filter(基于 WURFL 设备存储库构建)之类的东西从用户代理字符串中检测浏览器功能。
最后,如果您想确保网络/代理不会篡改您的请求,请在以下 HTTP 请求和响应标头中使用以下指令:
Cache-Control: no-transform
这可以在使用 JQuery 的 AJAX 请求之前设置(或简单地在 XmlHttpRequest 对象上设置),也可以在您的 Apache 配置中为响应设置。
你真的不应该检测浏览器,而是检测可用的功能,除非你的整个任务归结为完全一样 - 比如从某些统计目的检测浏览器,或者某些浏览器存在一些特定问题,成功报告支持某个功能,但不真的支持它还是有缺陷的(想想 IE6 的 PNG 支持)。如果您不想手动编码,Modernizr等可以帮助您进行特征检测。
如果您仍然想要浏览器检测,那么是的,您从客户端 JS 获得的机会比从服务器获得的机会多。在服务器上,您只限于分析可以被代理或客户端本身剥离或损坏的 User-Agent 标头,但在 JS 中,除了检查用户代理字符串外,您还可以检测环境中浏览器特定对象的存在或在某些功能的实现中检查特定于浏览器的怪癖,以准确检测您真正使用的浏览器。但唯一的缺点是,自然地,用户必须启用 JS。
As a simple example, checking if you have access to ActiveXObject
, will tell you that you're in Internet Explorer and checking if there's native JSON.parse
available can show if it is version 7 in standard mode or older/compatibility mode instead, no matter what how much user agent string is mangled.
也许这会有所帮助
<div id="example"></div>
<script type="text/javascript">
txt = "<p>Browser CodeName: " + navigator.appCodeName + "</p>";
txt+= "<p>Browser Name: " + navigator.appName + "</p>";
txt+= "<p>Browser Version: " + navigator.appVersion + "</p>";
txt+= "<p>Cookies Enabled: " + navigator.cookieEnabled + "</p>";
txt+= "<p>Platform: " + navigator.platform + "</p>";
txt+= "<p>User-agent header: " + navigator.userAgent + "</p>";
document.getElementById("example").innerHTML=txt;
</script>