关于在bg.html,popup.html和contentscript.js之间发送消息

T_t*_*T_t 4 messaging google-chrome google-chrome-extension

在我的分机,一个叫按钮时mybuttonlpopup.html被点击时,它发送消息"getvar"contentscript.js,这反过来将消息发送"I want var1"background.html获取对象命名var1.(mybutton2同样设置了一个名为的按钮,除了它var2在单击时获取对象).

我该如何实现呢?

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

Moh*_*our 16

onRequest.addListener和sendRequest是Chrome扩展程序Messaging的一部分.这位于http://developer.chrome.com/extensions/messaging.html

基本上,您使用"onRequest.addListener"来侦听某个请求,该请求是某人通过触发"sendRequest"发送的.

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

如果您希望您的内容脚本也与您的后台页面进行通信(由于您的制作更复杂,则不需要),您可以在后台页面添加"onRequest.addListener",该页面仅侦听来自内容脚本的请求.为此,Message Passing完美地解释了它."sender.tab"如果为true,则是内容脚本.

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

Popup.html

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

ContentScript.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.
  }
});
Run Code Online (Sandbox Code Playgroud)

BackgroundPage.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.
  }
});
Run Code Online (Sandbox Code Playgroud)