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

时间:2013-04-28 20:46:17

标签: google-chrome-extension

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

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

3 个答案:

答案 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";
}