Javascript Chrome开发-Chrome.tabs.sendMessage未通知运行时

Javascript Chrome开发-Chrome.tabs.sendMessage未通知运行时,javascript,google-chrome,google-chrome-extension,google-chrome-app,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

我正在尝试向新创建/更新的选项卡发送消息,并在那里接收消息:

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”和“Notified of runtime.onMessage”,页面脚本将执行它必须执行的操作

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

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

调用或的回调时,不能保证页面已完全加载

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

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

chrome.tabs.update({
url:chrome.runtime.getURL('/somepage.htm')
},功能(选项卡){
chrome.tabs.onUpdate.addListener(函数监听器(tabId,changeInfo){
if(tabId==tab.id&&changeInfo.status==complete){
chrome.tabs.onUpdate.RemovelListener(监听器);
//现在账单准备好了!
chrome.tabs.sendMessage(tabId,“自定义消息”);
}
});
});
这不适用于
chrome.tabs.create
,因为。在修复该错误之前,您必须使用以下方法:

var tabAction='create';//或更新。
chrome.tabs[tabAction]({
url:chrome.runtime.getURL('/somepage.htm')
},功能(选项卡){
//选项卡准备就绪时调用。
var onready=function(){
onready=function(){};//运行一次。
chrome.tabs.onUpdate.RemovelListener(监听器);
//现在账单准备好了!
chrome.tabs.sendMessage(tab.id,“自定义消息”,无论什么);
};
//检测更新
chrome.tabs.onUpdate.addListener(listener);
//检测创建(直到crbug.com/411225修复)。
chrome.tabs.get(tab.id,函数(tab){
如果(tab.status===“完成”){
onready();
}
});
函数侦听器(tabId,changeInfo){
if(tabId==tab.id&&changeInfo.status==complete){
onready();
}
}
});

我的chrome扩展中的chrome.tabs.sendMessage也有类似的问题,我使用manifest.json中的以下代码片段解决了这个问题。注意这里最重要的事情是内容脚本清单中的“匹配”:[“http://“],因为使用和不使用它测试代码分别会产生成功和错误场景

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

“通知运行时.onMessage”和“调用的tabs.sendMessage”这两行在哪里?我看不到任何这样的调试消息。请在您的问题中包含更多相关代码。这些行显示在实时行为选项卡“谢谢”下的“Chrome应用程序和扩展开发人员工具”中,这对我帮助很大,但当我尝试Chrome.tabs.get该特定选项卡时,它并没有触发事件,所以我只在onready()上放置了这些行;最后。。。我还必须删除onready=function(){};和chrome.tabs.onUpated.RemovelListener(监听器);因为它以某种方式停止了对其余代码的求值。我知道,我当前的代码有点凌乱,但它正在工作…:/希望谷歌能尽快修复这个漏洞。是否有其他节省方法将数据传递到我的扩展页?最好的选择是调用带有参数的函数page@IgelHaut分机信息系统是“安全的”。您也可以尝试从背景页直接访问扩展页的全局对象。谢谢,这是我的解决方案。