js 跨浏览器tab页通信

问题

今天遇到一个问题,在商品列表页面,打开一个新增商品的页面,新增完后,商品列表要立刻显示新增商品,这就需要新增商品后,通知订单列表页,也就是常说的跨tab页通信。跨tab页通信,不仅包含常见的跨tab页,还包括跨window窗口、跨frame、跨iframe。

解决方案

同源下,可使用BroadCastChannel实现跨tab页通信。

  • 发送端
    • 如果重复创建相同名称的channel,j底层channel只会创建一次。
// If it is the first to connect to that broadcast channel name, 
// the underlying channel is created.
// Connection to a broadcast channel
const bc = new BroadcastChannel('test_channel');
// Example of sending of a very simple message
bc.postMessage('This is a test message.');
  • 接收端
// Connection to a broadcast channel
const bc = new BroadcastChannel('test_channel');
// A handler that only logs the event to the console:
bc.onmessage = function (ev) { console.log(ev); }
  • 关闭
// Disconnect the channel
bc.close();

这种方法比较简单,可以传任何数据对象(字符串、对象、数字等等),也是我比较推荐的方式。

window postMessage 方式

除了使用上述方式,还可以使用window.postMessage,缺点就是要持有目标window的引用,当页面刷新后,会失去目标window引用;优点就是可实现跨域通信。

  • 发送端
//发送事件
targetWindow.postMessage(message, targetOrigin)
  • 接收端
//接收事件
window.addEventListener("message", (event) => {
  if (event.origin !== "http://localhost:8080")
    return;
  // Do something
}, false);

storage event方式

也可以使用storage event来实现,原理就是监听storage set事件,来达到同步,但只能发送字符串,另外当前页面也不会获取本页发出的set事件。

  • 发送端
//发送事件
window.localStorage.setItem("loggedIn", "true");
  • 接收端
//接收事件
window.addEventListener('storage', (event) => {
 if (event.storageArea != localStorage) return;
 if (event.key === 'loggedIn') {
   // Do something with event.newValue
 }
});
在Vue中,当在新的标签中点击关闭旧的标签时,可以通过监听`beforeunload`事件来实现相应的操作。在`created`生命周期钩子函数中添加以下代码: ```javascript created() { window.addEventListener('beforeunload', () => { // 执行关闭旧标签的操作 // ... }); } ``` 在这个事件监听函数中,你可以执行一些关闭旧标签的操作,比如保存数据、清理资源等。请根据你的具体需求来实现相应的逻辑。 #### 引用[.reference_title] - *1* [vue js监听浏览器tab切换](https://blog.csdn.net/weixin_42439024/article/details/124584223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue监听浏览器tab切换](https://blog.csdn.net/qq_30351747/article/details/129379289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vue-两个浏览器tab通信的思路](https://blog.csdn.net/weixin_52073113/article/details/121654267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值