javascript - chrome.tabs.create 内的Chrome.extension.sendMessage

  显示原文与译文双语对照的内容
0 0

我需要创建一个 Chrome 扩展来捕获当前可视标签并在新标签中打开它。 我使用下面的代码:

send.js


 function openNextPage(imagesrc) { 
 chrome.tabs.create({url:"newScreen.html"},function(tab){ 
 chrome.runtime.sendMessage({someParam: imagesrc},function(response){console.log(response);});
 } 
 ); 
}

我还包括了英镑 newScreen.html,包括以下收费的receive.js:


window.addEventListener("load",function(){
 console.log('contents Loaded');
 chrome.runtime.onMessage.addListener(function(request,sender,response) {
 console.log(request.someParam);
 });
});

但是,一旦创建新的标签,( 第一个 newScreen.html ) 就可以看到加载的邮件,而不是英镑的imagesrc 。 可能因为 onMessage.addEventListener 在以后执行( 在sendMessage之后) 。

但是如果我再次点击我的扩展,它打开了 2nd 英镑的newScreen.html,前一个英镑接收消息并打印它。 如果打开第三个标签,第一个和第二个标签会再次收到消息。 问题是在添加onMessageListener之前,sendMessage甚至执行。 我为sendMessage使用超时,但徒劳。 帮助我 !

时间: 原作者:

0 0

你在说

可能因为 onMessage.addEventListener 在以后执行( 在 sendMessage 之后) 。

当然,就是 true: 在窗口加载之前使用 window.onload 监听器等待,但是在窗口加载之前发送消息的代价是完全的。 你应该将 chrome.runtime.onMessage 侦听器放在 window.onload 侦听器之外,如下所示:


chrome.runtime.onMessage.addListener(function(request,sender,response) {
 console.log(request.someParam);
});

window.addEventListener("load",function(){
 console.log('contents Loaded');
});

要实现该功能,可以在某个全局变量中存储请求,以便在加载窗口时使用它,并确保在加载窗口时完成了所有工作,如下面的所示:


var MY_PARAMETER;
chrome.runtime.onMessage.addListener(function(request,sender,response) {
 MY_PARAMETER = request.someParam;
});

window.addEventListener("load",function(){
//Now you are sure that the window is loaded
//and you can use the MY_PARAMETER variable
 console.log("Contents loaded, MY_PARAMETER =", MY_PARAMETER);
});

显然,你需要将这里 receive.js 脚本放在标记的顶部,inside的<head>,以确保侦听器能够立即添加:


<html>
 <head>
. . .
 <script src="/path/to/request.js"></script>
. . .
 </head>
...
</html>

原作者:
...