Chrome扩展背景页面可以有多个监听器吗?

时间:2011-02-07 17:07:32

标签: google-chrome google-chrome-extension messaging

我正在构建一个chrome扩展程序并尝试从twitter获取数据,然后将其传递给我的脚本。我遇到很多问题。我能够从远程站点获取数据,但似乎无法将其传递给我的内容脚本。当我使用chrome.extension.onclick.addlistener(functionname);点击图标时,我有一个监听器。这得到了数据。问题是,一旦我获得数据,我需要从我的内容脚本发送对请求的响应。所以我也打电话给chrome.extension.Onrequest.addlistener(functioname);。在我继续试图找出代码有什么问题之前,是否允许在同一页面中为2个独立事件设置2个侦听器,或者只有一个侦听器?

3 个答案:

答案 0 :(得分:2)

我知道这是一个疯狂的老问题,但我在遇到相关问题时遇到了这个问题,想要分享,以防其他人有用。

如果您确实有多个侦听器,请确保您最多只调用一次sendResponse方法。来自文档:

  

sendResponse:有响应时调用(最多一次)的函数。   参数应该是任何可以使用JSON的对象。如果你有超过   一个onMessage监听器在同一个文件中,那么只有一个可以发送一个   响应。事件侦听器时此函数变为无效   返回,除非您从事件侦听器返回true以指示   您希望异步发送响应(这将保留消息   通道打开到另一端,直到调用sendResponse)。

答案 1 :(得分:0)

如果您在Stackoverflow上进行快速搜索,您将看到许多示例,其中包含有关如何将消息从后台页面发送到内容脚本的代码: https://stackoverflow.com/search?tab=relevance&q=content%20script%20background%20page

有关如何执行此操作的详细信息,您可以按照文档本身进行操作,它们有很好的示例: http://code.google.com/chrome/extensions/messaging.html

从文档(复制粘贴):

<强> content_script.cs

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
 if (request.greeting == "hello")
   sendResponse({farewell: "goodbye"});
 else
   sendResponse({}); // snub them.
});

<强> background.html

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendRequest(tab.id, {greeting: "hello"}, function(response) {
    console.log(response.farewell);
  });
});

答案 2 :(得分:0)

您为onClick事件创建了一个侦听器,并且onRequest事件的侦听器不是问题。你可以在控制台输入chrome.onClick和chrome.OnRequest来说明背景页面;你会看到它们都是'chrome.Event'类型的实例。

如果您考虑一下,如果您只能创建一个侦听器,那么会大大降低您编写有用内容的能力,因为您只能响应{onrequest,onclick,ontabchange,onconnect,ondisconnect等}之一。