代码之家  ›  专栏  ›  技术社区  ›  Greg

chrome扩展背景页应该如何与多个内容脚本通信?

  •  1
  • Greg  · 技术社区  · 16 年前

    我无法与背景页中的多个内容脚本进行通信。我的背景页有如下代码:

    chrome.tabs.sendRequest(tabId, { targetScript:"content1" }, function (resp) {
      if (resp.fromCorrectScript) {
        DoMoreStuff();
      }
    });
    

    我有这样的内容脚本:

    // content1.js
    chrome.extension.onRequest.addListener(function (sender, request, sendResponse) {
      if (request.targetScript === "content1") {
        sendResponse({ fromCorrectScript:true });
      } else {
        sendResponse({});
      }
    }); 
    

    // content2.js
    chrome.extension.onRequest.addListener(function (sender, request, sendResponse) {
      if (request.targetScript === "content2") {
        sendResponse({ fromCorrectScript:true });
      } else {
        sendResponse({});
      }
    });
    

    if 条款。我做错什么了吗?

    谢谢,

    -格雷格

    2 回复  |  直到 16 年前
        1
  •  0
  •   Greg    16 年前

    好吧,只要我确保只有一个内容脚本响应消息,它看起来就可以正常工作。所以我的内容脚本代码应该更像:

    // content1.js
    chrome.extension.onRequest.addListener(function (sender, request, sendResponse) {
      if (request.targetScript === "content1") {
        sendResponse({ fromCorrectScript:true });
      }
    });
    

    // content2.js
    chrome.extension.onRequest.addListener(function (sender, request, sendResponse) {
      if (request.targetScript === "content2") {
        sendResponse({ fromCorrectScript:true });
      }
    });
    
        2
  •  0
  •   Brad Koch Daniel Wright    15 年前

    我不知道问题的根源是什么,只能猜测不管哪个脚本先运行回调,其余的都会破坏回调。

    不过,我可以建议解决办法。您可以双向发送请求,而不仅仅是从后台页面到脚本。所以你的背景页面可能看起来像:

    chrome.tabs.sendRequest(tabId, { targetScript:"content1" });
    
    chrome.extension.onRequest.addListener(function (request, sender, sendResponse) {
      if (request.fromCorrectScript) {
        DoMoreStuff();
      }
    }); 
    

    在脚本中:

    chrome.extension.onRequest.addListener(function (request, sender, sendResponse) {
      if (request.targetScript === "content1") {
        chrome.extension.sendRequest({fromCorrectScript:true});
      } else {
        chrome.extension.sendRequest({fromCorrectScript:false});
      }
    }); 
    

    这不应该窒息。