使用内容脚本,您可以将脚本标记注入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"]
},
答案 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进行消息传递之外。