首页 > 其他分享 >js跨标签页通信

js跨标签页通信

时间:2022-09-25 18:45:45浏览次数:65  
标签:const 标签 worker 通信 js port 页面

跨标签页通信

网页需要用到跨标签页通信的场景一般较少,这里简单记录一下,这里建议使用方法三

方法一

通过localStorage 结合window.addEventListener('storage', cb)完成A、B标签页间通信。

下面是实现A标签页面修改B标签页面title的例子:

// A标签页
localStorage.setItem('tab:msg', JSON.stringify({
    type: 'changeTitle',
    data: '改个title'
}))

// B标签页
window.addEventListener('storage', (ev) => {
    try {
		const msg = JSON.parse(ev.newValue)
        if (msg.type === 'changeTitle') {
            window.document.title = msg.data
        }
    } catch (err) {}
})

方法二

通过cookie+setInterval 定时获取cookie的值变化,该方法和方法一类似,不过没有方法一好,这里不作例子

方法三

通过BroadcastChannel 进行页面间通信,该方法实现简单,兼容性也算可以,是建议使用的方式

Broadcast Channel API允许浏览上下文(即windowstabsframesiframes)和同一来源的工作人员之间的基本通信。

通过创建一个BroadcastChannel对象,您可以接收发布到它的任何消息。您不必维护对您希望与之通信的框架或工作人员的引用:他们可以通过构建自己BroadcastChannel的同名频道来“订阅”特定频道,并在所有频道之间进行双向通信。

例子:

// A页面
const bc = new BroadcastChannel("test_channel");
bc.onmessage = (event) => {
  console.log(event);
};


// B页面
const bc = new BroadcastChannel("test_channel");
bc.postMessage("This is a test message.");

兼容性:

image-20220925181002883

方法四

通过SharedWorker 做媒介进行不同标签间通信

SharedWorker 接口代表一种特定类型的 worker,可以从几个浏览上下文中访问,例如几个窗口、iframe 或其他 worker。它们实现一个不同于普通 worker 的接口,具有不同的全局作用域。

例子:

// worker.js
var clients = [];
onconnect = function(e) {
  var port = e.ports[0];
  clients.push(port);
  port.addEventListener("message", function(e) {
    for (var i = 0; i < clients.length; i++) {
      var eElement = clients[i];
      eElement.postMessage(e.data);
    }
  });
  port.start();
};

// A页面
const shareWorker = new SharedWorker("worker.js");
// 接受信息
shareWorker.port.onmessage = (e)=> { 
  console.log(e.data)
}


// B页面
const shareWorker = new SharedWorker("worker.js");
// 发送信息
shareWorker.port.postMessage({
    type : 'notifyTab',
  payload : {}
});

方法五

通过websocket进行页面间通信,该方式需要借助服务器,且较重,除非业务需要,不然接入成本较高。

好处就是可以跨浏览器通信了哈哈哈哈。这里不细说,毕竟用到这个的话业务肯定不简单了,看websocket相关的文章即可

标签:const,标签,worker,通信,js,port,页面
From: https://www.cnblogs.com/suyuanli/p/16728451.html

相关文章

  • 51单片机笔记[8]-串口通信2
    Proteus仿真时VirtualTerminal不显示弹出窗口解决方法☞调试->选中VirtualTerminalSTC-ISP生成代码STC-ISP可以生成串口初始化代码STC-ISP还可以下载到肯定能用的......
  • js url的query参数截取
    jsurl的query参数截取leturl="http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx"console.log(url);constquerys=url.slice(url.indexOf("?")+1)console.l......
  • 封装加载动画组件,利用slot标签与vuex实现
     实现效果: 加载时:  加载完成时;   实现代码:通过vuex传入一个布尔值loading控制加载动画显示与否,动画关闭时,通过slot标签显示本组件中包含的其他内容组......
  • js 内置函数Date
    从深入潜JavaScript日期对象方法描述*空执行Date()返回当日的日期和时间(字符串)。getDate()orsetDate()get返回月中的第几天(1-31),set设置对象当月天。......
  • [FAQ] Quasar BEX Bridge 通信方式 this.$q.bex 未定义的问题
    Bridge是一个基于Promise的事件系统,在BEX的所有部分之间共享,允许在你的QuasarApp中监听事件,从其它部分发出它们。你可以使用$q.bex从你的QuasarApp中访问Bridge......
  • 【Linux】有名管道实现进程间通信——一个简单聊天程序
    有名管道实现简单聊天程序1."你来我往"式简单聊天函数功能:简单聊天程序,两个程序a和b,a向b发送信息,b接收信息,b向a发送信息,a接收信息;...源码参考:chatA.c#include<std......
  • js深拷贝
    1.//深拷贝functiondeepclone(obj){letnewobj=Array.isArray(obj)?[]:{}for(letkeyinobj){if(typeofobj[key]==='object'){newobj[ke......
  • 前端Node.js-Day39
    Session认证的局限性:Session认证机制需要配合Cookie才能实现。由于Cookie默认不支持跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实......
  • 规范你的 JSON 配置,试试 JSON schema
    不知道大家在写一些JSON配置时会不会经常觉得麻烦,每次都要打开文档去核对字段名称对不对、结尾有没有s、结构是否正确、是不是数组等问题。然而我最近发现一些开源项目......
  • 02js制作百分比进度条
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content......