Chrome开发 - chrome.tabs.sendMessage不通知运行时

时间:2014-12-10 16:11:26

标签: javascript google-chrome google-chrome-extension google-chrome-app

我正在尝试向新创建/更新的标签发送消息并在那里接收:

var tabAction = 'create';      // tabAction equals *create* or *update*

chrome.tabs[tabAction]({
    url:  chrome.extension.getURL('/somepage.htm'),
    active: true
}, function(_tab) {
    chrome.tabs.sendMessage(_tab.id, {
        message: 'some custom message',
        arg: 'some arg'
    });
});

在此调用之后,其中一个脚本(包含在已打开页面的标题中)必须接收此消息并执行进一步操作:

(function(window, document, jQuery) {
    "use strict";


    chrome.runtime.onMessage.addListener(function(message) {
        // Do stuff
    });
})(window, document, jQuery);

现在我的问题:

如果tabAction设置为“create”,一切正常 - 页面正在加载,主脚本发送消息,扩展调试器显示:“Invoked tabs.sendMessage”和“通知运行时.onMessage”和页面脚本完成它所拥有的。

如果tabAction设置为“update” - 正在重定向页面并且主脚本也会发送消息,但消息不会发送到运行时;调试器只停在“Invoked tabs.sendMessage”。

为什么这种奇怪的行为? 感谢所有进一步的回复。

2 个答案:

答案 0 :(得分:5)

在调用chrome.tabs.createchrome.tabs.update的回调时,无法保证页面已完全加载。

如果在呼叫chrome.tabs.sendMessage时页面未完成加载,则页面将不会收到该消息(您可能会看到"无法建立连接。接收端不存在。 "如果您选中chrome.runtime.lastError.message)。

解决问题的正确方法是使用chrome.tabs.onUpdated检测选项卡何时完成加载:

chrome.tabs.update({
    url: chrome.runtime.getURL('/somepage.htm')
}, function(tab) {
    chrome.tabs.onUpdated.addListener(function listener(tabId, changeInfo) {
        if (tabId === tab.id && changeInfo.status == 'complete') {
            chrome.tabs.onUpdated.removeListener(listener);
            // Now the tab is ready!
            chrome.tabs.sendMessage(tabId, 'custom message whatever');
        }
    });
});

由于crbug.com/411225,目前这不适用于chrome.tabs.create。在修复该错误之前,您必须使用以下内容:

var tabAction = 'create'; // Or update.
chrome.tabs[tabAction]({
    url: chrome.runtime.getURL('/somepage.htm')
}, function(tab) {
    // Called when the tab is ready.
    var onready = function() {
        onready = function() {}; // Run once.
        chrome.tabs.onUpdated.removeListener(listener);
        // Now the tab is ready!
        chrome.tabs.sendMessage(tab.id, 'custom message whatever');
    };

    // Detect update
    chrome.tabs.onUpdated.addListener(listener);

    // Detect create (until crbug.com/411225 is fixed).
    chrome.tabs.get(tab.id, function(tab) {
        if (tab.status === 'complete') {
            onready();
        }
    });

    function listener(tabId, changeInfo) {
        if (tabId === tab.id && changeInfo.status == 'complete') {
            onready();
        }
    }
});

答案 1 :(得分:0)

我的Chrome扩展程序中的chrome.tabs.sendMessage遇到了类似的问题,我使用manifest.json中的以下代码段解决了它。请注意,最重要的事情是内容清单中的"匹配":[" http:// / "] 脚本,因为使用和不使用它来测试代码会分别产生成功和错误情况。

"background": {
  "scripts": [ "background.js" ],
  "persistent": false
},
"content_scripts": [ {
"js": [ "content.js" ],
"all_frames": true,
"matches": [ "http://*/*"]
}],