【发布时间】:2016-12-15 10:12:28
【问题描述】:
我正在尝试编写一个具有开发工具面板的 Chrome 扩展程序。这个扩展需要调用我也制作的网页中窗口属性上定义的函数。换句话说,扩展只适用于我自己的网页,我控制两者。示例:
// This script is added in my own webpage application when it loads
window.myTest = () => { /* do something */ }
我希望能够从我的 Chrome 扩展程序中调用函数 window.myTest。我需要制作类似https://github.com/zalmoxisus/redux-devtools-extension 的功能。
看来我需要通过从我的后端页面注入脚本/代码来做到这一点。我已经完成了所有工作,带有被调用的后端页面的扩展,我可以看到我注入的代码在页面上下文中被调用(通过 console.log 进行的测试被写入页面的控制台输出)。
这是我的代码:
manifest.json
{
"manifest_version": 2,
"name": "MyTest",
"description": "MyTest",
"version": "0.0.1",
"minimum_chrome_version": "10.0",
"devtools_page": "devtools.html",
"background": {
"scripts": ["background.js"]
},
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["testscript.js"]
}],
"permissions": [
"tabs",
"<all_urls>"
]
}
testscript.js
window.myTest(); // myTest is undefined in the context of the injected script
background.js
// empty, but here to be able to open background page
我还有一个面板,可以在单击按钮时向后台页面发送消息。我知道面板和发送消息也可以。但是window.myTest 仍然是undefined。
编辑 从 background.js 中删除了注入,因为我没有使用它并且遇到了与描述相同的问题。
【问题讨论】:
-
您不必手动注入 testscript.js,只要您在清单“content_scripts”部分声明即可。
-
如果使用类似
setTimeout(func, 5000)的方式调用window.myTest()会怎样?我的意思是你能确保在注入脚本运行时声明了myTest吗? -
如果这是一个你也制作的网页,那么注入
<all_urls>是不合适的。您应该将您的matches限制在您正在影响的页面上。 -
@AndreaConte,虽然 OP 显然不需要通过 both 一个 manifest.json
content_scripts条目将相同的脚本注入页面和tabs.executeScript(),对于仅在用户打开 DevTools 的罕见情况下与页面交互的扩展,使用tabs.executeScript()注入可能更合适,因此注入仅在需要功能时发生,而不是在绝大多数时间永远不会使用时注入。我们不知道哪个更好,因为 OP 没有分享足够的信息。
标签: google-chrome google-chrome-extension