首页 > 其他分享 >js 基于能力检测进行浏览器分析

js 基于能力检测进行浏览器分析

时间:2024-02-04 22:32:29浏览次数:28  
标签:浏览器 检测 js window && navigator document

虽然可能有人觉得能力检测类似于黑科技,但恰当地使用能力检测可以精准地分析运行代码的浏览器。使用能力检测而非用户代理检测的优点在于,伪造用户代理字符串很简单,而伪造能够欺骗能力检测的浏览器特性却很难。 检测特性 可以按照能力将浏览器归类。如果你的应用程序需要使用特定的浏览器能力,那么最好集中检测所有能力,而不是等到用的时候再重复检测。比如:

let hasNSPlugins = !!(navigator.plugins && navigator.plugins.length); 
// 检测浏览器是否具有 DOM Level 1 能力
let hasDOM1 = !!(document.getElementById && document.createElement && 
 document.getElementsByTagName);

这个例子完成了两项检测:一项是确定浏览器是否支持 Netscape 式的插件,另一项是检测浏览器是否具有 DOM Level 1 能力。保存在变量中的布尔值可以用在后面的条件语句中,这样比重复检测省事多了。 检测浏览器 可以根据对浏览器特性的检测并与已知特性对比,确认用户使用的是什么浏览器。这样可以获得比用户代码嗅探(稍后讨论)更准确的结果。但未来的浏览器版本可能不适用于这套方案。下面来看一个例子,根据不同浏览器独有的行为推断出浏览器的身份。这里故意没有使用 navigator. userAgent 属性,后面会讨论它:

constructor() { 
 // 测试条件编译
 // IE6~10 支持
 this.isIE_Gte6Lte10 = /*@cc_on!@*/false; 
 // 测试 documentMode 
 // IE7~11 支持
 this.isIE_Gte7Lte11 = !!document.documentMode;
 // 测试 StyleMedia 构造函数
 // Edge 20 及以上版本支持
 this.isEdge_Gte20 = !!window.StyleMedia; 
 // 测试 Firefox 专有扩展安装 API 
 // 所有版本的 Firefox 都支持
 this.isFirefox_Gte1 = typeof InstallTrigger !== 'undefined'; 
 // 测试 chrome 对象及其 webstore 属性
 // Opera 的某些版本有 window.chrome,但没有 window.chrome.webstore 
 // 所有版本的 Chrome 都支持
 this.isChrome_Gte1 = !!window.chrome && !!window.chrome.webstore; 
 // Safari 早期版本会给构造函数的标签符追加"Constructor"字样,如:
 // window.Element.toString(); // [object ElementConstructor] 
 // Safari 3~9.1 支持
 this.isSafari_Gte3Lte9_1 = /constructor/i.test(window.Element); 
 // 推送通知 API 暴露在 window 对象上
 // 使用默认参数值以避免对 undefined 调用 toString() 
 // Safari 7.1 及以上版本支持
 this.isSafari_Gte7_1 = 
 (({pushNotification = {}} = {}) => 
 pushNotification.toString() == '[object SafariRemoteNotification]' 
 )(window.safari); 
 // 测试 addons 属性
 // Opera 20 及以上版本支持
 this.isOpera_Gte20 = !!window.opr && !!window.opr.addons; 
 } 
 isIE() { return this.isIE_Gte6Lte10 || this.isIE_Gte7Lte11; } 
 isEdge() { return this.isEdge_Gte20 && !this.isIE(); } 
 isFirefox() { return this.isFirefox_Gte1; } 
 isChrome() { return this.isChrome_Gte1; } 
 isSafari() { return this.isSafari_Gte3Lte9_1 || this.isSafari_Gte7_1; } 
 isOpera() { return this.isOpera_Gte20; } 
}

这个类暴露的通用浏览器检测方法使用了检测浏览器范围的能力测试。随着浏览器的变迁及发展,可以不断调整底层检测逻辑,但主要的 API 可以保持不变。 能力检测的局限 通过检测一种或一组能力,并不总能确定使用的是哪种浏览器。以下“浏览器检测”代码(或其他类似代码)经常出现在很多网站中,但都没有正确使用能力检测:

