Google chrome extension chrome扩展后台页面应该如何与多个内容脚本通信?

Google chrome extension chrome扩展后台页面应该如何与多个内容脚本通信?,google-chrome-extension,message-passing,Google Chrome Extension,Message Passing,我在与背景页面中的多个内容脚本通信时遇到问题。我的背景页面有如下代码: chrome.tabs.sendRequest(tabId, { targetScript:"content1" }, function (resp) { if (resp.fromCorrectScript) { DoMoreStuff(); } }); 我有如下内容脚本: // content1.js chrome.extension.onRequest.addListener(function (se

我在与背景页面中的多个内容脚本通信时遇到问题。我的背景页面有如下代码:

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({});
  }
}); 

我的理解是后台页面中的回调应该被调用两次,每个内容脚本调用一次。看起来它有时只被调用两次,而且几乎只有当我在
if
子句中有一个断点时才会被调用。我做错什么了吗

谢谢


-Greg

我不知道问题的根源是什么,我只能猜测,无论哪个脚本运行回调,都会先破坏它,然后再运行

不过我可以建议解决办法。您可以双向发送请求,而不仅仅是从后台页面到脚本。因此,您的背景页可能如下所示:

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});
  }
}); 

这应该不会阻塞。

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

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


在过去,当内容脚本没有调用sendResponse回调时,我的扩展被阻塞。我会检查一下情况是否仍然如此。
// 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 });
  }
});