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 của trình chạy dịch vụ chuẩn và nhiều sự kiện trong API tiện ích. Phần này mô tả các tính năng có sẵn và cung cấp mẹo để sử dụng những tính năng đó.

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

Bạn cần khai báo trình xử lý sự kiện trong Service worker trong phạm vi toàn cục, nghĩa là chúng phải ở cấp cao nhất trong tập lệnh và không được lồng bên 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ộ 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 khởi động. Ví dụ:

Không nên dùng
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 thường gặp

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ố ví dụ thường gặp. Xin lưu ý rằng một số API này yêu cầu quyền để sử dụng, còn 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 một số 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 khi người dùng tương tác với biểu tượng thanh công cụ của tiện ích, cho dù đó là hành động đối với một trang (thẻ) cụ thể hay đối với 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 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 sử dụng 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 có sẵn.
chrome.storage.onChanged
Được kích hoạt bất cứ khi nào đối tượng StorageArea bất kỳ bị xoá hoặc khi giá trị của khoá được thay đổi hoặc đặt. Xin lưu ý rằng mỗi bản sao 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 chỉ đường đang diễn ra.

Bộ lọc

Để chỉ cho phép sự kiện diễn ra trong 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 xem xét một tiện ích 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 trong mọi thao tác trên mỗi thẻ. Thay vào đó, hãy sử dụng webNavigation.onCompleted kèm theo 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

Trình chạy dịch vụ tiện ích hỗ trợ nhiều hơn các sự kiện trong vòng đời như mô tả ở phần khác.

ServiceWorkerGlobal.fetch

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

ServiceWorkerGlobal.message

Tính năng truyền thông báo của trình chạy dịch vụ hiện có sẵn bên cạnh tính năng truyền tin nhắn tiện ích, nhưng hai hệ thống này không có khả năng tương tác. Điều đó có nghĩa là các thông báo được gửi bằng sendMessage() (có sẵn 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ý tin nhắn tiện ích sẽ không chặn tin nhắn được gửi bằng postMessage(). Cả hai loại trình xử lý tin nhắn (nghĩa là cả ServiceWorkerGlobal.messagechrome.runtime.onMessage) đều được hỗ trợ trong trình chạy dịch vụ tiện ích.

Bạn nên ưu tiên gửi thông báo tiện ích hơn, trừ phi bạn có lý do cụ thể để sử dụng thông báo của trình chạy dịch vụ.