多标签页之间的通信

解决方案有两种思路:浏览器端 解决方案、服务器端解决方案。

一、浏览器端解决方案:

思路:本地数据存储

html 复制代码
<!-- index01.html -->
<input id="name"> 
<input type="button" id="btn" value="提交">

1. localStorage

原理:localStorage 在所有同源 url 中都是共享的(localStorage 存储在客户端硬盘,两个页面位于不同浏览器也可以共享)。

注意:在不同的页面修改 localStorage,才能够被监听到,相同页面、重复设置相同的值,都是无法被监听的。

用法:

javascript 复制代码
// index01.html
btn.addEventListener('onclick', function () {
    localStorage.setItem("key", value);
});
javascript 复制代码
// index02.html
window.addEventListener("storage", function (e) {
    console.log(e);
});

原理:同源可访问。

注意:cookie 无法监听变化,需要通过一个定时器,每隔一段时间获取一次数据。

用法:

javascript 复制代码
// index01.html
document.cookie = "key=" + value;
javascript 复制代码
// index02.html
function getCookie(key) {
    // 从cookie中获取并解析数据
    return JSON.parse("{\"" + document.cookie.replace(/;\s+/gim,"\",\"").replace(/=/gim, "\":\"") + "\"}")[key]; 
} 
setInterval(function(){ 
    console.log("key=" + getCookie("key")); 
}, 5000);

二、服务器端解决方案:

1. websocket(H5新增的协议)

原理:websocket建立的是全双工通讯,服务器也可以主送发送数据给客户端。只要让服务器作为中转站,就可以实现两个页面的通讯。

javascript 复制代码
// index01.html 与服务器建立 全双工 通讯(index02.html同理)
const socket = new WebSocket('ws://localhost:8080');  // 与服务器建立全双工连接

// 连接建立时触发
socket.addEventListener('open', function (event) {
    socket.send('Hello Server!');   // 发送数据给服务器
});

// 客户端接收服务端数据时触发
socket.addEventListener('message', function (event) {
    console.log('Message from server ', event.data);  // 监听服务器传回的数据
});

socket.send(); // 发送数据

2. SharedWorker(H5新特性)

首先新建一个worker.js,不必打包到项目中,直接放到服务器即可:

javascript 复制代码
let data = '';
let onconnect = function (e) {
    let port = e.ports[0];
    port.onmessage = function (e) {
        if (e.data === 'getData') {
            port.postMessage(data)
        } else {
            data = e.data
        }
    }
}

index01.js、index02.js:

javascript 复制代码
const worker = new SharedWorker('worker.js');

// 与worker建立连接
worker.port.start();

worker.port.addEventListener('message', function (e) {
    console.log('worker发来的数据:', e.data);
}, false);

setBtn.addEventListener('click', function (e) {
    worker.port.postMessage(value);
}, false);

getBtn.addEventListener('click', function (e) {
    // 获取发送到worker的数据(约定 'getData' 是获取数据)。
    worker.port.postMessage('getData');
}, false);
相关推荐
threerocks8 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
ly768910 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
沙盘客12 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
默_笙13 小时前
👍 我的代码被 ESLint 抓包了:单引号、var、没分号——全被当场点名
前端·javascript
oh,huoyuyan14 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
汉堡大王952715 小时前
用 Trae Work 自动化任务,6 分钟生成一份前端生态周报
前端·javascript·人工智能
章鱼小丸子逃跑中15 小时前
【2025最新版】如何将fnm与node.js安装在D盘?【保姆级安装及人性话理解教程】
前端·javascript·npm·node.js
CAD老兵17 小时前
在浏览器里对比 DWG/DXF 图纸 —— @mlightcad/cad-diff-viewer
前端·javascript·github
WL_arm17 小时前
Vibe Coding(氛围编程)入门
javascript·css·人工智能·html5
艾醒(AiXing-w)17 小时前
LangChain 1.0 入门(二):LangChain 全模型标准化接入最佳实践(小白参数详解版)
前端·javascript·langchain