我有一个谷歌浏览器扩展程序,它在内容脚本和后台进程/弹出窗口之间共享一些代码。如果这个代码检查它是否作为内容脚本执行,它是一种简单直接的方法吗? (消息传递行为不同)。
我可以在清单中包含额外的“标记”javascript,或者从内容脚本中调用一些chrome fnction,并检查异常 - 但这些方法看起来很尴尬。也许这是一些简单而干净的方法来进行检查?
答案 0 :(得分:10)
要检查您的脚本是否作为content script运行,请检查它是否在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
}
如果您还想知道自己是否在后台页面中投放,请使用chrome.extension.getBackgroundPage()
=== window
。如果是,则代码在后台运行。如果没有,您将在弹出/选项页面/ ...
(如果您想检测代码是否在扩展的上下文中运行,即不在常规网页的上下文中,请检查是否存在chrome.extension
。)
以前,我的回答建议检查是否定义了特定于背景的API,例如chrome.tabs
。从Chrome 27 / Opera 15开始,这种方法带来了不必要的副作用:即使您不使用该方法,也会在控制台中记录以下错误(每个API每页最多加载一次):
chrome.tabs不可用:您无权访问此API。确保manifest.json中包含所需的权限或清单属性。
这不会影响您的代码(!!chrome.tabs
仍然是false
),但是用户(开发者)可能会感到恼火,并卸载您的扩展程序。
答案 1 :(得分:0)
在内容脚本中根本没有定义函数chrome.extension.getBackgroundPage
,所以可以单独使用它来检测代码是否在内容脚本中运行:
if (chrome.extension.getBackgroundPage) {
// background page or options page
} else {
// content script
}
答案 2 :(得分:0)
function runningScript() {
// This function will return the currently running script of a Chrome extension
if (location.protocol == 'chrome-extension:') {
if (location.pathname == "/_generated_background_page.html")
return "background";
else
return location.pathname; // Will return "/popup.html" if that is the name of your popup
}
else
return "content";
}