let isFirefox = !!(navigator.vendor && navigator.vendorSub); 
// 不要这样做!假设太多
let isIE = !!(document.all && document.uniqueID);

这是错误使用能力检测的典型示例。过去,Firefox 可以通过 navigator.vendor 和 navigator. vendorSub 来检测,但后来 Safari 也实现了同样的属性,于是这段代码就会产生误报。为确定 IE,这段代码检测了 document.all 和 document.uniqueID。这是假设 IE 将来的版本中还会继续存在这两个属性,而且其他浏览器也不会实现它们。不过这两个检测都使用双重否定操作符来产生布尔值(这样可以生成便于存储和访问的结果)。

标签:浏览器,检测,js,window,&&,navigator,document
From: https://blog.51cto.com/u_16298172/9595085

相关文章

  • js 浏览器元数据
    navigator对象暴露出一些API,可以提供浏览器和操作系统的状态信息。GeolocationAPInavigator.geolocation属性暴露了GeolocationAPI,可以让浏览器脚本感知当前设备的地理位置。这个API只在安全执行环境(通过HTTPS获取的脚本)中可用。这个API可以查询宿主系统并尽可能精确......
  • js 软件与硬件检测
    现代浏览器提供了一组与页面执行环境相关的信息,包括浏览器、操作系统、硬件和周边设备信息。这些属性可以通过暴露在window.navigator上的一组API获得。不过,这些API的跨浏览器支持还不够好,远未达到标准化的程度。识别浏览器与操作系统特性检测和用户代理字符串解析是当前......
  • js 浏览器分析
    想要知道自己代码运行在什么浏览器上,大部分开发者会分析window.navigator.userAgent返回的字符串值。所有浏览器都会提供这个值,如果相信这些返回值并基于给定的一组浏览器检测这个字符串,最终会得到关于浏览器和操作系统的比较精确的结果。相比于能力检测,用户代理检测还是有一定......
  • JS——常用实例
    对话框输入,获取,计算,输出。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>JS:操作HIML对象</title></head><body><!--1.两个输人框和一个输出框--><labelfor="1......
  • GeoJSON
    GeoJSON概览https://www.processon.com/mindmap/6224a2dc7d9c0836f90060a8地理要素特征对象->Feature{type:"Feature","properties":{name:'xxx'},"geometry":{{"type":"Point",......
  • 问题:锥、护坡检测的关键项目有两个,分别是砂浆强度和混凝土强度。
    问题:锥、护坡检测的关键项目有两个,分别是砂浆强度和混凝土强度。此题为判断题(对,错)。参考答案如图所示......
  • 问题:?软件测试方法中,属于静态测试方法的是( )。?黑盒法?逻辑覆盖?错误推测?人工检测
    问题:?软件测试方法中,属于静态测试方法的是()。?黑盒法?逻辑覆盖?错误推测?人工检测参考答案如图所示......
  • 《jsp篇》jsp是什么?
    前文链接:https://www.zhihu.com/question/437632592/answer/1677694755链接:https://www.zhihu.com/question/23984162/answer/689106407现在(2019)对于后端程序员来说,可以不学JSP。但是如果你是非科班,不论是在培训班还是自学,最好都了解一下。技术不扎实的培训班学员,基本很难找到一......
  • 《jsp篇》jsp中引用js路径的三种方法
    链接:https://blog.csdn.net/xukangone/article/details/102948708第一种直接引用这里的路劲为<scripttype="text/javascript"src="js/jquery-3.0.0.min.js"></script>注意:在jsp中使用js中的方式必须先对“jQuery-3.0.0.min.js”进行页面的引用,否则无效;因在js中使用$(docu......
  • 定制你的清爽Mac版Edge浏览器
    浏览器每次打开都有个烦人的提示要获取将来的microsoftedge更新,需要macos10.15或更高版本,找了很久也没有解决办法,有windows端的解决方案,有禁止更新的解决方案,就是没有Mac上如何避免这个告警的方案,于是走上Edge定制化之旅。省流直接下载下面的com.microsoft.Edge.......