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

Mat*_*ert 6 javascript google-chrome-extension content-script

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

我想避免将代码注入每个页面,而只是在用户单击扩展图标时执行此操作.

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

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

这是我正在使用的代码:

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

清单摘录:

 "permissions": [
    "tabs",
    "http://*/*", "https://*/*"
  ],
  "background": {
    "scripts": ["inject.js"]
  },
Run Code Online (Sandbox Code Playgroud)

Kra*_*mir 5

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

  • 您的意思是它与内容脚本一起使用。是的,您可以注入您的javascript,但是它无法读取页面中定义的变量。您只能访问当前页面的DOM树。 (2认同)
  • 我试过了,它有效。我链接到的问题还说:“您的<script>元素内的代码将被执行,并且该代码将可以在窗口范围内访问JavaScript变量”。http://stackoverflow.com/questions/3955803/page-variables-in-content-script (2认同)

rsa*_*hez 4

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

chrome.browserAction.onClicked.addListener( function() {
  chrome.tabs.executeScript( { file: 'inject.js' } );
});
Run Code Online (Sandbox Code Playgroud)

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