Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API
chrome.events中定义了一些常见的事件类型,可以供Chrome浏览器扩展程序发出对应的事件对象。
对于关注的事件,首先要通过addListener()在对应的事件上注册监听器,示例如下:
chrome.alarms.onAlarm.addListener(function(alarm) {
appendToLog('alarms.onAlarm --'
+ ' name: ' + alarm.name
+ ' scheduledTime: ' + alarm.scheduledTime);
});
addListener()总是带一个参数,这就是事件处理函数。一旦事件发生,监听器即调用事件处理函数。
事件处理函数还可以有参数,具体参数的数量和类型与监听的事件相关。
chrome.events中,事件没有任何属性,只包含如下的常用方法:
|
方法名 |
返回值 类型 |
注释 |
|
addListener(function() {...}) |
无 |
为事件注册监听器,并给出事件处理函数 |
|
removeListener(function() {...}) |
无 |
删除事件的监听器 |
|
hasListener(function() {...}) |
boolean |
判断事件上是否注册有监听器 |
|
hasListeners() |
boolean |
判断事件上是否注册有监听器,没有回调函数 |
|
addRules(array of Rule rules, function (array of Rule rules) {...}) |
无 |
为事件注册规则 如果第一个参数的数组中有无效规则,则不会注册任何规则 |
|
removeRules(array of string ruleIdentifiers, function() {...}) |
无 |
删除事件上注册的所有规则。 如果有第一个参数(可以没有),则只删除注册的、在范围内的规则 |
|
getRules(array of string ruleIdentifiers, function (array of Rule rules) {...}) |
无 |
返回事件上注册的所有规则。 如果有第一个参数(可以没有),则只返回注册的、在范围内的规则 |
有这样一种场景,对于发生的事件,只有当满足某些条件时才进行处理,即并非要对发生的该事件都进行处理。对于这种情况,可以通过为事件处理函数附加过滤条件实现,也可以采用全新的事件规则机制。下面分别讨论。
1) 过滤事件
过滤事件,就是对于监听的事件,只有当其符合过滤条件时,才会调用事件处理函数。多个过滤条件之间是“或”的关系。示例如下:
chrome.webNavigation.onCommitted.addListener(
function(e) {
// ...
}, {url: [{hostSuffix: 'google.com'},//过滤条件1
{hostSuffix: 'google.com.au'}]}//过滤条件2
);
2) 声明式事件处理器(事件规则)
声明式事件处理器就是为事件定义处理规则。注册了规则的事件对象,当事件对象发生时,不会再调用事件处理函数,而是检测注册的规则的条件是否有匹配,如果匹配则执行规则的行为。
通常,规则必须包含声明条件和处理行为。示例如下:
var rule = {
id: "my rule", // 标识符可选, 没有则自动生成
priority: , // 优先级可选, 默认为100
conditions: [ /* my conditions */ ],
actions: [ /* my actions */ ]
};
一个规则可以拥有多个条件,条件之间是“或”的关系,即任意一个条件满足则表示匹配规则。
一个规则可以拥有多个处理行为,行为之间是“与”的关系,即所有的行为作为一个整体,在条件匹配的时候一起执行。
chrome.events.Rule对象的属性如下:
|
属性名 |
类型 |
必选/可选 |
注释 |
|
id |
string |
可选 |
标识符 |
|
tags |
array of string |
可选 |
规则的标签,多个规则可以根据标签分组 |
|
conditions |
array of any |
必选 |
触发处理行为的条件 |
|
actions |
array of any |
必选 |
任一条件匹配时触发的处理行为 |
|
priority |
integer |
可选 |
规则的优先级,默认100 |
一个规则在整个浏览器的会话中都是有效得到,所以通常在安装Chrome扩展的chrome.runtime.onInstalled事件处理函数中安装规则。而在Chrome扩展升级时也会触发chrome.runtime.onInstalled事件,所以要注意在该事件处理函数中,先判断是否有已经安装了的规则,如果有则首先删除已经安装的规则,然后再安装规则。
声明式条件的检查由浏览器直接进行,而无需JavaScript引擎,所以减少了延迟。
声明式事件处理器往往用于chrome.declarativeWebRequest API(目前还不稳定)和chrome.declarativeContent API。
事件规则的最佳实践:
- 以数组的方式批量注册规则,而非逐个注册规则;
- 规则的条件是URL时,将URL分成若干个子字符串进行匹配,而非整个URL的表达式;(对URL的过滤,有一个专用的chrome.events.UrlFilter可用,此处略。)
- 如果几个条件对应相同的处理行为,则将这些条件放进一个规则中
Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API的更多相关文章
- Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展
Page Action类型的Google Chrome浏览器扩展程序,通常也会有一个图标,但这个图标位于Chrome浏览器的地址栏内右端.而且这个图标并非始终出现,而是当某指定的页面打开时才会出现.也 ...
- Chrome浏览器扩展开发系列之四:Browser Action类型的Chrome浏览器扩展
Browser Action类型的Google Chrome扩展程序,通常在Chrome浏览器的工具栏中,地址栏的右侧,有一个始终存在的图标.也就是说,这个图标与浏览器相关,只要安装了该Chrome扩 ...
- Chrome浏览器扩展开发系列之十四
Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59 阅读:1361 评论:0 收藏:0 ...
- Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin
Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报 分类: PPAPI(27) 通过将浏览器 ...
- Chrome浏览器扩展开发系列之一:初识Google Chrome扩展
1. Google Chrome扩展简介 Google Chrome扩展是一种软件,以增强Chrome浏览器的功能. Google Chrome扩展使用HTML.JavaScript.CS ...
- Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构
1) 不可视的background页面 Google Chrome扩展往往包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此.有两种类型的backgroun ...
- EXT.NET高效开发(三)——使用Chrome浏览器的开发人员工具
这篇帖子老少皆宜,不分男女,不分种族,不分职业.俗话说:“磨刀不误砍柴工”.掌握一些开发工具的使用,对自己帮助是很大的(无论是用于分析问题,还是提高生产力).本篇就讲述如何利用Chrome浏览器(这里 ...
- Chrome浏览器扩展开发系列之十九:扩展开发示例
翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...
- Chrome浏览器扩展开发系列之十六:扩展中可用的Chrome浏览器API
除了Chrome浏览器支持的chrome.* API之外,Chrome浏览器扩展还可以使用Chrome浏览器为Web页面或Chrome app提供的APIs.对于Chrome浏览器2支持的API,还可 ...
随机推荐
- STM32串口控制步进电机(原创)
用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可 ...
- Java反射机制剖析(二)-功能以及举例
从<java反射机制剖析(一)>的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢? 从上篇API中我们能看到它能够完成下面的这些功能: 1) 获得类 A. 运 ...
- Flight学习(一)
翻看git时看到有新消息提示,点进去第一个就是Flight,那么今天就简单来翻译和了解一下这个框架吧,锻炼下自己的英文文档阅读能力,同时也熟悉下JavaScript.时间太赶,难免出现翻译失误和错误, ...
- ASP.NET MVC Filter的思考
思考了一下AOP的具体实现,后来想到ASP.NET MVC过滤器其实就是AOP的一种,于是从Filter下手研究AOP. 暂时先考虑AuthorizationFilter,ActionFilter,R ...
- 第39篇 免费博客github Pages绑定域名
原文地址:http://blog.laofu.online/2017/06/02/how-bind-domain/ 网站已经有了,需要对网站来绑定一个自己的个性域名,本人是买了一个阿里云的域名,也就是 ...
- 2016计蒜之道复赛B题:联想专卖店促销
题解 思路: 二分答案,设我们要check的值为x. 注意到每一个礼包都有,一个U盘,一个鼠标. 剩余的,分别为一个机械键盘,一个U盘,一个鼠标. 当礼包数目为x时,我们至多可以提供a-x个普通,b- ...
- Flex 布局:语法篇
网页布局(layout)是 CSS 的一个重点应用.布局的传统解决方案,基于盒状模型,依赖 display 属性 + position 属性 + float 属性.它对于那些特殊布局非常不方便,比如, ...
- 用java来实现验证码功能(本帖为转载贴),作为个人学习收藏用
一.关于为何使用验证的解释 在目前的网页的登录.注册中经常会见到各种验证码.其目的便是为了:防止暴力破解 .因为只要CPU性能较强,便可以在慢慢尝试密码的过程中来破解用户账号,因而导致的结果是用户信 ...
- 使用jedis实现Redis消息队列(MQ)的发布(publish)和消息监听(subscribe)
前言: 本文基于jedis 2.9.0.jar.commons-pool2-2.4.2.jar以及json-20160810.jar 其中jedis连接池需要依赖commons-pool2包,json ...
- 踩一踩微信小程序开发的坑---tabBar
最近忙于开发视频直播的项目,小程序学习也放置了两三个星期了,web开发者工具更新到新版,发现上个版本做的demo不显示了