多标签页之间的通信

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

一、浏览器端解决方案:

思路:本地数据存储

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

1. localStorage

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

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

用法:

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

2. Cookie

原理:同源可访问。

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

用法:

// index01.html
document.cookie = "key=" + value;
// 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建立的是全双工通讯,服务器也可以主送发送数据给客户端。只要让服务器作为中转站,就可以实现两个页面的通讯。

// 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,不必打包到项目中,直接放到服务器即可:

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:

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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我认为除了HelloWorld之外,Python的三大数据转换实例可以作为开始学习Python的入门语言。

Python的三大数据转换实例 一、反转三位数 class Solution:def funtcion(self,number):hint(number/100)tint(number%100/10)zint(number%10)return 100*z10*th if __name____main__:solution Solution()num123new_num solution.funtcion(num)print("输入:{}".fo…

【仿真动画】ABB IRB 8700 机器人搬运(ruckig在线轨迹生成)动画欣赏

场景 动画 一、IRB 8700简介 二、动画脚本重点分析 2.1 sim.moveToPose 通过在两个 poses 之间执行插值&#xff0c;使用 Ruckig 在线轨迹生成器生成对象运动数据。该函数可以通过处理 4 个运动变量&#xff08;x、y、z 和两个姿势之间的角度&#xff09;或单个运动变量&#…

深度学习数据集—细胞、微生物、显微图像数据集大合集

最近收集了一大波关于细胞、微生物、显微图像数据集&#xff0c;有细胞、微生物&#xff0c;细菌等。 接下来是每个数据的详细介绍&#xff01;&#xff01; 1、12500张血细胞增强图像&#xff08;JPEG&#xff09;数据集 该数据集包含12500张血细胞增强图像&#xff08;JPE…

vscode终端npm install报错

报错如下&#xff1a; npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm ERR! code EPERM npm ERR! syscall open npm ERR! errno -4048…

视频剪辑技巧:轻松搞定视频随机合并,一篇文章告知所有秘诀

在视频制作的过程中&#xff0c;视频随机合并是一种创新的剪辑手法&#xff0c;它打破了传统的线性剪辑模式&#xff0c;使得视频剪辑更加灵活和有趣。通过将不同的视频片段随机组合在一起&#xff0c;我们可以创造出独特的视觉效果和情感氛围。这种剪辑方式让观众在观看视频时…

Hive函数

文章目录 一、Hive建表SQL二、Hive函数三、函数1、查看内置函数2、空字段赋值(nvl)3、CASE WHEN THEN ELSE END4、行转列5、列转行6、开窗函数6.1 简介6.2 语法6.3 案例6.4 LAG函数6.5 Ntile函数6.6 Rank 7、自定义函数 四、压缩和存储1、简介2、压缩简介3、Map输出阶段压缩4、…

数据处理生产环境_利用MurmurHash3算法在Spark和Scala中生成随机颜色

需求 根据给定的轨迹编号在这一列后面生成随机颜色_16 输入数据 ("吃饭", "123"), ("吃饭", "宋江"), ("郭靖", "宋江"), ("杨过", "奥特曼"), ("周芷若", "张无忌"),…

uniapp地图手动控制地图scale

前言 首次使用uniapp开发地图过程中&#xff0c;发现uniapp地图居然没有提供手动控制地图scale的方法&#xff0c;这个也着实没有想到&#xff0c;查了半天资料&#xff0c;也终于找到一个方法能够比较好的控制scale&#xff0c;做个记录。 代码 要定义一个地图map&#xff…

⑧【MySQL】数据库查询:内连接、外连接、自连接、子查询、多表查询

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 内连接、外连接、自连接、子查询、多表查询 ⑧…

新加坡服务器搭建网站出现PHP错误怎么处理?

当您在新加坡服务器上搭建 PHP 网站时&#xff0c;显示错误信息是非常重要的。PHP 错误的及时检测和解决有助于提高网站的稳定性和安全性。以下是一些步骤&#xff0c;帮助您在新加坡服务器上实现这一目标&#xff1a; 步骤 1&#xff1a;编辑 PHP 配置文件 打开您的新加坡服务…

使用Pandas进行时间重采样,充分挖掘数据价值

大家好&#xff0c;时间序列数据蕴含着很大价值&#xff0c;通过重采样技术可以提升原始数据的表现形式。本文将介绍数据重采样方法和工具&#xff0c;提升数据可视化技巧。 在进行时间数据可视化时&#xff0c;数据重采样是至关重要且非常有用的&#xff0c;它支持控制数据的…

5、OpenCV介绍、环境搭建及实战

这一部分介绍下 OpenCV 以及它的安装和使用,因为后面一些文章中的示例代码会基于OpenCV的库做开发。 什么是OpenCV? OpenCV 是一个被广泛使用的开源计算机视觉库,它提供了大量的传统图像处理算法和基于深度学习的计算机视觉算法,以及用于图像和视频处理的方法。 OpenCV 的…

ControlNet原理及应用

《Adding Conditional Control to Text-to-Image Diffusion Models》 目录 1.背景介绍 2.原理详解 2.1 Controlnet 2.2 用于Stable Diffusion的ControlNet 2.3 训练 2.4 推理 3.实验结果 3.1 定性结果 3.2 消融实验 3.3 和之前结果比较 3.4 数据集大小的影响 4.结…

Vite 启动默认只能访问localhost解决方法

事情的经过是因为我需要测试本地项目的接口,然后因为burp默认不抓取localhost,127.0.0.1 .而且我也不想去修改burp. 所以我通过本地IP地址访问项目, 发现项目无法访问。 默认启动 所以特此记录一下。 在本地项目的package.json 中需要运行的脚本后 添加 --host即可。 具体如下…

spring给静态成员注入 你试过吗?

给静态成员注入 你试过吗? public class TempDataTransformUtilDto {Autowiredprivate static ICityCascadeService cityCascadeService;private static CstShareEmpMapper cstShareEmpMapper;private static PubUserInfoMapper pubUserInfoMapper; }如果ICityCascadeService…

Java重写和重载的区别,

Java中的重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;都是面向对象编程的重要概念&#xff0c;它们的区别如下&#xff1a; 在定义上&#xff1a; 重载是在同一个类中定义多个方法&#xff0c;它们的方法名相同但参数不同。 重写是子类重新定义…

C++ 继承和派生

继承和派生 一个新类从已有的类那里获得其已有特性&#xff0c;这种现象称为类的继承。 从父类产生一个子类&#xff0c;称为派生。 基类与派生类的关系&#xff1a;派生类是基类的具体化&#xff0c;而基类是派生类的抽象。 定义基类和派生类 定义基类 例&#xff1a;一个…

rabbitMQ的扇出模式(fanout发布订阅)的生产者与消费者使用案例

扇出模式 fanout 发布订阅模式 生产者 生产者发送消息到交换机&#xff08;logs&#xff09;,控制台输入消息作为生产者的消息发送 package com.esint.rabbitmq.work03;import com.esint.rabbitmq.RabbitMQUtils; import com.rabbitmq.client.Channel;import java.util.Scanne…

使用FP8加速PyTorch训练

现代的人工智能硬件架构(例如&#xff0c;Nvidia Hopper, Nvidia Ada Lovelace和Habana Gaudi2)中&#xff0c;FP8张量内核能够显著提高每秒浮点运算(FLOPS)&#xff0c;以及为人工智能训练和推理工作负载提供内存优化和节能的机会。 在这篇文章中&#xff0c;我们将介绍如何修…