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

Trình chạy dịch vụ 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ả tính năng hiện có và cho biết mẹo sử dụng các tính năng đó.

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 trình chạy dịch vụ ở phạm vi toàn cục, tức là trình xử lý sự kiện 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 sự kiện này được đăng ký đồng bộ trong quá trình thực thi tập lệnh ban đầu, cho phép Chrome gửi sự kiện đến worker dịch vụ ngay khi worker dịch vụ bắt đầu. Ví dụ:

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

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

Sự kiện phổ biến

Trình chạy dịch vụ tiện ích hỗ trợ các sự kiện trong các API cụ thể. Sau đây là một số lỗi thường gặp. 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ả phiên bản 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.

chrome.action
Được kích hoạt để phản hồi tương tác của người dùng với biểu tượng thanh công cụ của tiện ích, cho dù hành động đó là dành cho một trang (thẻ) cụ thể hay cho toàn bộ tiện ích.
chrome.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.
chrome.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 các thông báo hệ thống do tiện ích tạo ra.
chrome.permissions
Cho biết thời điểm người dùng cấp hoặc thu hồi quyền cho tiện ích.
chrome.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ề một tiện ích hoặc bản cập nhật Chrome hiện có.
chrome.storage.onChanged
Được kích hoạt bất cứ khi nào xoá đối tượng StorageArea hoặc khi thay đổi hoặc đặt giá trị của khoá. Xin lưu ý rằng mỗi thực thể StorageArea đều có sự kiện onChanged riêng.
chrome.webNavigation
Cung cấp thông tin về trạng thái của các yêu cầu điều hướng trong chuyến bay.

Bộ lọc

Để hạn chế các sự kiện cho một 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 cân nhắc việc 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 sử dụng webNavigation.onCompleted với một bộ lọc. Ví dụ:

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

chrome.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ụ web

Worker dịch vụ tiện ích hỗ trợ nhiều sự kiện hơn vòng đời được mô tả ở nơi khác.

ServiceWorkerGlobal.fetch

Được kích hoạt khi bất kỳ nội dung nào được truy xuất từ gói tiện ích hoặc khi fetch()XMLHttpRequest() được gọi từ một 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 sau, bạn 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 tính năng truyền tin nhắn theo tiện ích, bạn còn có thể truyền tin nhắn của trình chạy dịch vụ, nhưng hai hệ thống này không tương tác với nhau. Điều đó có nghĩa là các thông báo được gửi bằng sendMessage() (có sẵn từ một số API tiện ích) sẽ không bị trình xử lý thông báo của worker dịch vụ chặn. Tương tự, trình xử lý thông báo tiện ích sẽ không chặn các thông báo được gửi bằng postMessage(). Cả hai loại trình xử lý thông báo (nghĩa là cả ServiceWorkerGlobal.messagechrome.runtime.onMessage) đều được hỗ trợ trong worker dịch vụ tiện ích.

Bạn nên ưu tiên gửi thông báo tiện ích trừ khi có lý do cụ thể khi sử dụng tính năng nhắn tin của trình chạy dịch vụ.