Chrome扩展-调用函数在标签上定义(参考错误)
Chrome extension - call function defined on tab (Reference error)
我正在打开一个选项卡,并试图调用其中定义的函数,但我总是得到一个"引用错误"。在脚本加载后,我向脚本发送一条消息,要求运行位于选项卡代码上的"test1"函数。
下面是我的代码: <<p> 延伸代码/strong>chrome.tabs.executeScript(tab.id, {file: "script.js", runAt: "document_end"}, function(array){
//send message executeTest to the created tab
chrome.tabs.sendMessage(tab.id, {msg: "executeTest"});
});
script.js
url = document.URL;
window.addEventListener("load", doStuff, true);
function doStuff(){
//listen for messages coming from extension
chrome.runtime.onMessage.addListener(
function(message, sender) {
var msg = message.msg;
var url = message.url;
switch(msg){
case "executeTest":
test1();
break;
}
}
);
}
标签的HTML
<head>
<title>Test</title>
</head>
<body>
<script src="app.js"></script>
</body>
</html>
标签Javascript
function test1(){
console.log("test1 is running!");
}
我在脚本上收到消息,但不可能执行"test1()"。
我做错了什么?
这里有几个不相关的问题。
chrome.tabs.sendMessage(tab.id, {msg: executeTest});
executeTest
不是字符串,它是一个(未定义的)标识符。这就是抛出错误的原因。
正确的方法(由user2570380忍者)是写
chrome.tabs.sendMessage(tab.id, {msg: "executeTest"});
另一个问题是,您将无法调用 test1()
,因为内容脚本生活在孤立的上下文中。
要绕过它,您需要在网页和扩展之间使用消息传递,使用externally_connectable
,或将一些代码注入页面以触发您需要的内容。
考虑到你不能控制网页,你需要在页面的上下文中注入代码。例子:
control.js
window.addEventListener("message", function(event) {
// We only accept messages from ourselves
if (event.source != window)
return;
if (event.data.source && (event.data.source == "MyExtension")) {
switch(event.data.command){
case "test1":
test1();
break;
}
}
}, false);
script.js
// Initialization
var s = document.createElement('script');
// TODO: add "control.js" to web_accessible_resources in manifest.json
s.src = chrome.extension.getURL('control.js');
s.onload = function() {
this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);
// Sending a command (make sure script initialized listener first)
window.postMessage({ source: "MyExtension", command: "test1" }, "*");
chrome.tabs.sendMessage(tab.id, {msg: "executeTest"});
报价。
相关文章:
- 用嵌套函数和默认函数定义函数
- 参考误差,角度未定义
- 谷歌自定义搜索参考部门
- Ng管理员自定义参考列表-具有创建新条目的能力
- Dart 中的参考错误:按下按钮时未定义功能
- 参考错误:结帐页面上未定义付款
- 学习聚合物,获取参考错误:聚合物未定义
- 参考错误onnotification没有在推送通知cordova android中定义
- 未捕获的参考错误:谷歌没有定义谷歌图表
- 参考自定义元素视图模型在槽内
- SVG-如何定义参考/锚点
- 参考错误:谷歌不是使用 ng-map GeoCoder 服务定义的
- 相位器未捕获参考错误:游戏未定义
- 未捕获的参考错误:stLight未定义(仅在Chrome中)
- Chrome扩展-调用函数在标签上定义(参考错误)
- 不能让鼠标悬停多边形与未捕获的参考错误:谷歌没有定义
- 参考错误:KeyframeEffect没有定义
- 未捕获参考错误:未定义氮气
- 参考误差 - 角度未定义
- setTimeOut是未捕获的参考错误:setTimeOut没有定义