使用背景指令碼管理事件

擴充功能是一種事件型程式,用於修改或強化 Chrome 瀏覽體驗。活動 瀏覽器觸發條件,例如導覽新網頁、移除書籤或關閉分頁。 擴充功能會在背景指令碼中監控這些事件,並按照特定指示回應。

系統會在需要時載入背景頁面,並在閒置時卸載。以下列舉幾個 事件包括:

  • 初次安裝擴充功能,或更新至新版本。
  • 背景頁面正在監聽事件,並調度事件。
  • 內容指令碼或其他擴充功能會傳送訊息
  • 擴充功能中的另一個檢視畫面 (例如彈出式視窗) 會呼叫 runtime.getBackgroundPage

載入完成後,只要頁面處於執行動作,背景頁面就會持續運作。 例如呼叫 Chrome API 或發出網路要求此外,背景頁面 關閉所有可見的檢視畫面和所有訊息通訊埠後才會卸載。請注意,開啟檢視表 不會導致活動頁面載入,但只能防止載入後關閉。

有效的背景指令碼在監聽火災事件之前會保持靜止狀態, ,然後卸載。

註冊背景指令碼

背景指令碼已在 "background" 欄位下方的資訊清單中註冊。這些 列在陣列的 "scripts" 鍵後,"persistent" 應指定為 false。

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

模組化程式碼可以註冊多個背景指令碼。

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }
敬上

如果擴充功能目前使用永久背景頁面,請參閱「背景遷移」 指南,瞭解如何切換至非永久模式。

初始化擴充功能

監聽 runtime.onInstalled 事件,在安裝時初始化擴充功能。使用這份草稿 事件來設定狀態或進行一次性初始化,例如內容選單

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

設定事件監聽器

根據擴充功能所依賴的事件建立背景指令碼。定義功能相關 事件可讓背景指令碼在觸發這些事件前保持休眠狀態,並防止 擴充功能缺少重要觸發條件

您必須從網頁開頭同步註冊監聽器。

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

請勿以非同步方式註冊事件監聽器,以免無法正確觸發事件。

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

擴充功能可以呼叫 removeListener,從背景指令碼中移除事件監聽器。如果所有 事件接聽程式移除時,Chrome 不會再載入擴充功能的背景指令碼, 該事件。

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

篩選事件

使用支援事件篩選器的 API,將事件監聽器限制在擴充功能維護的情況下 介紹生成式 AI 模型如果擴充功能正在監聽 tabs.onUpdated 事件,請嘗試使用 分頁 API 不支援含有篩選器的 webNavigation.onCompleted 事件 篩選器。

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

回應聽眾

事件監聽器存在,可在事件觸發後觸發功能。如何回應事件 要在監聽器事件中產生所需的回應

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

卸載背景指令碼

資料應定期保留,以免擴充功能在擴充功能終止的情況下遺失重要資訊 未收到 onSuspend 卻當機。請使用 storage API 協助解決這個問題。

chrome.storage.local.set({variable: variableInformation});

如果擴充功能使用郵件傳遞功能,請務必關閉所有通訊埠。背景指令碼 在關閉所有訊息通訊埠前不會卸載。監聽 runtime.Port.onDisconnect 事件。 會深入分析開放通訊埠何時關閉使用以下指令手動關閉 runtime.Port.disconnect

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

監控擴充功能項目時,即可觀察背景指令碼的生命週期 Chrome 的工作管理員中不會顯示這些資訊。

ALT_TEXT_HERE

如要開啟工作管理員,請按一下 Chrome 選單,將滑鼠遊標懸停在更多工具上並選取 [Tasks] 經理」的錯誤訊息。

背景指令碼會在閒置幾秒後自行卸載。如果最近一分鐘內的清理作業 方法,監聽 runtime.onSuspend 事件。

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

不過,建議您優先使用保留資料,而非依賴 runtime.onSuspend。這沒有 讓相關人員視需要進行清理,而且在發生當機時無法提供協助。