等待chrome.tabs.update选项卡完成加载

时间:2014-04-07 00:07:45

标签: google-chrome-extension

我正在尝试使用chrome扩展程序,并尝试依靠sendMessage来清理我的一些代码。然而,回调函数在页面加载完成之前激活,因此在新选项卡的情况下,没有人收到,并且在现有选项卡的情况下,正在移动的页面正在获取消息(但这不是我想要的)。我已经找了其他人用新标签询问这个问题并且没有明确的答案,我看到的最好的建议是创建一个全局变量并为tab加载创建一个监听器并将它与这个全局变量进行比较

所以问题是,有没有办法等待回调函数直到页面加载,或者我是否创建了一个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 个答案:

答案 0 :(得分:1)

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

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

其中showInfo与您的消息处理程序的作用相同。

这有点像黑客,我不能100%确定加载顺序是否正确。

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

例如,您可以将内容脚本报告恢复为已准备好并具有该处理程序,例如,您可以在后台注册onMessage的侦听器,等待来自该特定选项卡的消息.id,发送"更多信息"然后是deregisters or disables itself

或者,您可以切换到内容脚本的程序化注入,这样可以控制加载顺序。