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。
事件規則的最佳實踐: