如何确定扩展后台脚本在哪个浏览器中执行?

时间:2017-01-24 02:59:55

标签: javascript google-chrome-extension firefox-webextensions opera-extension microsoft-edge-extension

我在谈论Chrome扩展,Firefox Web扩展,边缘扩展......

在后台脚本中,不是内容脚本,是否有明确的方式来了解我正在使用的浏览器?我需要为不同的浏览器做不同的操作。

是的,navigator.userAgent可能有用,但不太清楚

是否有可用于执行此操作的扩展API?像chrome.extension.browserType这样的东西。 (当然,这个并不存在......)

1 个答案:

答案 0 :(得分:3)

没有特定的API可以检测当前使用的浏览器。主要浏览器支持公共扩展框架的一个好处是能够拥有一个支持多个浏览器的代码库。虽然所有适用浏览器的功能集都在增长,但总会有一些差异。这些差异不仅仅在于支持的内容,而且在某些情况下,特定API的影响具体,或者必须如何使用API​​。 1, 2 因此,对于某些事情,有必要能够确定代码当前正在运行的浏览器。

top-voted answer to "How to detect Safari, Chrome, IE, Firefox and Opera browser?"提供了一些很好的代码。但是,它需要一些修改才能在扩展环境中工作。

根据该答案中的代码,以下内容将检测:

  • 边缘
  • 火狐
  • Bink引擎
// Opera 8.0+ (tested on Opera 42.0)
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera 
                || navigator.userAgent.indexOf(' OPR/') >= 0;

// Firefox 1.0+ (tested on Firefox 45 - 53)
var isFirefox = typeof InstallTrigger !== 'undefined';

// Internet Explorer 6-11
//   Untested on IE (of course). Here because it shows some logic for isEdge.
var isIE = /*@cc_on!@*/false || !!document.documentMode;

// Edge 20+ (tested on Edge 38.14393.0.0)
var isEdge = !isIE && !!window.StyleMedia;

// Chrome 1+ (tested on Chrome 55.0.2883.87)
// This does not work in an extension:
//var isChrome = !!window.chrome && !!window.chrome.webstore;
// The other browsers are trying to be more like Chrome, so picking
// capabilities which are in Chrome, but not in others is a moving
// target.  Just default to Chrome if none of the others is detected.
var isChrome = !isOpera && !isFirefox && !isIE && !isEdge;

// Blink engine detection (tested on Chrome 55.0.2883.87 and Opera 42.0)
var isBlink = (isChrome || isOpera) && !!window.CSS;

/* The above code is based on code from: https://stackoverflow.com/a/9851769/3773011 */    
//Verification:
var log = console.log;
if(isEdge) log = alert; //Edge console.log() does not work, but alert() does.
log('isChrome: ' + isChrome);
log('isEdge: ' + isEdge);
log('isFirefox: ' + isFirefox);
log('isIE: ' + isIE);
log('isOpera: ' + isOpera);
log('isBlink: ' + isBlink);
  1. 与不同浏览器一样复杂多样的东西接口的API的不同实现总是最终会与至少,实现之间的细微差别。目前,许多差异并不那么微妙。
  2. Mozilla明确声明他们打算通过扩展chrome.* / browser.* API来实现WebExtensions的功能,这些功能目前在其他浏览器中不可用。这样做的一种方法是有一种名为WebExtensions Experiments的机制,旨在让非Mozilla开发人员为WebExtensions实现其他功能。目的是,如果获得批准,此类功能将迁移到Firefox构建库存中。