我需要创建一个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之后)执行。

但是,如果我再次单击扩展名并打开第二个 newScreen.html ,则上一个 newScreen.html 会收到该消息并进行打印。如果我打开第三个标签,则第一个和第二个标签将再次收到该消息。问题是即使在添加onMessageListener之前,sendMessage也会执行。我将TimeOut用于sendMessage,但徒劳无功。帮帮我!

最佳答案

你是说



是的,这是事实:您正在使用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');
});

如果需要,可以将请求存储在某个全局变量中,以便可以在window.onload事件处理程序中使用该请求,并确保在加载窗口后完成所有工作,如下所示:
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脚本放在标记的顶部,即文档的<head>内,以确保尽快添加侦听器:
<html>
    <head>
        ...
        <script src="/path/to/request.js"></script>
        ...
    </head>
...
</html>

09-26 13:34