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

时间:2014-05-19 15:32:59

标签: javascript google-chrome-extension

我打开一个标签并尝试调用其中定义的函数,但我总是得到一个"引用错误"。加载脚本后,我向脚本发送一条消息,要求运行" 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;。

我做错了什么?

2 个答案:

答案 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_connectableinject 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" }, "*");