方法一: 使用localStorage实现通信

localStorage特点:

1、同域数据共享,跨域数据无法共享;
2、持久化数据存储
3、提供storage事件监听localStorage变化

示例:

// pageA.html 发送数据js代码
let btn = document.querySelector('button');
let num = 0;btn.addEventListener('click', () => {localStorage.setItem('num', num++);
})
// pageB.html 接收数据js代码
window.addEventListener('storage', (e) => {console.log('num旧值为:', , e.oldValue, '现值为:', e.newValue);
});

通过storage方法监听localStorage变化,获取最新的num值,控制台会实时打印num的新值和旧值。

方法二:使用cookie

cookie特点:

1、同域数据共享,跨域数据无法共享
2、存储空间较小,4kb
3、请求时会自动携带cookie

示例:

发送数据的页面将数据存储于cookie

// pageA.html 发送数据js代码
let btn = document.querySelector('button');
let num = 10;btn.addEventListener('click', () => {document.cookie = `num=${++num}`;
})

由于cookie无默认事件监听它的变化,所以需要采用定时轮询的方式去手动获取cookie的最新值。

// pageB.html 接收数据js代码
// 定义一个获取cookie的函数
function getCookie(key) {  // cookieList--cookie列表,key--所获取的cookie键let cookiesList = document.cookie.split(';');  // 获取cookie并以;切割成若干const cookieArr = cookiesList.map(c => c.split('='));  // 以=切分所有的cookie键值对const cookieSubarr = cookieArr.filter(c => c[0].trim() == key);  // 返回符合条件的cookieconsole.log(cookieSubarr[0][1]); // 打印cookie键值对的valuereturn cookieSubarr
}setInterval(getCookie, 1000, 'num');  // 定时轮询获取最新cookie

方法三:使用websocket

websocket特点:

1、保持连接状态,而http协议是无状态连接即请求完毕会关闭连接
2、全双工通信,客户端和服务端平等对待,可相互通信
3、建立在TCP协议上
4、没有同源策略,可以跨域

示例:

先搭建一个websocket服务器,用于pageA和pageB的连接,执行以下指令,创建package.json文件和安装websocket插件

npm init -y
npm i ws --save

新建一个index.js文件

// index.js
import WebSocket, { WebSocketServer } from 'ws';const wss = new WebSocket({ port: 3000 });
let clients = [];  // 创建保存所有已连接到服务器的客户端对象数组wss.on('connection', function(client){console.log('一个客户端连接到服务器');if(clients.indexOf(client) === -1) {  // 当前连接客户端不在已连接的客户端数组中,添加进数组clients.push(client);client.on('message', function(msg){  // 接收客户端发过来的消息console.log('收到消息:', msg);for(let c of clients) {  if(c !== client) {  // 将消息发送给除自己以外的客户端c.send(msg.toString());}}})}
})
// pageA.html
// 创建websocket连接
const ws = new WebSocket('ws://localhost:3000/')  // 协议标识符为ws,加密的话是wss,服务器是网址就是要协议之后要写的url,此处是localhost:3000
// websocket连接成功回调
ws.onopen = function() {console.log('pageA websocket连接成功')
}let btn = document.querySelector('button');
let num = 10;btn.addEventListener('click', () => {ws.send(`客户端发送: num=${++num}`);
})
// pageB.html
// 创建websocket连接
const ws = new WebSocket('ws://localhost:3000/');
// 连接成功回调
ws.onopen = function(){console.log('pageB websocket连接成功')
}
// 接收服务器发过来的消息
ws.onmessage = function(e) {console.log(`页面B收到:${e.data}`)
}

方法四:使用SharedWorker

webWorker是为弥补js单线程所提出的,它可以为js提供多线程环境,sharedWorker是webWorker中的一种。

shareWorker特点:

1、同域数据共享,跨域数据无法共享
2、使用port发送和接收数据
3、如果是同一个url且是同一个js,那么只会创建一个sharedWorker,多个页面共享这个sharedWorker

示例:

创建并启动worker.js,处理通信的数据

// worker.js
const set = new Set();
onconnect = e => {const port = e.ports[0];set.add(port);// 接收信息port.onmessage = e => {// 发送信息set.forEach(p => p.postMessage(e.data))}// 连接成功后先广播一条消息port.postMessage('worker广播消息')
}
// pageA.html
const worker = new SharedWorker('./worker.js');let btn = document.querySelector('button');
let num = 10;
btn.addEventListener('click', () => {worker.port.postMessage(`客户端发送: num=${++num}`);
})
// pageB.html
const worker = new SharedWorker('./worker.js');
worker.port.onMessage = e => console.log(`客户端B收到消息:${e.data}`)

总结

实现方式 优缺点
localStorage 优点: 操作简单,易于使用,有storage事件可以监听数据变化 缺点: 跨域不能共享
cookie 优点: 操作简单,兼容性好 缺点: 跨域无法共享,无法实时监听数据变化,需要使用定时器轮询,会消耗性能
websocket 优点: 可跨域通信 缺点: 需要服务端配合
sharedWorker 优点: 理论上可以实现任何数据共享 缺点: 跨域不能共享,且兼容性较差,IE浏览器均不兼容

