6

使用内容脚本,您可以将脚本标记注入 DOM 以访问原始页面中的变量(如本问题所述)。

我想避免将我的代码注入每个页面,而仅在用户单击扩展图标时才这样做。

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

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

这是我正在使用的代码:

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"]
  },
4

3 回答 3

6

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

于 2013-09-10T20:36:58.610 回答
4

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

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

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

于 2013-09-10T20:59:08.917 回答
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 进行消息传递的显着例外。

于 2014-01-10T03:04:04.647 回答