如何确定您的扩展后台脚本正在哪个浏览器中执行? [英] How to determine in which browser your extension background script is executing?

本文介绍了如何确定您的扩展后台脚本正在哪个浏览器中执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm talking about Chrome extensions, Firefox WebExtensions, Edge extensions...

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

In a background script, not a content script, is there a clear way to know which browser I am using? I need to do different operations for different browsers.

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

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

Is there any extension API that can be used to do this? Something like, chrome.extension.browserType. (Of course, this one doesn't really exist..)

推荐答案

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

There is no specific API to detect which browser is currently being used. One of the benefits of the major browsers moving to support a common extension framework is being able to have a single codebase which supports multiple browsers. While the set of functionality which is available from all applicable browsers is growing, there will always be some differences. These differences are not just in what is supported, but in some cased are in the specifics of the effects for a particular API, or how the API must be used.1,2 Thus, for some things, it is necessary to be able to determine which browser the code is currently running.

高票回答如何检测 Safari、Chrome、IE、Firefox 和 Opera 浏览器"中提供了一些不错的代码?".但是,它需要一些修改才能在扩展环境中工作.

There is some good code available from the top-voted answer to "How to detect Safari, Chrome, IE, Firefox and Opera browser?". However, it needs some modification to work in an extension environment.

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

Based on the code in that answer, the following will detect:

  • 边缘
  • 火狐
  • 歌剧
  • 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 版本中.
  1. Different implementations of an API which interfaces with something as complex and diverse as the different browsers will always end up with, at least, subtle differences between implementations. Currently, many of the differences are not that subtle.
  2. Mozilla has explicitly stated that they intend to implement functionality for WebExtensions which is not currently available in other browsers by extending the chrome.*/browser.* APIs. One way that this is being done is that there is a mechanism called WebExtensions Experiments which is intended for non-Mozilla developers to implement additional functionality for WebExtensions. The intent is that such functionality, if approved, will be migrated into stock Firefox builds.

这篇关于如何确定您的扩展后台脚本正在哪个浏览器中执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