Chrome瀏覽器擴展開發系列之十七:擴展中可用的chrome.events API

chrome.events中定義了一些常見的事件類型,能夠供Chrome瀏覽器擴展程序發出對應的事件對象。web

對於關注的事件,首先要經過addListener()在對應的事件上註冊監聽器,示例以下:chrome

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

addListener()老是帶一個參數,這就是事件處理函數。一旦事件發生,監聽器即調用事件處理函數。數組

事件處理函數還能夠有參數,具體參數的數量和類型與監聽的事件相關。瀏覽器

chrome.events中,事件沒有任何屬性,只包含以下的經常使用方法:app

方法名函數

返回值google

類型url

註釋spa

addListener(function() {...})code

爲事件註冊監聽器,並給出事件處理函數

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可用,此處略。)
  • 若是幾個條件對應相同的處理行爲,則將這些條件放進一個規則中
相關文章
相關標籤/搜索