内容脚本消息传递的背景:在内容脚本准备好之前发送的消息

时间:2015-05-14 22:31:49

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

尝试将消息从后台脚本传递到内容脚本时,我正在使用

chrome.tabs.query(
  {active: true, currentWindow: true},
  function(tabs) {
    chrome.tabs.sendMessage(
      tabs[0].id,
      {greeting: "hello"},
      function(response) {
        console.log(response.farewell);
      }
    );
});

在后台脚本和相应的侦听器中

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.greeting === "hello") {
      sendResponse({farewell: "goodbye"});
    }
  });

在内容脚本中(根据the documentation)。

现在,我可能希望在当前标签的Web请求完成时向内容脚本发送内容,例如,

chrome.webRequest.onCompleted.addListener(
  // sender code from above
)

但我发现,当内容脚本尚未注入页面时,后台脚本会发送消息。因此,没有回复。

如何解决这个问题?是否有一个事件可以在后台脚本中监听,告诉我何时加载了内容脚本?

1 个答案:

答案 0 :(得分:3)

最安全的方法是从内容脚本发送消息,表明它已准备好,然后才从后台页面回复。

例如,您可以在每个标签ID中添加类似队列的内容,并在那里推送消息,当来自该标签的消息到达时,将队列提供给它。

你也可以尝试使用程序化注入而不是清单注入:

webRequest

但是,如果您在导航已提交之前调用它,即在实际更改选项卡的上下文之前(可能会发生from .script3 import Class3A 个事件),您的脚本将尝试注入上一个页面并将被转换擦除。