首先吐槽“360极速浏览器应用开发平台”的开发文档,在消息传递(http://open.chrome.360.cn/extension_dev/messaging.html)一节中,翻译极其低劣:

Sending a request from the extension to a content script looks very similar, except
that you need to specify which tab to send it to. This example demonstrates sending a message to the content script in the selected tab.

传递一个请求到扩展很容易,你需要指定哪个标签发起这个请求。下面这个例子展示了如何指定标签发起一个请求。

similar翻译成容易,发送到tab翻译成标签发起。

代码更新也不及时,chrome.tabs.getSelected和chrome.extension.sendRequest这两个函数在新版Chrome已经废弃(参考资料[1])。

学习过程中偷懒不看英文,结果反而被绕个大圈子。

1、开发文档

Chrome的消息传递,可以在Web(通过content script)和扩展之间进行,任意一方都可发送或接收消息。

Web(通过content
script)发送消息如下:


  1. chrome.runtime.sendMessage({greeting: “hello”}, function(response) {
  2. console.log(response.farewell);
  3. });

通过chrome.runtime.sendMessage函数发送消息,其中{greeting: “hello”}是消息对象(大括号的用法见参考资料[2]);function(response) {…}是回调函数,处理接收方发回的消息。

插件发送消息需要确定接收的Tab,如下:


  1. chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
  2. chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
  3. console.log(response.farewell);
  4. });
  5. });

以上代码指定当前tab为消息的接收者。

接受端需要通过runtime.onMessage事件处理消息:


  1. chrome.runtime.onMessage.addListener(
  2. function(request, sender, sendResponse) {
  3. console.log(sender.tab ?
  4. "from a content script:" + sender.tab.url :
  5. "from the extension");
  6. if (request.greeting == "hello")
  7. sendResponse({farewell: "goodbye"});
  8. });

事件处理通过function(request, sender, sendResponse){…}完成,以上代码处理消息时在控制台记录发送者的消息,回复“goodbye”消息。

2、完整示例
示例完成content script和插件的消息传递,具体包括:

1、content script发送消息,backgroud接收消息;

2、popup发送消息,content script接收消息。

manifest.json


  1. {
  2. "manifest_version": 2,
  3. "name": "Say Hello",
  4. "description": "This extension say hello to you.",
  5. "version": "1.0",
  6. "permissions": ["tabs", "<all_urls>"],
  7. "browser_action": {
  8. "default_icon": "icon.png",
  9. "default_popup": "popup.html"
  10. },
  11. "background": {
  12. "page": "background.html"
  13. },
  14. "content_scripts": [{
  15. "matches": ["<all_urls>"],
  16. "js": ["contentscript.js"]
  17. }]
  18. }

contentscript.js


  1. chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
  2. console.log(response.farewell);
  3. });
  4. chrome.runtime.onMessage.addListener(
  5. function(request, sender, sendResponse) {
  6. console.log(sender.tab ?
  7. "from a content script:" + sender.tab.url :
  8. "from the extension");
  9. if (request.greeting == "hello"){
  10. sendResponse({farewell: "I'm contentscript,goodbye!"});
  11. }
  12. });

background.html


  1. <!doctype html>
  2. <html>
  3. <head>
  4. <title>
  5. Getting Started Extension's Popup
  6. </title>
  7. <script src="background.js">
  8. </script>
  9. </head>
  10. <body>
  11. <p>
  12. Hello!
  13. </p>
  14. <div id="r">
  15. </div>
  16. </body>
  17. </html>

background.js


  1. chrome.runtime.onMessage.addListener(
  2. function(request, sender, sendResponse) {
  3. console.log(sender.tab ?
  4. "from a content script:" + sender.tab.url :
  5. "from the extension");
  6. if (request.greeting == "hello")
  7. sendResponse({farewell: "I'm backgroud,goodbye!"});
  8. });

popup.html


  1. <!doctype html>
  2. <html>
  3. <head>
  4. <title>
  5. Getting Started Extension's Popup
  6. </title>
  7. <script type="text/javascript" src="jquery.js">
  8. </script>
  9. <script src="popup.js">
  10. </script>
  11. </head>
  12. <body>
  13. <p>
  14. Hello!
  15. </p>
  16. <div id="r">
  17. </div>
  18. </body>
  19. </html>

popup.js


  1. chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
  2. chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
  3. console.log(response.farewell);
  4. });
  5. });

参考资料

[1]Content脚本与扩展的其他页面脚本的消息传递http://blog.csdn.net/greatpresident/article/details/9052801

