请解释与Google Chrome扩展程序的后台通信

4
我已经阅读并反复阅读这个页面,以及运行示例:

http://code.google.com/chrome/extensions/background_pages.html

但我似乎不理解如何在background.html、popup.html和content.js之间进行后台通信。我想要发送消息来触发函数、获取响应并处理这些响应。这个示例中的地图部分有点帮助我,但我只需要一些非常简单的东西,不需要所有的地图内容。(注意,我知道jQuery以及JavaScript,所以如果你愿意可以混合使用一些jQuery。)

1个回答

18

所有扩展页面(后台页、弹出窗口、信息栏、页面操作等)都在同一个扩展程序内运行。可以将其视为具有一个域名的网页。而这个域名就是您的扩展ID。每个扩展页面都像普通页面一样(与开发网站时类似)。

所有扩展页面(如上所述)都可以轻松地相互通信,您有多种方法可以这样做:

  1. chrome.extension.getBackgroundPage()

    You do it directly! I use this approach whenever I can. Its cleaner in my opinion.

    var bkg = chrome.extension.getBackgroundPage();`  
    bkg.ping();`
    
  2. chrome.extension.onRequest.addListener and chrome.extension.sendRequest

    As shown below, you can use extension messaging to pass information as well. I use this approach when I want it to be event oriented. I rarely use this within extension pages.

    popup.html

    chrome.extension.sendRequest({method: 'ping'}, function(response) {
       // response.result
    });
    

    background_page.html

    chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
        if (request.method == 'ping') {
            sendResponse({result: 'pong'});
        }
    });
    
现在有一个“扩展页面”和“内容脚本”之间的区别。请仔细阅读该文档以了解它。内容脚本不是扩展页面,您不能像扩展页面那样执行操作。您不能直接与上述任何页面通信。内容脚本是在网页上下文中运行的JavaScript文件,而不是扩展页面。这是一个重要的区别需要认识到。
因此,为了在您的扩展页面和内容脚本之间进行通信,您需要使用消息传递。那个页面有很多信息,我强烈建议您阅读它。它非常类似于我们如何使用消息传递(上面的步骤2),但唯一不同的是如何发送请求。您需要使用chrome.tabs.sendRequest,因为您需要从您的扩展页面(后台、弹出窗口、页面等)向内容脚本发送单个请求。您需要知道您的选项卡ID才能这样做。请查看Tab API获取更多信息。
如果您的扩展程序经常与您的内容脚本通信,您可以使用长时间连接,在我上面链接的消息传递部分中解释得非常清楚。
我已经回答了许多类似问题,并且其他人也是如此。由于您在JavaScript方面有经验,我强烈建议您阅读文档,它包含了您需要的一切。阅读API,我希望您现在了解内容脚本和扩展页面之间的区别,并且它们之间的通信是通过扩展消息传递完成的。

如果在使用jQuery的话,还需要注意一点。你需要在background.html中加载jQuery,否则将无法正常运行。此外,我发现在我的内容脚本请求background.html时,不必使用chrome.tabs.sendRequest方法,只需使用上述第二种方法即可。 - Volomike
还有一些可怕的事情需要注意,可能是我的Chrome在后台更新了新版本。昨天,我能够通过content.js进行AJAX调用而不会出现任何错误。今天——它现在出现了跨域错误,迫使我使用背景方法。这里有一段非常有用的代码:http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/howto/contentscript_xhr/ - Volomike
你不能在内容脚本中使用chrome.tabs.sendRequest或getBackgroundPage,你必须使用#2(消息传递)在后台页面中设置监听器,并通过chrome.extension.sendRequest传递消息。如果需要更多帮助,请告诉我 :) - Mohamed Mansour
@MohamedMansour 如何从Google Chrome扩展程序的信息栏调用后台页面函数、内容脚本函数和弹出窗口.html函数。 - Exception

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接