我正在打开一个选项卡,并尝试调用其中定义的函数,但是我总是收到“引用错误”。脚本加载后,我向脚本发送了一条消息,要求运行位于选项卡代码上的“ test1”功能。
这是我的代码:
扩展码
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>
Tab 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" }, "*");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句