我说的是Chrome扩展、Firefox WebExtensions、Edge扩展。。。
在后台脚本而不是内容脚本中,是否有明确的方法来了解我正在使用的浏览器?我需要为不同的浏览器做不同的操作。
是的,navigator.userAgent
可能很有用,但它不是很清楚。
有没有什么扩展API可以用来做这件事?类似chrome.extension.browserType
。(当然,这个并不真的存在。)
没有特定的API来检测当前正在使用的浏览器。主流浏览器转向支持通用扩展框架的好处之一是能够拥有支持多个浏览器的单个代码库。虽然所有适用浏览器提供的功能集都在增长,但总会有一些差异。这些差异不仅在于支持什么,而且在某些情况下还在于特定API的效果细节,或者API必须如何使用1,2因此,对于某些事情,有必要能够确定代码当前正在运行的浏览器。
有一些好的代码可以从最高投票的答案中得到;如何检测Safari、Chrome、IE、Firefox和Opera浏览器&";。但是,它需要一些修改才能在扩展环境中工作。
根据该答案中的代码,以下将检测到:
- 铬
- Edge
- 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);
- API的不同实现,与不同浏览器一样复杂和多样的东西接口,最终总是会导致实现之间的细微差异,至少。目前,许多差异并没有那么微妙
- Mozilla明确表示,他们打算通过扩展
chrome.*
/browser.*
API来实现目前在其他浏览器中不可用的WebExtensions功能。实现这一点的一种方法是,有一种称为WebExtensions实验的机制,旨在让非Mozilla开发人员实现WebExtensions的附加功能。其目的是,如果获得批准,这些功能将迁移到Firefox的库存版本中
这是另一种技术。browser.identity.getRedirectUrl
函数将返回一个用修复的URL帖子
.extensions.allizom.org/
.chromiumapp.org/
在启动时调用它并将其存储在后台脚本的运行时状态中非常简单。Edge和Opera也支持此功能。
现在,当在Chrome中运行时,通常Web扩展API调用从chrome
开始,但此时应该将跨浏览器扩展编写器用于Web扩展Polyfill JS,如果您希望对browser.identity.getRedirectUrl
的调用在任何浏览器上工作,则也需要使用它。
这是最好的选择,但目前仅适用于Firefox。
browser.runtime.getBrowserInfo()
添加一个常量来保存该值。在发布到每个浏览器存储之前,修改它的设置。
I.E:
const BrowserCode = {
CHROME:1,
FF: 2,
};
// to submit to chrome
const CURRENT_BROWSER = BrowserCode.CHROME;
// or to submit to FF
const CURRENT_BROWSER = BrowserCode.FF;
// elsewhere
if (CURRENT_BROWSER === BrowserCode.CHROME) {
}
//or
const behavior = {
BrowserCode.CHROME: () => {},
BrowserCode.FIREFOX: () => {}
}
behavior[CURRENT_BROWSER]();
要执行设置,只需使用一些简单的shell脚本即可执行字符串替换。在这种情况下,你可以有一个浏览器类型是BrowserCode.UNDEFINED。在这种情况中,你只需要一个正则表达式来找到以const CURRENT_browser开头、以BrowserCode_UNDEFINED结尾的行;并将其细分为正确的。