zoukankan      html  css  js  c++  java
  • Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API

    chrome.events中定义了一些常见的事件类型,可以供Chrome浏览器扩展程序发出对应的事件对象。

    对于关注的事件,首先要通过addListener()在对应的事件上注册监听器,示例如下:

    1 chrome.alarms.onAlarm.addListener(function(alarm) {
    2         appendToLog('alarms.onAlarm --'
    3                     + ' name: ' + alarm.name
    4                     + ' scheduledTime: ' + alarm.scheduledTime);
    5       });

    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)      过滤事件

    过滤事件,就是对于监听的事件,只有当其符合过滤条件时,才会调用事件处理函数。多个过滤条件之间是“或”的关系。示例如下:

    1 chrome.webNavigation.onCommitted.addListener(
    2       function(e) {
    3         // ...
    4       }, {url: [{hostSuffix: 'google.com'},//过滤条件1
    5                 {hostSuffix: 'google.com.au'}]}//过滤条件2
    6 );

    2)      声明式事件处理器(事件规则)

    声明式事件处理器就是为事件定义处理规则。注册了规则的事件对象,当事件对象发生时,不会再调用事件处理函数,而是检测注册的规则的条件是否有匹配,如果匹配则执行规则的行为。

    通常,规则必须包含声明条件和处理行为。示例如下:

    1 var rule = {
    2         id: "my rule",  // 标识符可选, 没有则自动生成
    3         priority: 100,  // 优先级可选, 默认为100
    4         conditions: [ /* my conditions */ ],
    5         actions: [ /* my actions */ ]
    6       };

    一个规则可以拥有多个条件,条件之间是“或”的关系,即任意一个条件满足则表示匹配规则。

    一个规则可以拥有多个处理行为,行为之间是“与”的关系,即所有的行为作为一个整体,在条件匹配的时候一起执行。

    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可用,此处略。)
    • 如果几个条件对应相同的处理行为,则将这些条件放进一个规则中
  • 相关阅读:
    C# 项目提交过程中感受
    C# 工作中遇到的几个问题
    C# Enum Name String Description之间的相互转换
    Win 10下安装 Redis
    Entity Framework 学习系列(3)
    Entity Framework 学习系列(2)
    Entity Framework 学习系列(1)
    解决 win10 家庭版环境下 MySQL 的ODBC驱动下载及安装
    Echarts 学习系列(3)-Echarts动态数据交互
    Echarts 学习系列(2)-常见的静态ECharts图
  • 原文地址:https://www.cnblogs.com/champagne/p/4877664.html
Copyright © 2011-2022 走看看