比如我有一个列表页,点击列表页可以跳转并打开一个新的标签页
如何保证新标签页的数据和列表页同步呢?(在不考虑使用websocket的前提下)
比如
- 新标签页的数据更改,原页面的数据同步更改
- 原页面的数据更改,打开的标签页也能实时变化
补充一下,因为我目前的项目是通过页面内嵌到客户端里的(客户端内嵌用的是谷歌的内核),window.open是会触发打开客户端的窗口(以一种弹窗的形式而不是标签页的形式)
目前很多回答来监听浏览器的标签页的切换这种方式,感觉应该不大能适应于这个情况
比如我有一个列表页,点击列表页可以跳转并打开一个新的标签页
如何保证新标签页的数据和列表页同步呢?(在不考虑使用websocket的前提下)
比如
补充一下,因为我目前的项目是通过页面内嵌到客户端里的(客户端内嵌用的是谷歌的内核),window.open是会触发打开客户端的窗口(以一种弹窗的形式而不是标签页的形式)
目前很多回答来监听浏览器的标签页的切换这种方式,感觉应该不大能适应于这个情况
document.addEventListener('visibilitychange', function() {
if (document.visibilityState=='hidden') {//切离该页面时执行
} else if(document.visibilityState=='visible') {//切换到该页面时执行
}
});
切换后重新请求接口,如果页面多个接口,可以配置localStorage,告诉另一个页面操作了什么;
补充: 如果是客户端两个窗口。那这个应该是客户端代码控制了,那边有代码控制哪个窗口在最上面(active状态),在那个代码地方可以刷新下页面获取最新的数据。
可以监听页面的是否显示和隐藏事件。新标签页的数据更改,在切换到原页面时,在原页面上能够监听到原页面从隐藏到打开事件。在这个事件里,更新下原页面上的数据。这样就应该可以了。
const hiddenProperty = ('hidden' in document) ? 'hidden'
: ('webkitHidden' in document) ? 'webkitHidden'
: ('mozHidden' in document) ? 'mozHidden' : null;
if (hiddenProperty) {
const visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange');
const onVisibilityChange = (e) => {
console.log('visibilityChange');
// 更新数据
}
// 监听页面是否活跃了(活跃:页面显示在浏览器上)
document.addEventListener(visibilityChangeEvent, onVisibilityChange);
}
关于更多日常使用的公共类的操作方法,可以关注下小滑轮网站 http://www.feiaci.com/#/self/...
postMessage
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/
// a页面
const bWindow = window.open()
detailWindow.addEventListener('message', (e) => {
// 收到通知
console.log(e.data)
})
bWindow.postMessage('abc')
// b页面
window.postMessage("newRefresh", location.origin);
window.addEventListener('message', (e) => {
// 收到通知
console.log(e.data)
})
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
用
localStorage
,写入内容的时候,所有同域页面的window
都会收到一个onstorage
事件,利用此特性可以达到同域页面的通信和数据同步。基于这个事件,就可以实现你要的数据同步的效果:
另外,
window.open
打开同域的页面之后,会返回新页面的window
对象,也可以基于这个window
对象进行任何可能的操作。同浏览器下多标签页件通信的方案很多,除了
localStorage
还有sessionStorage
、postMessage
、webWorker
等本地方案。但是这些方案在浏览器里好用,换成客户端可能不行,如果每一种方案都被确定不行的话,可能要借助服务端的方案,比如webSocket
、webRTC
等。针对这个情况还可以放宽思路:如果这个客户端是自己开发的话,也许可以借助原生应用来同步两个页面的数据。