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

时间:2010-08-24 17:32:26

标签: google-chrome-extension message-passing

我在后台页面中与多个内容脚本进行通信时遇到问题。我的后台页面的代码如下:

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子句中有一个断点时。我在这里做错了吗?

谢谢,

-Greg

2 个答案:

答案 0 :(得分:0)

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

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

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

这不应该窒息。

答案 1 :(得分:0)

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

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