我打开一个标签并尝试调用其中定义的函数,但我总是得到一个"引用错误"。加载脚本后,我向脚本发送一条消息,要求运行" 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>
标签Javascript
function test1(){
console.log("test1 is running!");
}
我收到了关于脚本的消息,但无法执行&#34; test1()&#34;。
我做错了什么?
答案 0 :(得分:0)
chrome.tabs.sendMessage(tab.id, {msg: "executeTest"});
行情。
答案 1 :(得分:0)
这里有几个不相关的问题。
chrome.tabs.sendMessage(tab.id, {msg: executeTest});
executeTest
不是字符串,它是(未定义的)标识符。这就是抛出错误的原因。
正确的方式(ninja&#39;用户2570380)是写
chrome.tabs.sendMessage(tab.id, {msg: "executeTest"});
另一个问题是,您将无法拨打 test1()
,因为内容脚本live in isolated context。
要绕过它,您需要使用messaging between the webpage and your extension,使用externally_connectable
或inject some of your code into the page来触发您需要的内容。
考虑到您不控制网页,您需要在页面的上下文中注入代码。例如:
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" }, "*");