javascript - 背景内容脚本消息 : message sent before content script is ready

标签 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
)

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

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

最佳答案

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

例如,您可以为每个选项卡 ID 添加一个队列,然后将消息推送到那里,当来自该选项卡的消息到达时,将队列提供给它。

您也可以尝试使用编程注入(inject)而不是 list 注入(inject):

chrome.tabs.executeScript({file: "yourContentScript.js"}, function() {
  // After the above finishes executing
  /* your messaging code */
});

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

关于javascript - 背景内容脚本消息 : message sent before content script is ready,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30248557/

相关文章:

javascript - 单击第一个复选框选择多个复选框

javascript - 文本不会停留在 d3 树节点上

google-chrome - wss 连接失败:连接建立时出错:net::ERR_CERT_COMMON_NAME_INVALID

google-chrome - 如何使用 Chrome 远程调试 CasperJS?

google-chrome-extension - 复制到Chrome扩展程序中的剪贴板

javascript - 函数回调、局部变量和 chrome.storage.sync.get

javascript - 在 Parse Cloud 中使用升序和降序进行多重排序

javascript - 为什么 html src 属性中是相对 url 因为 Javascript 函数中的完整路径

javascript - 当您在 Chrome 上删除数据库时,indexedDB 不会重置版本——错误或用户错误?

javascript - 无法从弹出窗口运行 JavaScript 行