如何从Chrome扩展程序后台脚本访问页面变量

时间:2013-09-09 21:30:20

标签: javascript google-chrome-extension content-script

使用内容脚本,您可以将脚本标记注入DOM,以便访问原始页面中的变量(as explained in this question)。

我希望避免将代码注入每个页面,而只是在用户点击扩展程序图标时执行此操作。

当我尝试使用与内容脚本相同的代码时,虽然脚本已正确插入,但未定义值。

这可能吗?否则是使用内容脚本并与其通信首选解决方案?

以下是我正在使用的代码:

var scr = document.createElement("script");
scr.type="text/javascript";
scr.innerHTML = "setInterval('console.log(window.testVar)', 1000)"
document.body.appendChild(scr)

清单摘录:

 "permissions": [
    "tabs",
    "http://*/*", "https://*/*"
  ],
  "background": {
    "scripts": ["inject.js"]
  },

3 个答案:

答案 0 :(得分:4)

不。那是不可能的。您可以注入一个脚本,但它只能访问DOM并且可以进行DOM操作。它无法在当前页面的上下文中读取javascript变量或执行函数。您的javascript代码在沙箱中运行,并且您仅限于DOM元素。

答案 1 :(得分:4)

您可以使用以下代码创建新的后台脚本:

chrome.browserAction.onClicked.addListener( function() {
  chrome.tabs.executeScript( { file: 'inject.js' } );
});

您的inject.js应该作为扩​​展程序的一部分,但您不需要在清单中提及它。这样,每次按下扩展图标时,它都将作为内容脚本运行。您没有包含定义browserAction的清单部分,但您只需要指定default_popup

答案 2 :(得分:3)

您可以利用后台脚本在页面上下文中执行JavaScript,但是,您的JavaScript是在与页面中加载的JavaScript隔离的环境中执行的。

请考虑以下事项:

在page.html中:

<button id="myButton" onclick="console.log('Message from within the page');" />

在后台脚本中:

chrome.tabs.executeScript({
  code: '$("#myButton").click(function() { console.log("Message from background script."); });'
});

现在,如果单击页面中的按钮,您将在控制台窗口中找到两条日志消息。 JavaScript上下文彼此隔离,除了通过postMessage和共享DOM进行消息传递之外。