网上对浏览器类型判断可能是经过 User agent 字段。可是这种方法是不可靠的,由于 User agent 很容易被修改。javascript
下面介绍的这种判断的方法符合“鸭子类型”的风格。java
鸭子类型(英语: duck typing)在程序设计中是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。“鸭子测试”能够这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就能够被称为鸭子。”web
仅在确实须要时才使用这种浏览器检测方法,例如显示特定于浏览器的安装扩展说明。尽量使用特征检测。chrome
// Opera 8.0+ var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; // Firefox 1.0+ var isFirefox = typeof InstallTrigger !== 'undefined'; // Safari 3.0+ "[object HTMLElementConstructor]" var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification)); // Internet Explorer 6-11 var isIE = /*@cc_on!@*/false || !!document.documentMode; // Edge 20+ var isEdge = !isIE && !!window.StyleMedia; // Chrome 1 - 79 var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime); // Edge (based on chromium) detection var isEdgeChromium = isChrome && (navigator.userAgent.indexOf("Edg") != -1); // Blink engine detection var isBlink = (isChrome || isOpera) && !!window.CSS; var output = 'Detecting browsers by ducktyping:<hr>'; output += 'isFirefox: ' + isFirefox + '<br>'; output += 'isChrome: ' + isChrome + '<br>'; output += 'isSafari: ' + isSafari + '<br>'; output += 'isOpera: ' + isOpera + '<br>'; output += 'isIE: ' + isIE + '<br>'; output += 'isEdge: ' + isEdge + '<br>'; output += 'isEdgeChromium: ' + isEdgeChromium + '<br>'; output += 'isBlink: ' + isBlink + '<br>'; document.body.innerHTML = output;
之前的方法依赖渲染引擎的属性(-moz-box-sizing
and -webkit-transform
)来判断浏览器类型。这些前缀最终会被弃用。因此我转而使用更为健壮的方法——经过具体的浏览器的特性。浏览器
document.documentMode
。StyleMedia
构造函数Edg/[version]
,如: (ex: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.16 Safari/537.36 Edg/80.0.361.9")
InstallTrigger
chrome
中,其属性之中有一个chrome.webstore
对象。可是在最近的版本中,chrome.webstore
将会被弃用。SafariRemoteNotification
,以涵盖3.0版及更高版本的 Safari。window.opera
已经存在了不少年,可是将随着 Opera 将内核替换为 Blink + V8 而被弃用。Opera 15 中,user agent 字段更像 Chrome 的,可是额外的加入了 “OPR”。在这个本版中,chrome
对象一样被定义,可是没有 chrome.webstore
。自从 Opera 开始极力克隆 Chrome 后,我便使用 user agent 来判断它。ide
!!window.opr && opr.addons
仍然能够用来识别 Opera 20 以上的版本!函数
CSS.supports()
被引入 Blink。理所固然的,一样的 Blink 也会被 Opera 使用。