Chrome扩展中的js代码可以检测到它是作为内容脚本执行的吗?

gri*_*yvp 4 google-chrome-extension

我有一个谷歌浏览器扩展程序,它在内容脚本和后台进程/弹出窗口之间共享一些代码.如果这个代码检查它是否作为内容脚本执行是一种简单直接的方法?(消息传递行为不同).

我可以在清单中包含额外的"标记"javascript,或者从内容脚本中调用一些chrome fnction,并检查异常 - 但这些方法看起来很尴尬.也许这是一些简单而干净的方法来进行检查?

Rob*_*b W 12

要检查脚本是否作为内容脚本运行,请检查它是否未在chrome-extension方案上执行.

if (location.protocol == 'chrome-extension:') {
    // Running in the extension's process
    // Background-specific code (actually, it could also be a popup/options page)
} else {
    // Content script code
}
Run Code Online (Sandbox Code Playgroud)

如果您还想知道自己是否在后台运行,请使用.如果是,则代码在后台运行.如果没有,你正在弹出/选项页面/ ...的上下文中运行chrome.extension.getBackgroundPage()=== window

(如果要检测代码是否在扩展的上下文中运行,即不在常规网页的上下文中,请检查是否chrome.extension存在.)

修订答案的说明

以前,我的回答建议检查是否chrome.tabs定义了特定于背景的API .从Chrome 27/Opera 15开始,这种方法带来了不必要的副作用:即使您不使用该方法,也会在控制台中记录以下错误(每个API每页最多加载一次):

chrome.tabs不可用:您无权访问此API.确保manifest.json中包含所需的权限或清单属性.

这不会影响您的代码(!!chrome.tabs仍然是false),但用户(开发人员)可能会生气,并卸载您的扩展程序.