如果从Background发送响应,则在内容脚本中执行一个函数

时间:2012-11-13 15:53:01

标签: javascript background google-chrome-extension response content-script

对于我的Chrome扩展程序,我尝试将所选文本发布到PHP网页。在这个网站上解决的问题(Chrome Extension: how to capture selected text and send to a web service)帮助我实现了这个目标,但我希望以不同的方式发布文本。
我没有提到那里提到的XMLHttpRequest,而是想从内容脚本中发送一个隐藏的JS表单。此方法允许我在将文本导入数据库之前查看或更改文本。

问题是从后台获取触发器到内容脚本。我已经有另一种消息,所以需要使用函数(响应)。但是,在“sendMessage”之外,我无法监听response.cmd。在“sendMessage”中,我无法获得response.cmd来触发函数。除了从后台脚本发送全新消息之外,还有解决方案吗? 我指的代码:

Background.js

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.cmd == "createSelectionMenu") {
    sendResponse({cmd: "saveText"}); //Do things
  }
});

Content_script.js

chrome.extension.sendMessage({ cmd: "createSelectionMenu", data: selectedText },
  function(response) {
    if(response.cmd == "saveText") { 
      createForm();
    }
  }
});

1 个答案:

答案 0 :(得分:1)

我的工作如下:

我会跟踪我打开的标签

内容脚本

// connect to the background script
var port = chrome.extension.connect();

后台脚本

// a tab requests connection to the background script
chrome.extension.onConnect.addListener(function(port) {
  var tabId = port.sender.tab.id;
  console.log('Received request from content script', port);

  // add tab when opened
  if (channelTabs.indexOf(tabId) == -1) {
    channelTabs.push(tabId);
  }

  // remove when closed/directed to another url
  port.onDisconnect.addListener(function() {
    channelTabs.splice(channelTabs.indexOf(tabId), 1);
  });
});

现在,当某个动作发生时,我可以通过我的后台脚本通知我所有注册的标签(即内容脚本):

var notification = { foo: 'bar' };
for(var i = 0, len = channelTabs.length; i < len; i++) {
  chrome.tabs.sendMessage(channelTabs[i], notification, function(responseMessage) {
    // message coming back from content script
    console.log(responseMessage);
  });
}

同样,在内容脚本的另一端,您可以在这些消息上添加一个监听器:

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.foo == 'bar') {
    executeStuff();
    // if a callback is given:
    sendResponse && sendResponse('success');
  }
});

这有点像脑筋,因为它在某些地方是多余的。但我最喜欢这种方式,因为你可以把它包起来并使它更容易。

如果您想了解我如何使用此功能,请参阅GitHub上的我的存储库:chrome-extension-communicator