Sự kiện trong trình chạy dịch vụ

Các worker dịch vụ của tiện ích hỗ trợ cả sự kiện trình chạy dịch vụ tiêu chuẩn và nhiều sự kiện trong API tiện ích. Phần này mô tả những thông tin có sẵn và đưa ra các mẹo sử dụng những thông tin đó.

Khai báo các sự kiện của tiện ích

Bạn cần khai báo trình xử lý sự kiện trong các worker dịch vụ trong phạm vi chung, tức là chúng phải ở cấp cao nhất của tập lệnh và không được lồng trong các hàm. Điều này đảm bảo rằng các đối tượng này được đăng ký đồng bộ khi thực thi tập lệnh ban đầu, cho phép Chrome gửi các sự kiện đến trình chạy dịch vụ ngay khi bắt đầu. Ví dụ:

Không nên
browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
  browser.action.onClicked.addListener(handleActionClick);
});
Tốt hơn
browser.action.onClicked.addListener(handleActionClick);

browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
});

Sự kiện thông thường

Các worker dịch vụ của tiện ích hỗ trợ các sự kiện trong các API cụ thể. Sau đây là một số lý do phổ biến. Xin lưu ý rằng một số API trong số này yêu cầu quyền sử dụng và một số API khác có thể có các sự kiện, phương thức hoặc thuộc tính không có trong tất cả các phiên bản của Chrome. Để biết thông tin chi tiết, hãy xem tài liệu về API được liên kết, đặc biệt là các sự kiện, phương thức hoặc thuộc tính mà bạn muốn sử dụng.

browser.action
Được kích hoạt để phản hồi một lượt tương tác của người dùng với biểu tượng trên thanh công cụ của tiện ích, cho dù hành động đó là cho một trang (thẻ) cụ thể hay cho toàn bộ tiện ích.
browser.management
Cung cấp các sự kiện liên quan đến việc cài đặt, gỡ cài đặt, bật và tắt tiện ích.
browser.notifications
Cung cấp các sự kiện liên quan đến hoạt động tương tác của người dùng với thông báo hệ thống do tiện ích tạo.
browser.permissions
Cho biết thời điểm người dùng cấp hoặc thu hồi quyền của tiện ích.
browser.runtime
Cung cấp các sự kiện liên quan đến vòng đời của tiện ích, thông báo được gửi từ các phần khác của tiện ích và thông báo về bản cập nhật Chrome hoặc tiện ích có sẵn.
browser.storage.onChanged
Kích hoạt bất cứ khi nào có đối tượng StorageArea bị xoá hoặc khi giá trị của một khoá bị thay đổi hoặc được đặt. Xin lưu ý rằng mỗi thực thể StorageArea đều có sự kiện onChanged riêng.
browser.webNavigation
Cung cấp thông tin về trạng thái của các yêu cầu chỉ đường đang diễn ra.

Bộ lọc

Để hạn chế các sự kiện cho trường hợp sử dụng cụ thể hoặc loại bỏ các lệnh gọi sự kiện không cần thiết, hãy sử dụng các API hỗ trợ bộ lọc sự kiện. Ví dụ: hãy xem xét một tiện ích đang theo dõi sự kiện tabs.onUpdated để phát hiện thời điểm người dùng chuyển đến một trang web cụ thể. Sự kiện này sẽ được gọi trên mọi thao tác điều hướng trên mọi thẻ. Thay vào đó, hãy dùng webNavigation.onCompleted với một bộ lọc. Ví dụ:

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

browser.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

Sự kiện của trình chạy dịch vụ

Extension service worker hỗ trợ nhiều sự kiện trong vòng đời hơn được mô tả ở nơi khác.

ServiceWorkerGlobal.fetch

Được kích hoạt khi có nội dung được truy xuất từ gói tiện ích hoặc khi fetch()XMLHttpRequest() được gọi từ một tập lệnh tiện ích hoặc tập lệnh cửa sổ bật lên. (Trình xử lý fetch của trình chạy dịch vụ không chặn các lệnh gọi từ tập lệnh nội dung.) Trong trường hợp thứ hai, bạn sẽ cần thêm URL của các trang mà bạn muốn tìm nạp vào khoá "host_permissions" trong manifest.json.

ServiceWorkerGlobal.message

Ngoài truyền thông báo của tiện ích, bạn cũng có thể sử dụng tính năng truyền thông báo của trình chạy dịch vụ, nhưng 2 hệ thống này không tương tác được với nhau. Điều đó có nghĩa là các thông báo được gửi bằng sendMessage() (có trong một số API tiện ích) sẽ không bị trình xử lý thông báo của trình chạy dịch vụ chặn. Tương tự, các trình xử lý thông báo của tiện ích sẽ không chặn những thông báo được gửi bằng postMessage(). Cả hai loại trình xử lý thông báo (tức là cả ServiceWorkerGlobal.messagebrowser.runtime.onMessage) đều được hỗ trợ trong các worker dịch vụ của tiện ích.

Bạn nên ưu tiên sử dụng nhắn tin qua tiện ích, trừ phi bạn có lý do cụ thể để sử dụng tính năng nhắn tin qua trình chạy dịch vụ.