持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
网页多标签页之间的通讯
例如打开两个 chrome 标签,一个访问列表页,一个访问详情页。在详情页修改了标题,列表页也要同步过来。
这是我们在平常开发中偶尔也会遇到的一个问题,那我们有什么方法可以进行及时的通讯呢?
1.使用webSocket进行通讯
之前我们也有提过 webSocket,他可以多页面通讯,无跨域限制;但是有一点:需要服务端的支持,那么开发成本随之而来,提高了许多。
2.提过localStorage进行通讯
localStorage我们并不模陌生,使用localStorage进行通讯,可以让同域的两个页面(A、B)进行通讯。 就比如 A页面设置了localStorage,B页面就可以监听到localStorage的变化
代码演示:
页面A:
<body>
<p>localStorage message - detail page</p>
<button id="btn1">修改标题</button>
<script>
const btn1 = document.getElementById('btn1')
btn1.addEventListener('click', () => {
const newInfo = {
id: 100,
name: '标题' + Date.now()
}
localStorage.setItem('changeInfo', JSON.stringify(newInfo))
})
// localStorage 跨域不共享
</script>
</body>
页面B:
<body>
<p>localStorage message - list page</p>
<script>
window.addEventListener('storage', event => {
console.info('key', event.key)
console.info('value', event.newValue)
})
</script>
</body>
实际效果
ps: localStorage 是跨域不共享的!
同源的定义下表给出了与 URL
http://store.company.com/dir/page.html的源进行对比的示例:
URL 结果 原因 http://store.company.com/dir2/other.html同源 只有路径不同 http://store.company.com/dir/inner/another.html同源 只有路径不同 https://store.company.com/secure.html失败 协议不同 http://store.company.com:81/dir/etc.html失败 端口不同 ( http://默认端口是 80)http://news.company.com/dir/other.html失败 主机不同
3. 使用 SharedWorker 进行通讯
- SharedWorker 是 WebWorker 的一种
- WebWorker 可以开启子进程执行 js, 但是不能操作Dom
- SharedWorker 接口代表一种特定类型的 worker,可以从几个浏览上下文中访问,例如几个窗口、iframe 或其他 worker。它们实现一个不同于普通 worker 的接口,具有不同的全局作用域。
- SharedWorker 可单独开启一个进程,用于同域页面通讯
ps:如果有兴趣的话可以看看阮一峰老师的文章(www.ruanyifeng.com/blog/2018/0…
总结
- webSocket 需要服务端参与,但不限制跨域
- localStorage 简单易用
- SharedWorker 本地调试不太方便,考虑浏览器兼容性