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

Javascript 如何从Chrome扩展后台脚本访问页面变量,javascript,google-chrome-extension,content-script,Javascript,Google Chrome Extension,Content Script,使用内容脚本,您可以将脚本标记注入DOM,以便访问原始页面()中的变量 我希望避免将我的代码注入每个页面,而只在用户单击扩展图标时才这样做 当我尝试使用与内容脚本相同的代码时,值未定义,尽管脚本插入正确 这可能吗?否则,使用内容脚本并与其通信是首选解决方案吗 以下是我正在使用的代码: var scr = document.createElement("script"); scr.type="text/javascript"; scr.innerHTML = "setInterval('conso

使用内容脚本,您可以将脚本标记注入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"]
  },

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

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

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

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

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

考虑以下几点:

在page.html中:

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

现在,如果单击页面中的按钮,您将在控制台窗口中找到这两条日志消息。JavaScript上下文彼此隔离,只有通过postMessage和共享DOM发送消息的例外。

请展开您的问题,显示清单文件和其余代码。您如何知道“脚本已正确插入”@rsanschez已添加清单的相关部分。我所说的“正确插入”是指按照预期插入DOM节点,并且定期打印日志输出。问题是,如果我从后台脚本运行inject.js,那么
window.testVar
的值是未定义的。请检查我的答案。它与内容脚本一起工作,那么这就是方法吗?你的意思是它与内容脚本一起工作。是的,您可以注入javascript,但它无法读取页面中定义的变量。你只能访问当前页面的DOM树。我试过了,效果很好。我链接到的问题还说“将执行元素中的代码,并且该代码将在窗口范围内访问JavaScript变量”。你看过第二个答案了吗。上次我尝试这样做时失败了,我愿意同意ChromeThanks的做法。现在,我创建了script元素,其中包含访问inject.js中页面变量的代码。
chrome.tabs.executeScript({
  code: '$("#myButton").click(function() { console.log("Message from background script."); });'
});