当前位置: 首页 > 面试题库 >

JavaScript如何检测Safari,Chrome,IE,Firefox和Opera浏览器?

山鸿彩
2023-03-14
问题内容

我有5个FF,Chrome,IE,Opera和Safari插件/扩展程序。

如何识别用户浏览器并重定向(一旦单击安装按钮)下载相应的插件?


问题答案:

谷歌浏览器可靠检测通常会导致检查用户代理字符串。这种方法不可靠,因为欺骗这个值很简单。

仅在确实需要时才使用浏览器检测方法,例如显示特定于浏览器的安装扩展说明。尽可能使用特征检测。

// 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;

可靠性分析

在先前的方法依赖于渲染引擎的性质来检测浏览器。这些前缀最终将被删除,因此为了使检测更加可靠,我切换到特定于浏览器的特征:

  • Internet Explorer:JScript的条件编译(直到IE9)和document.documentMode
  • Edge:在Trident和Edge浏览器中,Microsoft的实现公开了StyleMedia构造函数。排除三叉戟使我们陷入困境。
  • 边缘(基于铬):用户代理在末尾包含值“ Edg / [version]”(例如:“ Mozilla / 5.0(Windows NT 10.0; Win64; x64))AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 80.0.3987.16 Safari / 537.36 Edg / 80.0.361.9 “)。
  • Firefox:Firefox的用于安装加载项的API:InstallTrigger
  • Chrome:全局chrome对象,包含多个属性,包括已记录的chrome.webstore对象。
  • Update 3 chrome.webstore已弃用,并且在最新版本中未定义
  • Safari:构造函数命名中的独特命名模式。这是所有列出的属性中最不耐用的方法,您猜怎么着?在Safari 9.1.3中已修复。因此,我们正在针对SafariRemoteNotification7.1版之后引入的进行检查,以涵盖从3.0版开始的所有Safari。
  • Opera:window.opera已经存在多年了,但是当Opera用Blink + V8(由Chromium使用)替换其引擎时,它将被删除。
  • 更新1:Opera 15已发布,其UA字符串类似于Chrome,但是增加了“ OPR”。在此版本中,chrome对象已定义(但未定义chrome.webstore)。由于Opera会努力克隆Chrome,因此我使用了用户代理嗅探功能。
  • 更新2:!!window.opr && opr.addons可用于检测Opera 20+(常绿)。
  • Blink:Google开启Chrome 28后CSS.supports() 在Blink中引入。当然,这与Opera中使用的Blink相同。

在以下方面成功测试:

  • Firefox 0.8-61
  • 铬1.0-71
  • Opera 8.0-34
  • Safari 3.0-10
  • IE 6-11
  • 边缘-20-42
  • Edge开发-80.0.361.9

2016年11月更新,包括从9.1.3及更高版本检测Safari浏览器

2018年8月更新,以更新关于chrome,firefox IE和edge的最新成功测试。

已于2019年1月更新,以修复chrome检测(由于window.chrome.webstore弃用),并包括最新成功的chrome测试。

在2019年12月进行了更新,以添加基于Chromium检测的Edge(基于@Nimesh注释)。



 类似资料:
  • 我有FF、Chrome、IE、Opera和Safari的5个插件/扩展。 我如何识别用户浏览器并重定向(一旦一个安装按钮已经被点击)下载相应的插件?

  • 问题内容: 除了从浏览器本身清除之外,如何使用JavaScript或Java清除浏览器(IE,Firefox,Opera,Chrome)历史记录? 问题答案: 脚本通常无法访问浏览器中的document.location数据,因为允许访问将使任何给定站点都可以访问您的整个浏览历史记录。最多您可以执行一些简单的操作,例如“转到历史记录条目37”或“返回上一页”。但是您不能执行“历史记录条目#23中的

  • 问题内容: 如何使用JavaScript检测Safari浏览器?我在下面尝试过代码,它不仅可以检测Safari,还可以检测Chrome浏览器。 问题答案: 您可以轻松地使用Chrome的索引来过滤掉Chrome:

  • 我想将JSTestDriver与jenkins-CI集成。问题是生成服务器没有显示。有没有办法无头运行浏览器? 谢谢

  • 当我在chrome上使用ipad时,useragent是 Mozila/5.0(iPad;CPU OS 9_3_5像Mac OS X)AppleWebKit/601.1(KHTML像Gecko)CruiOS/57.0.2987.137 Mobile/13G36.... 问题:因为在iPadOS上,Safari上的用户代理与MacOS笔记本上的相同,遵循https://forums.develope

  • 问题内容: 我一直在寻找可以让我检测访问该网站的用户是否使用Firefox3或4的代码。我发现的所有代码都是用于检测浏览器类型而不是版本的代码。 如何检测这样的浏览器版本? 问题答案: 您可以看到浏览器说的内容,并将该信息用于记录或测试多个浏览器。