Client: phương thức postMessage()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2018.
Note: This feature is only available in Service Workers.
Phương thức postMessage() của giao diện Client cho phép service worker gửi một thông điệp tới client (Window, Worker hoặc SharedWorker). Thông điệp được nhận trong sự kiện message trên navigator.serviceWorker.
Cú pháp
postMessage(message)
postMessage(message, transfer)
postMessage(message, options)
Tham số
message-
Thông điệp sẽ được gửi tới client. Đây có thể là bất kỳ kiểu có thể nhân bản theo structured clone nào.
Note: Service worker không nằm trong cùng cụm agent với client của nó, vì vậy chúng không thể chia sẻ bộ nhớ. Các đối tượng
SharedArrayBufferhoặc các buffer view dựa trên chúng không thể được gửi qua các cụm agent. Nếu cố làm vậy, phía nhận sẽ phát sinh sự kiệnmessageerrorchứa mộtDOMExceptionDataCloneError. transferOptional-
Một mảng tùy chọn gồm các đối tượng có thể chuyển giao để chuyển quyền sở hữu. Quyền sở hữu các đối tượng này được chuyển cho phía đích và chúng không còn sử dụng được ở phía gửi. Các đối tượng có thể chuyển giao này nên được đính kèm vào thông điệp; nếu không, chúng sẽ bị chuyển đi nhưng thực tế không thể truy cập được ở phía nhận.
optionsOptional-
Một đối tượng tùy chọn chứa các thuộc tính sau:
transferOptional-
Có cùng ý nghĩa với tham số
transfer.
Giá trị trả về
Không có (undefined).
Ví dụ
Đoạn mã dưới đây gửi một thông điệp từ service worker tới client. Client được lấy bằng phương thức get() trên clients, vốn là một biến toàn cục trong phạm vi service worker.
addEventListener("fetch", (event) => {
event.waitUntil(
(async () => {
// Thoát sớm nếu không thể truy cập client.
// Ví dụ: nếu khác nguồn gốc.
if (!event.clientId) return;
// Lấy client.
const client = await self.clients.get(event.clientId);
// Thoát sớm nếu không lấy được client.
// Ví dụ: nếu nó đã đóng.
if (!client) return;
// Gửi một thông điệp tới client.
client.postMessage({
msg: "Hey I just got a fetch from you!",
url: event.request.url,
});
})(),
);
});
Nhận thông điệp đó:
navigator.serviceWorker.addEventListener("message", (event) => {
console.log(event.data.msg, event.data.url);
});
Thông số kỹ thuật
| Specification |
|---|
| Service Workers Nightly> # dom-client-postmessage-message-options> |