总而言之,根据自身需求使用以上方法

如何实现浏览器多标签页tab之间的通信相关推荐

  1. UI素材|标签页 Tab实用案例,可临摹学习

    在导航类中有一种很基础也很重要的模块:tab选项卡与分段控件.它们功能一致,分别来自于安卓和苹果.其物理原型为书本上的小标签: 标签页 Tab 用于让用户在不同的视图中进行切换:标签数量,一般 2-4 ...

  2. WPF自适应可关闭的TabControl 类似浏览器的标签页

    原文:WPF自适应可关闭的TabControl 类似浏览器的标签页 效果如图: 虽然说是自适应可关闭的TabControl,但TabControl并不需要改动,不如叫自适应可关闭的TabItem. 大 ...

  3. 实现浏览器多标签页通信

    前言 我们都知道浏览器是可以打开很多标签页的,如果每个标签页代表的是单独的一个网站,那么这些标签页之间肯定是不能通信的,如果能通信那估计我们都得凉凉.但是在很多情况下,浏览器中的很多标签页都属于某一个 ...

  4. 在浏览器的标签页显示网站标志图标

    一.在浏览器的标签页显示网站标志图标 我们通常希望将浏览器里的Tab选项卡的图标换成自己网站的logo图片,这样看起来更真实和有信任感,可以在<head></head>中添加l ...

  5. Chrome浏览器新标签页设置首页主页修改添加网站Infinity插件好用

    Infinity new tab 是一款美观实用的chrome 新标签页.最常访问的网站添加,修改,删除网址都有,每日一图,云备份等功能都具备.是一款基于html5的Chrome扩展程序,它重新定义了 ...

  6. mac下chrome浏览器的标签页、进程和内存分配

    因为最近要解决网页经常崩溃的问题,所以去研究了一下chrome浏览器的标签页和进程的关系,以及标签页对应进程的内存分配. 标签页和进程的对应关系 当chrome浏览器开启但是没有任何一个标签页的时候, ...

  7. ios开发跳转safari_阻止iOS Web APP中点击链接跳转到Safari 浏览器新标签页

    最近为了更好地接触移动Web 开发狠心购买了一台ipad mini(之前一直都是借同学的,借多了就不好意思了).拿来调试DeveMobile 与EaseMobile 主题 时候发现了不少问题,现在在一 ...

  8. Bootstrap 标签页Tab插件的事件

    事件 Bootstrap标签页Tab插件有两个事件,分别是 show 和 shown,这两个事件的含义见表 5‑3. 表 5‑3 标签页事件及含义 事件 含义 show 标签页显示之前,触发该事件.使 ...

  9. Bootstrap 标签页Tab插件使用方法

    标签页 Bootstrap标签页Tab插件需要 bootstrap-tab.js 文件支持,在使用该插件之前,应该导入 jQuery 和 bootstrap-tab.js 文件. 调用方式 1.dat ...

最新文章

  1. 小数加分数怎样计算讲解_2020人教版三年级下册数学知识点汇总带视频讲解,让孩子在学习!...
  2. jar docker镜像不能启线程_使用docker部署SpringCloud项目
  3. 界面 高炉系统_浅议工业互联网与传统计算机系统的关系
  4. P1198 [JSOI2008]最大数
  5. Java开发中Netty线程模型原理解析!
  6. 【mysql的编程专题⑥】视图
  7. ORACLE客户端jdbc连接测试,Oracle 客户端JDBC连接测试工具
  8. oracle取位置,获取oracle trace文件路径
  9. uva 12222——Mountain Road
  10. 【今日CV 计算机视觉论文速览 第145期】Fri, 19 Jul 2019
  11. selenium IDE的基本命令
  12. MyEclipse 10的使用技巧
  13. Datalogic得利捷发布Android企业级前沿应用程序——OEMConfig, 并推出2019中国零售博览会展品系列
  14. 基于vue的网页标尺辅助线工具(vue-ruler-tool)
  15. JS设计模式——责任链模式
  16. [BZOJ3993] [SDOI2015]星际战争(最大流+二分)
  17. shiro 登陆成功后subject依然为空
  18. js——浏览器缓存(http缓存)和本地存储
  19. Matlab实现——严格对角占优三对角方程组求解(高斯赛尔德Gauss-Seidel迭代、超松弛)
  20. Dell_Inspiron_15-3567, 加装内存条, 更换固态硬盘

热门文章

  1. 2021一级计算机考证(全)
  2. MPLS TE之CSPF与RSVP
  3. 论文阅读笔记8——Track to Detect and Segment:An Online Multi-Object Tracker(TraDeS)
  4. 循环结构whil、for
  5. 少儿编程 电子学会图形化 scratch编程等级考试四级真题答案解析(判断题)2022年6月
  6. java 正切_Java Math.tan()/Math.tanh() 计算正切/双曲正切
  7. cadence Incisive Comprehensive coverage(ICC)说明文档(一)
  8. C51:无线遥控电动车防盗器
  9. 中企通信亮相WRE制造业CIO峰会2017
  10. poj 1284 原根