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的更多相关文章

  1. Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展

    Page Action类型的Google Chrome浏览器扩展程序,通常也会有一个图标,但这个图标位于Chrome浏览器的地址栏内右端.而且这个图标并非始终出现,而是当某指定的页面打开时才会出现.也 ...

  2. Chrome浏览器扩展开发系列之四:Browser Action类型的Chrome浏览器扩展

    Browser Action类型的Google Chrome扩展程序,通常在Chrome浏览器的工具栏中,地址栏的右侧,有一个始终存在的图标.也就是说,这个图标与浏览器相关,只要安装了该Chrome扩 ...

  3. Chrome浏览器扩展开发系列之十四

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59      阅读:1361      评论:0      收藏:0    ...

  4. Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报  分类: PPAPI(27)  通过将浏览器 ...

  5. Chrome浏览器扩展开发系列之一:初识Google Chrome扩展

    1.       Google Chrome扩展简介 Google Chrome扩展是一种软件,以增强Chrome浏览器的功能. Google Chrome扩展使用HTML.JavaScript.CS ...

  6. Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构

    1) 不可视的background页面 Google Chrome扩展往往包含一个不可见的background页面,Google Chrome扩展的主要业务逻辑都位于此.有两种类型的backgroun ...

  7. EXT.NET高效开发(三)——使用Chrome浏览器的开发人员工具

    这篇帖子老少皆宜,不分男女,不分种族,不分职业.俗话说:“磨刀不误砍柴工”.掌握一些开发工具的使用,对自己帮助是很大的(无论是用于分析问题,还是提高生产力).本篇就讲述如何利用Chrome浏览器(这里 ...

  8. Chrome浏览器扩展开发系列之十九:扩展开发示例

    翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...

  9. Chrome浏览器扩展开发系列之十六:扩展中可用的Chrome浏览器API

    除了Chrome浏览器支持的chrome.* API之外,Chrome浏览器扩展还可以使用Chrome浏览器为Web页面或Chrome app提供的APIs.对于Chrome浏览器2支持的API,还可 ...

随机推荐

  1. Github+Hexo,搭建专有博客

    前言 记得从大二开始,就一直想搭个专属网站,当时使劲抠页面[前端页面是从QQ空间抠的,现在想抠估计没这么容易了],写代码,忙活半天才把程序弄好. 可惜最终项目还是没上线,因为当时有两问题绕不开 需要购 ...

  2. numpy中linspace用法 (等差数列创建函数)

    linspace  函数 是创建等差数列的函数, 最好是在 Matlab  语言中见到这个函数的,近期在学习Python 中的 Numpy, 发现也有这个函数,以下给出自己在学习过程中的一些总结. ( ...

  3. 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)

    github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...

  4. Asp.Net Core-----简介与安装

    Asp.Net Core简介 ASP.NET Core 是一个全新的开源.跨平台框架,可以用它来构建基于网络连接的现代云应用程序,比如:Web 应用,IoT(Internet Of Things,物联 ...

  5. python面向对象的编程

    self相当于在实例化类的过程中传入参数,实例化对象本身 静态方法,静态字段属于类,动态字段,动态方法输入每一个实例化的对象 类实例化的过程把一些属性,方法封装到一个实例化对象当中 动态字段,动态方法 ...

  6. 在windows下使用Qt5开发GTK3图形界面应用程序

    首先,去MSYS2官网下载MSYS2环境并安装在C:/mysys64下,我安装的是64位的. 进入MSYS命令行执行: pacman -S mingw-w64-x86_64-gtk3 pacman - ...

  7. Caused by: java.lang.RuntimeException: by java.lang.OutOfMemoryError: PermGen space(tomcat 启动时提示内存溢出)

    设置MaxPermSize大小TOMCAT_HOME/bin/catalina.bat 文件头加set JAVA_OPTS='-Xms512m -Xmx1024m -XX:MaxPermSize=51 ...

  8. javascript所有的节点和方法

    属性: 1.Attributes 存储节点的属性列表(只读) 2.childNodes 存储节点的子节点列表(只读) 3.dataType 返回此节点的数据类型 4.Definition 以DTD或X ...

  9. 解决微信浏览器禁止链接跳转到iTunes

    方法:微信页面通过safari浏览器打开 safari打开的时候进行跳转 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  10. thinkphp之获取客户端IP地址

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */ function get_cl ...