Quản lý sự kiện bằng tập lệnh nền

Tiện ích là chương trình dựa trên sự kiện, dùng để sửa đổi hoặc nâng cao trải nghiệm duyệt web trên Chrome. Sự kiện là các điều kiện kích hoạt của trình duyệt, chẳng hạn như việc di chuyển đến trang mới, xoá dấu trang hoặc đóng thẻ. Các tiện ích theo dõi những sự kiện này trong tập lệnh nền, sau đó phản ứng bằng các hướng dẫn được chỉ định.

Trang nền được tải khi cần và được huỷ tải khi trang không hoạt động. Sau đây là một số ví dụ về sự kiện:

  • Lần đầu tiên cài đặt hoặc cập nhật tiện ích lên phiên bản mới.
  • Trang nền đang theo dõi một sự kiện và sự kiện đó được gửi đi.
  • Tập lệnh nội dung hoặc tiện ích khác gửi tin nhắn.
  • Một khung hiển thị khác trong tiện ích, chẳng hạn như cửa sổ bật lên, sẽ gọi runtime.getBackgroundPage.

Sau khi được tải, trang nền sẽ vẫn chạy miễn là trang đó đang thực hiện hành động, chẳng hạn như gọi API Chrome hoặc đưa ra yêu cầu mạng. Ngoài ra, trang nền sẽ không bị huỷ tải cho đến khi mọi khung hiển thị hiển thị và mọi cổng thông báo đều được đóng. Xin lưu ý rằng việc mở một chế độ xem không khiến trang sự kiện tải mà chỉ ngăn trang sự kiện đóng sau khi tải.

Các tập lệnh nền hiệu quả sẽ không hoạt động cho đến khi một sự kiện mà chúng đang theo dõi các kích hoạt, phản ứng bằng các hướng dẫn được chỉ định, sau đó huỷ tải.

Đăng ký tập lệnh nền

Tập lệnh nền được đăng ký trong tệp kê khai trong trường "background". Các phương thức này được liệt kê trong một mảng sau khoá "scripts""persistent" phải được chỉ định là false.

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

Bạn có thể đăng ký nhiều tập lệnh nền cho mã được mô-đun hoá.

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

Nếu một tiện ích đang sử dụng trang nền ổn định, hãy tham khảo Hướng dẫn di chuyển trong nền để được hướng dẫn về cách chuyển sang một mô hình không lâu dài.

Khởi chạy tiện ích

Theo dõi sự kiện runtime.onInstalled để khởi chạy tiện ích khi cài đặt. Sử dụng sự kiện này để đặt trạng thái hoặc khởi chạy một lần, chẳng hạn như trình đơn theo bối cảnh.

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

Thiết lập trình nghe

Định cấu trúc tập lệnh nền xung quanh các sự kiện mà tiện ích phụ thuộc. Việc xác định các sự kiện liên quan về chức năng cho phép tập lệnh nền không hoạt động cho đến khi các sự kiện đó được kích hoạt và giúp tiện ích không bỏ lỡ các điều kiện kích hoạt quan trọng.

Trình nghe phải được đăng ký đồng bộ từ đầu trang.

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
});

Đừng đăng ký trình nghe một cách không đồng bộ vì chúng sẽ không được kích hoạt đúng cách.

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

Tiện ích có thể xoá trình nghe khỏi tập lệnh nền bằng cách gọi removeListener. Nếu bạn xoá tất cả trình nghe của một sự kiện, Chrome sẽ không tải tập lệnh nền của tiện ích cho sự kiện đó nữa.

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

Lọc sự kiện

Sử dụng các API hỗ trợ bộ lọc sự kiện để hạn chế trình nghe ở các trường hợp mà tiện ích quan tâm. Nếu một tiện ích đang theo dõi sự kiện tabs.onUpdated, hãy thử sử dụng sự kiện webNavigation.onCompleted có bộ lọc, vì API thẻ không hỗ trợ bộ lọc.

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

Phản ứng với người nghe

Trình nghe tồn tại để kích hoạt chức năng sau khi sự kiện được kích hoạt. Để phản ứng với một sự kiện, hãy cấu trúc phản ứng mong muốn bên trong sự kiện trình nghe.

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"'});
  };
});

Huỷ tải tập lệnh nền

Bạn phải duy trì dữ liệu theo định kỳ để không mất thông tin quan trọng nếu tiện ích gặp sự cố mà không nhận được onSuspend. Hãy sử dụng API storage để hỗ trợ việc này.

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

Nếu một tiện ích sử dụng tính năng truyền tin nhắn, hãy đảm bảo bạn đã đóng tất cả các cổng. Tập lệnh nền sẽ không bị huỷ tải cho đến khi tất cả các cổng thông báo đều tắt. Việc theo dõi sự kiện runtime.Port.onDisconnect sẽ cung cấp thông tin chi tiết về thời điểm đóng các cổng đang mở. Hãy đóng các đường liên kết đó theo cách thủ công bằng runtime.Port.disconnect.

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

Bạn có thể quan sát thời gian hoạt động của tập lệnh nền bằng cách theo dõi thời điểm một mục nhập cho tiện ích xuất hiện và biến mất khỏi trình quản lý tác vụ của Chrome.

ALT_TEXT_HERE

Mở trình quản lý tác vụ bằng cách nhấp vào Trình đơn Chrome, di chuột qua các công cụ khác rồi chọn "Trình quản lý tác vụ".

Tập lệnh nền sẽ tự huỷ tải sau vài giây không hoạt động. Nếu cần dọn dẹp vào phút cuối, hãy theo dõi sự kiện runtime.onSuspend.

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

Tuy nhiên, bạn nên ưu tiên dữ liệu ổn định thay vì phụ thuộc vào runtime.onSuspend. Phương thức này không cho phép dọn dẹp nhiều mức cần thiết và cũng không giúp ích trong trường hợp xảy ra sự cố.