如果“run_at”:在chrome扩展中使用“document_start”,则消息传递发生两次

时间:2014-01-13 07:21:39

标签: google-chrome-extension

在我的扩展程序中,我将一条消息从background.js传递给contentScript.js。

问题是当我使用

"run_at" : "document_start"

在我的manifest.json中,从background.js到contentScript.js的消息被调用两次,有时甚至更多。

在我的情况下,多次传递邮件有点贵,因为我正在向服务器发送一个调用,并且在服务器上多次处理相同的值是很昂贵的。

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 

   chrome.tabs.sendMessage(tab.id, {type: "get-url", url: tab.url});

});

contentScript.js

chrome.runtime.onMessage.addListener(   
  function(message, sender, sendResponse) { 
    switch(message.type) {
    case "get-url" : someFunction(message.url); 
                     break;
            // other cases

    }
});

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:2)

选项卡更新周期中多次调用

chrome.tabs.onUpdated (例如,当选项卡开始加载新页面时,选项卡完成加载新页面时,获取favicon时等)。

最好的选择是在标签完成加载时checj:

chrome.tabs.onUpdated.addListener(function (tabId, info, tab) {
    if (info.status === 'complete') {
        /* Now it is safe to send the message */
        chrome.tabs.sendMessage(tabId, {
            type: 'get-url',
            url:  tab.url
        });
    }
});

BTW,在以编程方式注入时(不在manifest.json中),属性的名称为runAt,而不是run_at docs )。< / p>