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可用,此處略。)
- 如果幾個條件對應相同的處理行為,則將這些條件放進一個規則中