JS中特性与UA检测
最早的浏览器嗅探即用户代理(user-agent)检测,服务端(以及后来的客户端)根据user-agent字符串来确定浏览器的类型。在此期间,服务器会完全根据user-agent字符串屏蔽某些特定的浏览器查看网站内容。其中获益最大的浏览器就是网景浏览器。不可否认,网景(在当时)是最强大的浏览器,以至于很多网站都认为只有网景浏览器才会正常展现他们的网页。网景浏览器的user-agent字符串是Mozilla/2.0 (Win95; I)。当IE首次发布,基本上就*沿用了网景浏览器user-agent字符串的很大一部分,以此确保服务器能够为这款新的浏览器提供服务。因为绝大多数的用户代理检测的过程都是查找“Mozilla”字符串和斜线之后的版本号,IE浏览器的user-agent字符串设置成Mozilla/2.0 (compatible; MSIE 3.0; Windows 95),是不是觉得很鸡贼。IE采用了这样的用户代理字符串,这意味着每个浏览器类型检测也会把这款新的浏览器识别为网景的Navigator浏览器。这也使得新生浏览器部分复制现有浏览器用户代理字符串成为了一种趋势。Chrome发行版的用户代理字符串包含了Safari的一部分,而Safari的用户代理字符串又相应包含了Firefox的一部分,Firefox又依次包含了Netscape(网景)用户代理字符串的一部分。
基于UA检测是极其不靠谱的,并且维护困难,UA可以伪造,一个声明为Chrome的浏览器它可能是其他浏览器
每次有新的浏览器出现,或者已有的浏览器版本升级,原先基于UA检测的代码都要更新,维护成本和出错几率极大
所以我建议你尽可能避免检测UA,即使在不得不这样做的情况下。
2.8.2 特性检测
我们希望有一种更聪明的基于浏览器条件(进行检测)的方法,于是一种叫特性检测的技术变得流行起来。特性检测的原理是为特定浏览器的特性进行测试,并仅当特性存在时即可应用特性检测,例如:
// 不好的写法if (navigator.userAgent.indexOf("MSIE 7") > -1) { }// 好的写法if ( document .getElementById) {}
因为特性检测不依赖于所使用的浏览器,而仅仅依据特性是否存在,所以并不一定需要新浏览器的支持。例如,在DOM早期的时候,并非所有浏览器都支持document.getElementById(),所以根据ID获取元素的代码看起来就有些冗余。
// 好的写法// 仅为举例说明特性检测,现代浏览器都支持getElementByIdfunction getById (id) { var el = null; if (document.getElementById) { // DOM el = document.getElementById(id); } else if (document.all) { // IE el = document.all[id]; } else if (document.layers) { // Netscape <= 4 el = document.layers[id]; } return el; }
这种方法同样适用于当今最新的浏览器特性检测,浏览器已经实验性地实现了这些最新的特性,而规范还正在最后确定中。常见的Polyfill就是特性检测的应用,例如:
if (!Array.isArray) { Array.isArray = function (arr) { return Object .prototype.toString.call(arr) === '[object Array]' } }
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
以上就是JS中特性与UA检测的详细内容,更多请关注其它相关文章!
上一篇: js对数组对象的定义和遍历
下一篇: PHP语言知识类之什么叫类_PHP教程
推荐阅读
-
js中innerText/textContent和innerHTML与target和currentTarget的区别
-
js中对象和面向对象与Json介绍
-
Android中webview与JS交互、互调方法实例详解
-
vue.js 1.x与2.0中js实时监听input值的变化
-
js中的触发事件对象event.srcElement与event.target详解
-
Vue.js中数组变动的检测详解
-
简单理解JavaScript中的封装与继承特性
-
微信小程序 image组件binderror使用例子与js中的onerror区别
-
js中null与空字符串""的区别讲解
-
js与jQuery实现获取table中的数据并拼成json字符串操作示例