Chrome扩展-调用函数在标签上定义(参考错误)

Chrome extension - call function defined on tab (Reference error)

本文关键字:定义 参考 错误 标签 扩展 调用 函数 Chrome      更新时间:2023-09-26

我正在打开一个选项卡,并试图调用其中定义的函数,但我总是得到一个"引用错误"。在脚本加载后,我向脚本发送一条消息,要求运行位于选项卡代码上的"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"});

报价。