Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome扩展-在选项卡上定义调用函数(参考错误)_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript Chrome扩展-在选项卡上定义调用函数(参考错误)

Javascript Chrome扩展-在选项卡上定义调用函数(参考错误),javascript,google-chrome-extension,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.t

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

我收到脚本上的消息,但无法执行“test1()


我做错了什么?

chrome.tabs.sendMessage(tab.id,{msg:“executeTest”})


引用。

这里有几个不相关的问题

chrome.tabs.sendMessage(tab.id, {msg: executeTest});
executeTest
不是字符串,而是(未定义的)标识符。这就是错误所在

正确的方法(ninja'd由用户2570380编写)是

chrome.tabs.sendMessage(tab.id, {msg: "executeTest"});

另一个问题是,将无法调用
test1()
,因为内容脚本

要绕过它,您需要使用、使用或触发您需要的内容

考虑到您不控制网页,您需要在网页的上下文中插入代码。例如:

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

那是个打字错误!抱歉^^我能够收到我所说的消息,但当调用“test1()”时,我收到一个引用错误。请不要以与答案无关的方式“编辑”该问题。我不太理解。如果您指的是注入到页面上下文中,那么可以使用上一个链接中描述的方法,从
script.js
中执行。您可以简单地注入
test1()在脚本标记中。我想从选项卡代码(在选项卡中打开的外部代码)运行test1()。那么我上面说的是正确的。您可以使用我链接到的方法注入由调用
test1()
组成的代码;从
script.js
的上下文执行此操作将把它注入页面的上下文中,其中定义了
test1
。好的。我是在后台做的。我应该将“script.js”定义为内容脚本还是不需要?或者我可以简单地通过调用“executeScript”来使用它吗;使用
chrome.tabs.executeScript
注入的内容被视为内容脚本。
// 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" }, "*");