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

paf*_*afk 5 google-chrome-extension

我正在尝试开发 chrome 扩展,并尝试依靠 sendMessage 来清理我的一些代码。但是,回调函数会在页面完成加载之前激活,因此在新选项卡的情况下,没有人会收到消息,而在现有选项卡的情况下,从中移动的页面会收到消息(但这不是我想要的) )。我寻找过其他人询问新选项卡的问题,但没有明确的答案,我见过的最好的建议是创建一个全局变量并为选项卡加载创建一个监听器,并将其与该全局变量进行比较。

所以问题是,有没有办法在回调函数中等待,直到页面加载,或者我是否创建一个 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"});
       });
     });
   });
Run Code Online (Sandbox Code Playgroud)

否则,一旦我的 sendMessage 被延迟到足以让我亲眼看到,我就能够确认我的所有选项卡侧代码都有效。我的代码能够始终如一地通过正在导航的页面上的验证,通过检查 document.url 进行确认。

Xan*_*Xan 4

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

类似的东西

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

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

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

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

例如,您可以让内容脚本报告它已准备就绪,并为此提供一个处理程序,例如您可以onMessage在后台注册一个侦听器,等待来自该特定 tab.id 的消息,发送“更多信息”然后注销或禁用自身

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