8

我说的是 Chrome 扩展、Firefox WebExtensions、Edge 扩展......

在后台脚本而不是内容脚本中,是否有明确的方法可以知道我正在使用哪个浏览器?我需要针对不同的浏览器做不同的操作。

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

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

4

2 回答 2

8

没有特定的 API 可以检测当前正在使用哪个浏览器。主流浏览器转向支持通用扩展框架的好处之一是能够拥有一个支持多个浏览器的代码库。尽管可从所有适用的浏览器获得的功能集不断增长,但总会存在一些差异。这些差异不仅在于支持的内容,在某些情况下还在于特定 API 的效果细节,或者必须如何使用 API。1, 2因此,对于某些事情,有必要能够确定代码当前正在运行哪个浏览器。

“如何检测 Safari、Chrome、IE、Firefox 和 Opera 浏览器?”的最高投票答案提供了一些很好的代码。. 但是,它需要一些修改才能在扩展环境中工作。

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

  • 铬合金
  • 边缘
  • 火狐
  • 歌剧
  • 宾克引擎
// 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. chrome.*Mozilla 已明确表示,他们打算通过扩展/ browser.*API来实现目前在其他浏览器中不可用的 WebExtensions 功能。这样做的一种方法是,有一种称为WebExtensions Experiments的机制,旨在供非 Mozilla 开发人员为 WebExtensions 实现附加功能。其目的是,如果获得批准,此类功能将被迁移到库存的 Firefox 版本中。
于 2017-01-24T05:33:13.590 回答
0

这是另一种技术。该browser.identity.getRedirectUrl函数将返回一个 URL 后缀:

  • .extensions.allizom.org/从 Firefox 运行时
  • .chromiumapp.org/从 Chrome/Chromium 运行时

在启动时调用它并将其存储在后台脚本的运行时状态中非常简单。Edge 和 Opera也支持此功能

现在通常 Web 扩展 API 调用chrome在 Chrome 中运行时开始,但此时跨浏览器扩展编写器应该用于Web 扩展 Polyfill JS,如果你希望调用browser.identity.getRedirectUrl工作,你也需要使用它任何浏览器。

于 2022-01-18T19:57:15.810 回答