我们正在构建一个书签,我们想知道我们是否可以在客户端使用JavaScript检测浏览器和版本号比使用代理在服务器端执行更准确。
我们会将检测结果推送到服务器以获取主要请求。
问题是,这种方法可以更好地运作并且更准确吗?或者两者都可以做同样的错误,JavaScript本身也可以从用户代理计算(可以通过插件/代理进行更改)。
重要
请不要忘记我们正在构建一个 bookmarklet ,因此我们无法加载像Modernizr和JQuery这样的花哨工具,因为它无法快速解决。
答案 0 :(得分:2)
我可能错了,但我认为JS也使用了用户代理。到目前为止,我还没有看到JS浏览器检测到不能从用户代理计算的代码。如果我错了,请纠正我。如果这有助于您尝试使用JQuery $.support
属性来检测/支持您需要的特定功能,而不是依赖于浏览器名称和版本。很容易伪造你的用户代理。
根据this,navigator
对象使用用户代理标头。
答案 1 :(得分:1)
为什么要检测用户代理?您是否要根据用户代理运行不同的javascript? JQuery和或Mootools提供了一个抽象层来处理不同的浏览器JS。此外,媒体查询和其他API可以检测视口大小,分辨率等内容,以促进内容适应。如果要为不同的用户代理提供完全不同的资源,则最好是服务器端内容协商。在这种情况下,您可以使用Apache Mobile Filter(基于WURFL设备存储库)之类的东西从用户代理字符串中检测浏览器功能。
最后,如果您想确保网络/代理不会篡改您的请求,请在以下HTTP请求和响应标头中使用以下指令:
Cache-Control: no-transform
这可以在使用JQuery的AJAX请求之前设置(或者只是在XmlHttpRequest对象上设置),也可以在Apache配置中设置以进行响应。
答案 2 :(得分:0)
你真的不应该检测浏览器,而是检测可用的功能,除非你的整个任务归结为这一点 - 比如从一些统计目的检测浏览器,或者某些浏览器成功报告支持某项功能的某些特定问题,但是不支持它或有缺陷(想想IE6的PNG支持)。如果您不想手动编码,Modernizr等可以帮助您进行功能检测。
如果您仍然需要浏览器检测,那么是的,您从客户端JS获得的机会多于从服务器获取的机会。在服务器上,您仅限于分析可由代理或客户端本身剥离或损坏的User-Agent标头,但在JS中,除了检查用户代理字符串之外,您还可以检测环境中特定于浏览器的对象的存在或在实现某些功能时检查特定于浏览器的怪癖,以准确检测您真正使用的浏览器。但唯一的缺点是,用户必须启用JS。
作为一个简单示例,检查您是否有权访问ActiveXObject
,会告诉您自己在Internet Explorer中并检查是否有可用的原始JSON.parse
可以显示它是否为标准版本7无论是模式还是更旧/兼容模式,无论用户代理字符串被破坏多少。
答案 3 :(得分:-1)
也许这可以帮助
<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>