Chrome插件开发进阶

好奇心使然,体验了下chrome的插件开发(按照英文的意思chrome extension或许更应该称为chrome扩展),发现还真是个不错的东东,在浏览google开发文档的同时也做了些尝试,脑子不好使,不记录下来的话没准过一周就淡忘了,索性把自己的一些尝试记录下来跟大家分享一下吧。
本文会围绕chrome插件以下的5个概念来进行说明:
background page(后台页面)
browser action(浏览器功能扩展)
content script(内容脚本)
page action(页面功能扩展)
NPAPI plugin(NPAPI插件)

另外,本文并不是chrome插件的入门文档,或许需要你对chrome extension有一定了解才容易理解这些内容,所以如果你完全没接触过chrome extension,建议你先看以下文章:

1. background page
manifest.json文件中可以如此定义background:
[javascript]  view plain copy
  1. {  
  2.   "background": {  
  3.     "scripts": ["background.js"]  
  4.   }  
  5. }  
当然也可以通过属性"page"替换"scripts"来引入.html文件,不过scripts和page只能两选其一,如下所示:
"background": {     "page": "background.html" }
顾名思义,可以理解为背景页面脚本,或者直接解释为后台脚本。background用来处理插件本身的一些逻辑,比如插件加载时需要执行的处理,运行中需要统一维护的数据等等,background只会在插件加载的时候运行一次,你可以在这个过程中让它绑定一些运行中的事件。比如background中可以直接访问chrome.browserAction对象来设置和定义browserAction,如:
[javascript]  view plain copy
  1. chrome.browserAction.setIcon({path:"icon.png"});  
也可以绑定browserAction的点击事件定义事件响应处理:
[javascript]  view plain copy
  1. chrome.browserAction.onClicked.addListener(function(){  
  2.      ......  
  3. });  
还可以在background中调用chrome.tabs.create()来创建新的tab。
除了跟browserAction进行交互以外,与content script也可以进行协作,这点让我们在content script的部分中再来说明。

2. browser action
browser action可以理解为对浏览器现有菜单功能的扩展。可以在manifest.json文件中对browser action进行配置。
[javascript]  view plain copy
  1. {     
  2.     "browser_action": {       
  3.         "default_icon""icon19.png",   
  4.         "default_title""Google Mail",  
  5.         "default_popup""popup.html"   
  6.     }  
  7. }  
如此设置下,在插件加载时浏览器菜单栏就会有如上图所示的桔色按钮(icon19.png),单击此按钮会弹出popup.html描述的窗口。前面我们已经说明过在background中可以访问browser action,那反过来呢?这个更直接,在browser action中通过background对象可以直接调用background中定义的方法或对象,如下所示,假设在background.js中定义了testBG函数,那么在popup.html中可以这样访问:
[javascript]  view plain copy
  1. var bg = chrome.extension.getBackgroundPage();   
  2. bg.testBG();  
在popup中还可以注入代码到web page中,但只限于对dom的访问和修改。
[javascript]  view plain copy
  1. chrome.tabs.executeScript(null, {code:"document.body.style.backgroundColor=blue"});  

3. content script
你肯定不会仅满足于对浏览器菜单功能进行扩展,很多时候也需要跟页面本身进行交互,这是就需要用到内容脚本content script,content script跟页面page共用同一份页面的dom,也就是说content script可以直接去访问或修改当前页面的dom,但是注意了,它们只是共享了dom的访问,js处理本身却是在两个不同的沙盒中运行的,所以并不能互调各自的js代码。
如下处理是在当前页面中插入一个div节点:
[javascript]  view plain copy
  1. var element = document.body.firstChild;  
  2. var div = document.createElement("div");  
  3. document.body.insertBefore(div, element);  
那么在content script中能跟background交互吗?当然。首先在content script中可以通过chrome.extension.sendRequest给background发送消息请求,同时可以通过chrome.extension.onRequest.addListener来监听从background发送来的消息。
content script监听消息:
[javascript]  view plain copy
  1. chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {});  
background发送消息:
[javascript]  view plain copy
  1. chrome.tabs.sendRequest(tab.id, data, function(data) {});  
反之,
background监听消息:
[javascript]  view plain copy
  1. chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {});  
content script侧发送消息:
[javascript]  view plain copy
  1. chrome.extension.sendRequest(data, function(data) {});  

content script除了跟background可以交互,跟web page本身也可以有信息交互。一方面content script可以直接访问page的dom,同时还可以通过dom的Event来跟页面进行交互。                     
content script中绑定事件:
[javascript]  view plain copy
  1. document.addEventListener("EventName",function() {});  
web page中如何发送事件给content script呢?如下:
[javascript]  view plain copy
  1. var ev = document.createEvent('HTMLEvents');   
  2. ev.initEvent('EventName'falsefalse);  
  3. document.dispatchEvent(ev);  
反之,web page中绑定事件,content script中触发事件的话同上面处理一样,也成立。

4. page action
page action跟browser action有所区别,它会加载和显示在地址栏的里面,所以一般会跟当前访问的URL地址进行交互,比如你可以让浏览器在访问所有带"mail"字符串的URL时显示page action。具体的显示位置如下图:
如果想使用page action功能,需要在manifest.json中定义如下属性:
[javascript]  view plain copy
  1. "page_action" : {       
  2.     "default_icon" : "icon.png",  
  3.     "default_title" : "Page Action"  
  4. }  
我们可以把对page aciton的设置和处理放在background page中,从而直接在background中通过chrome.pageAction来设置page action,比如如下代码实现了当所访问URL中有mail字符串时就显示page action的icon这样的功能:
[javascript]  view plain copy
  1. chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {        
  2.     if (tab.url.indexOf("mail") > -1) {             
  3.         chrome.pageAction.show(tabId);  
  4.     }  
  5. });  

5. NPAPI Plugin
JS虽然越来越牛叉了,但毕竟存在局限性,有些处理目前用JS来做毕竟还不现实,比如视频插件,大数据计算等,这类处理大部分还是会通过C++等语言封装的组件来实现的,那么在JS的插件里怎么调用这些C++的组件?因为chrome支持了NPAPI,那这点就不成问题了。(关于什么是NPAPI,一来不是本文介绍的重点,二来我也没详细研究过,有兴趣的自己google吧)
在这里就介绍下在chrome插件中怎么去结合NPAPI插件。首先需要在manifest.json中定义如下关于插件的属性:
[javascript]  view plain copy
  1. "plugins": [  
  2.     { "path""plugin1.dll""public"true },  
  3.     { "path""plugin2.dll" }  
  4. ]  
当chrome插件加载后,就可以在html页面中使用所定义的NPAPI插件了,假设插件的mime-type是x-plugin1时我们可以这样去调用NPAPI插件:
[html]  view plain copy
  1. <embed type="application/x-plugin1" id="pluginId">  
  2. <script>  
  3.   var plugin = document.getElementById("pluginId");  
  4.   var result = plugin.PluginMethod(); //调用plugin中定义的方法   
  5. </script>  

好了,就写这么多,谨以此文整理了下自己的思路,也希望能给大家带来一些收获。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值