Clients - 提供访问 Client 对象的接口
这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
Clients
接口提供了对 Client
对象的访问。通过在服务 worker 中的 self
.clients
访问它。
方法
Clients.get()
对于匹配给定 id
的Client
,返回一个 Promise
。
Clients.matchAll()
返回一个 Promise
,解析为一个包含 Client
对象的数组。可以通过可选的参数来控制返回的客户端类型。
Clients.openWindow()
打开给定 URL 的新浏览器窗口,返回 Promise
,解析为新的 WindowClient
对象。
Clients.claim()
允许活动的服务 worker 将其自身设置为 scope
内的所有客户端的 controller
。
实例
以下实现显示现有聊天窗口,或在用户单击通知时创建新窗口。
addEventListener('notificationclick', event => {
event.waitUntil(async function() {
const allClients = await clients.matchAll({
includeUncontrolled: true
});
let chatClient;
// 让我们看看我们是否已经打开了一个聊天窗口:
for (const client of allClients) {
const url = new URL(client.url);
if (url.pathname == '/chat/') {
// 很好,让我们用吧!
client.focus();
chatClient = client;
break;
}
}
// 如果我们没有找到现有的聊天窗口,
// 打开一个新的:
if (!chatClient) {
chatClient = await clients.openWindow('/chat/');
}
// 给 client 发送信息:
chatClient.postMessage("新的聊天信息!");
}());
});
规范
规范 | 状态 | 备注 |
---|---|---|
Service Workers Clients 的定义 |
编者的草案 | 初始定义 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 40 | 未知 | 441 | 不支持 | 27 | 不支持 |
claim |
42 | 未知 | 441 | 不支持 | 29 | 不支持 |
get |
51 | 未知 | 451 | 不支持 | 38 | 不支持 |
matchAll |
472 | 未知 |
441 542 |
不支持 | 32 | 不支持 |
openWindow |
40 423 434 515 |
未知 | 451 | 不支持 | 38 | 不支持 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 40 | 40 | 未知 | 44 | 未知 | 27 | 不支持 |
claim |
42 | 42 | 未知 | 44 | 未知 | 29 | 不支持 |
get |
不支持 | 51 | 未知 | 45 | 未知 | 38 | 不支持 |
matchAll |
472 | 472 | 未知 |
44 542 |
未知 | 32 | 不支持 |
openWindow |
40 423 434 515 |
40 423 434 515 |
未知 | 45 | 未知 | 38 | 不支持 |
1. Firefox 45 和 52 扩展支持版本(ESR)中已禁用了服务 workers(和推送)。
2. Client
对象按就近触发过的顺序返回。
3. 只能打开同一来源的网址。
4. 可以打开任何网址。
5. 网址可以在独立 Web 应用程序提供的现有浏览上下文中打开