[2]Javascript中大括号“{}”的多义性http://www.cnblogs.com/snandy/archive/2011/02/28/1966894.html

Chrome插件消息传递实例的更多相关文章

  1. 利用chrome插件批量读取浏览器页面内容并写入数据库

    试想一下,如果每天要收集100页网页数据甚至更多.如果采用人工收集会吐血,用程序去收集也就成为一个不二的选择.首先肯定会想到说用java.php.C#等高级语言,但这偏偏又有个登陆和验证码,搞到无所适 ...

  2. 微软专家推荐11个Chrome 插件

    Web开发人员,需要长时间使用浏览器,尽管Windows10 Edge浏览器启动非常快速,且支持110多种设备,Edge支持基于JS 扩展,但也删除了很多旧功能像Active-X等插件.多数情况下,插 ...

  3. 我的项目:一个chrome插件的诞生记,名字叫jumper

    选课是个问题,为了选课,便有了以下的故事. 最开始,萌生想法于2013年7月. 接着网上了解了chrome的结构知识,却发现例子是假的. 幸好有之前师兄的一个同功能插件开源,但代码写得很乱,我喜欢逻辑 ...

  4. Chrome插件Visual Event查看Dom元素绑定事件的利器

    找这工具找了好久,统一找着了,开发人员不可多得的好东东,收藏做一下分享. 用Chrome插件Visual Event查看Dom绑定的事件 Visual Event简介 Visual Event是一个开 ...

  5. 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)

    写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github ...

  6. 【干货】Chrome插件(扩展)开发全攻略

    写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github ...

  7. 2018-10-31 在线代码离线翻译Chrome插件"一马"v0.0.8

    续前文: Chrome插件实现GitHub代码离线翻译v0.0.4 添加了对"码云"在线代码的翻译支持, 因此改名暂为"一马". 在此贴中调研了常用的在线代码网 ...

  8. chrome 浏览器插件开发(一)—— 创建第一个chrome插件

    最近在开发一个chrome插件,在网上找到了一些的文章,虽说按照文章可以写出对应的例子,但若要进行实际开发,发现还是有不少文章中没有的坑.下面我将结合我在开发过程中遇到的几个方面,对这些坑做一下补充. ...

  9. Chrome插件(扩展)

    [干货]Chrome插件(扩展)开发全攻略   写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均 ...

随机推荐

  1. find 命令 查找

    find 查找文件和目录 find /home -name "" find 后接查找的目录,-name 后指定需要查找的文件名 文件名可以用*表示所有find /home -nam ...

  2. CentOS 下安装 Node.js 8.11.3 LTS Version

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google Chrome V8 JavaScript引擎,简单说是运行在服务端的 JavaScript.下面我们来演示一下Cen ...

  3. dedecms站内搜索页面调用最新文章

    在页面中调用最新文章列表可以使新发布的文章更快被收录,如何在dedecms站内搜索页面调用最新文章呢? 1.登陆系统后台,进入“模板——模板管理——自定义宏标记”,点击“智能标记向导”进入智能标记生成 ...

  4. zabbix基础知识

    zabbix监控 初级 1.识别监控对象(分级) 2.理解监控对象(理论知识) 3.细分监控对象的指标 4.确定报警的基准线 预中级 1.工具化和监控分离 2.监控对象的分类 2.1硬件监控(方法:机 ...

  5. 呼叫转接ECT

    ECT(Explicit Call Transfer,呼叫转接)是一种较为特殊的补充业务.签约ECT业务的用户A先呼叫用户B,在与用户B建立通话后,用户A通过终端发起保持用户B呼叫的请求,此时用户B会 ...

  6. 快学Scala 1

      1. Scala解释器读到一个表达式,对它进行求值,将它打印出来,接着再继续读下一个表达式.这个过程被称作“读取-求值-打印-循环”,即REPL.   2. 从技术上来讲,scala程序并不是一个 ...

  7. python线程中的join(转)

    Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多 ...

  8. GOROOT、GOPATH、GOBIN

    GOROOT golang安装路径. GOPATH GOPATH可以设置多个工程目录,linux下用冒号分隔(必须用冒号,fish shell的空格分割会出错),windows下用分号分隔,但是go ...

  9. nginx命令行参数

    通过控制台进入nginx目录后 1. 启动nginx start nginx 或 nginx.exe 2. 重启nginx nginx -s reload 3. 停止nginx nginx -s st ...

  10. 合理利用配置不同的机器资源做redis cluster的server

    Redis cluster可以使用不同配置的机器学习因为我们可以手动调整不同的机器所承担的slot的个数,这样内存小CPU相对少的机器应该承担更少的slots