网上关于serviceWorker一般是用于做PWA
的,这里介绍的不是这个,如需了解,自行百度
原理:
serviceWorker
是一个独立于页面的,浏览器级别的线程
serviceWorker
线程可以与页面间通过addEventListener('message'
,postMessage
进行通信
serviceWorker
线程中可以获取到所有被此线程控制的浏览器窗口 self.clients.matchAll()
代码解析
- 首先页面中初始时要初始化
serviceWorker
:
navigator.serviceWorker
.register('serviceWorker.js', {
scope: '/',
})
.then(function(registration) {
if (config && config.onRegister) {
config.onRegister(registration)
}
...
- 每个页面进入时,通知
serviceWorker
有新页面打开了,并监听serviceWorker
的信息。
页面代码:
navigator.serviceWorker.controller.postMessage({
type: 'closeOtherClient',
})
if (event.data.oprType && event.data.oprType === 'close') {
disconnectCBS.forEach(cb => cb())
}
-
serviceWorker.js
代码
serviceWorker
收到新窗口打开信号后,去通知其他所有页面执行关闭代码(比如页面上弹框提示用户,您的账号已在别处登陆)
this.addEventListener('message', function(event) {
const senderId = event.source ? event.source.id : 'unknow'
if (event.data.type === 'closeOtherClient') {
self.clients.matchAll().then(function(clients) {
if (clients && clients.length) {
clients.forEach(function(client) {
if (senderId !== client.id) {
client.postMessage({
oprType: 'close'
})
}
})
}
})
}
})
网友评论