将邮件从devtools面板发送到Chrome扩展程序中的新标签页

时间:2015-11-27 09:52:16

标签: javascript jquery google-chrome google-chrome-extension

我应该从我的devtools面板发送数据到标签。当我使用chrome.tabs.sendMessage发送消息时,为什么没有收到消息?

panel.js

$(".options").on("submit", "form", function(e) {
  e.preventDefault();
  newTabPort = chrome.runtime.connect({ name: "new tab" });
  newTabPort.postMessage($(this).serializeArray());
});

background.js

chrome.runtime.onConnect.addListener(function(port) {
  port.onMessage.addListener(function(message) {
    console.log(message);
  });

  if (port.name == "new tab") {
    chrome.tabs.create({'url': chrome.extension.getURL('page/request_sending_page.html')}, function(tab) {});
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
      var activeTab = tabs[0];
      chrome.tabs.sendMessage(activeTab.id, {message: "olololololololo"});
    });
  }
});

my_extension_page.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  $("body").append("Hello world <br>");
  $("body").append(request.message);
});

谢谢!

1 个答案:

答案 0 :(得分:0)

所有带有函数回调的Chrome API都是异步的,因此代码chrome.tabs.create在整个函数代码完成后执行,因此下一行的chrome.tabs.query看不到新创建的选项卡。

  1. 将应该使用异步调用结果的代码移动到回调
  2. 在发送消息
  3. 之前,等待新标签完全加载
  4. 从后台脚本打开选项卡时,不需要chrome.extension.getURL
  5. chrome.tabs.create({url: '/page/request_sending_page.html'}, function(tab) {
        var newTabId = tab.id;
        chrome.tabs.onUpdated.addListener(function onComplete(tabId, info, tab) {
            if (tabId == newTabId && info.status == "complete") {
                chrome.tabs.onUpdated.removeListener(onComplete);
                chrome.tabs.sendMessage(tabId, {message: "olololololololo"});
            }
        });
    });
    

    P.S。 manifest.json:"permissions": ["tabs"]