4

在我的扩展程序中,当单击名为mybuttonlinpopup.html的按钮时,它会向 发送一条消息"getvar"contentscript.js而后者又向 发送一条消息"I want var1"background.html获取名为 的对象var1mybutton2(同样设置了一个名为的按钮,除了var2单击时获取对象)。

我应该如何实现这个?

更重要的是,我对chrome.extension.onRequest.addListenerchrome.extension.sendRequest方法有点困惑。有人可以解释一下吗?

4

1 回答 1

16

onRequest.addListener 和 sendRequest 是 Chrome 扩展消息的一部分。位于此处http://developer.chrome.com/extensions/messaging.html

基本上,您使用“onRequest.addListener”侦听某人触发“sendRequest”的请求。

在您的情况下,您在内容脚本中放置了一个“ onRequest.addListener ”来监听来自 Popup 的请求(使用sendRequest)。从您的内容脚本中,您可以将响应返回到您的弹出窗口以处理正在发生的事情。在您的弹出窗口中,您可以使用chrome.extension.getBackgroundPage()直接访问背景页面。

如果您希望您的内容脚本也与您的后台页面进行通信(因为您使事情变得更复杂,所以不需要这样做),您可以将“onRequest.addListener”添加到您的后台页面,该页面仅侦听来自内容脚本的请求. 为此,Message Passing完美地解释了这一点。“sender.tab”如果为真,则为内容脚本。

下面的示例(未经测试)显示了我对消息传递的意思。请记住,尽量保持简单,而不是复杂。

例子

弹出窗口.html

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendRequest(tab.id, {method: "fromPopup", tabid: tab.id}, function(response) {
    console.log(response.data);
  });
});

内容脚本.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method == "fromPopup") {
    // Send JSON data back to Popup.
    sendResponse({data: "from Content Script to Popup"});

    // Send JSON data to background page.
    chrome.extension.sendRequest({method: "fromContentScript"}, function(response) {
      console.log(response.data);
    });
  } else {
    sendResponse({}); // snub them.
  }
});

背景页面.html

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  // From content script.
  if (sender.tab) {
    if (request.method == "fromContentScript")
      sendResponse({data: "Response from Background Page"});
    else
      sendResponse({}); // snub them.
  }
});
于 2010-04-12T22:08:21.063 回答