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

Chrome擴充套件開發極客發表於2015-10-14

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

 

相關文章