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