2014-04-07 126 views
1

我想在铬扩展上工作,并试图通过依赖sendMessage来清理我的一些代码。然而,回调函数在页面加载完成之前激活,所以在新选项卡的情况下,没有人接收到,并且在现有选项卡中,正在移动的页面正在接收消息(但这不是我想要的)。我寻找其他人用新标签询问这个问题,并没有一个明确的答案,我见过的最好的建议是创建一个全局变量,并创建一个标签加载的监听器,并将其与这个全局变量进行比较。等待chrome.tabs.update选项卡完成加载

所以问题是,有没有办法在回调函数中等待,直到页面加载,或者我创建一个JS对象数组,包含我等待的选项卡和我想发送的信息到那个标签。

此处参考的是后台JavaScript文件中的相关代码。

chrome.tabs.sendMessage(tab.id, {info: "info"}, function(response) 
    { 
    //This line isn't used when I am navigating without changing tabs 
    chrome.tabs.create({url: response.info.linkUrl}, function(tab1) 
    { 
     chrome.tabs.update(tab1.id, {url: response.info.linkUrl}, function(tab2) 
     { 
     chrome.tabs.sendMessage(tab2.id, {info: "More Info"}); 
     }); 
    }); 
    }); 

否则我可以证实,我所有的选项卡中端代码的工作,一旦我的sendMessage被推迟足以让我看到我自己的眼睛。我的代码能够始终如一地通过在远离导航的页面上进行验证,并通过检查document.url进行确认。

回答

1

您可以尝试注入第二个内容脚本而不是消息。 它将在与其他脚本相同的上下文中执行。

沿

chrome.tabs.executeScript(tab2.id, 
    {code: 'showInfo("More Info);', runAt: 'document_idle'} 
); 

其中showInfo不一样的消息处理的东西线。

这有点破解,我不是100%确定加载顺序是正确的。

其他可能的解决方案更复杂。

例如,您可以将内容脚本报告回来,表明它已准备就绪,并具有相应的处理程序,例如,您可以在后台等待来自该特定tab.id的消息的背景中注册侦听器onMessage,发送“更多信息”,然后发送deregisters or disables itself

或者,您可能会切换到编程式注入您的内容脚本,这将允许您控制加载顺序。

+0

奇怪的是,executeScript在新页面上执行了操作,而不是旧页面,并且它适用于新选项卡和当前选项卡。谢谢。 – pafk