• 多标签页之间的通信


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

    一、浏览器端解决方案:

    思路:本地数据存储

    1. <input id="name">
    2. <input type="button" id="btn" value="提交">

    1. localStorage

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

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

    用法:

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

    2. Cookie

    原理:同源可访问。

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

    用法:

    1. // index01.html
    2. document.cookie = "key=" + value;
    1. // index02.html
    2. function getCookie(key) {
    3. // 从cookie中获取并解析数据
    4. return JSON.parse("{\"" + document.cookie.replace(/;\s+/gim,"\",\"").replace(/=/gim, "\":\"") + "\"}")[key];
    5. }
    6. setInterval(function(){
    7. console.log("key=" + getCookie("key"));
    8. }, 5000);

    二、服务器端解决方案:

    1. websocket(H5新增的协议)

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

    1. // index01.html 与服务器建立 全双工 通讯(index02.html同理)
    2. const socket = new WebSocket('ws://localhost:8080'); // 与服务器建立全双工连接
    3. // 连接建立时触发
    4. socket.addEventListener('open', function (event) {
    5. socket.send('Hello Server!'); // 发送数据给服务器
    6. });
    7. // 客户端接收服务端数据时触发
    8. socket.addEventListener('message', function (event) {
    9. console.log('Message from server ', event.data); // 监听服务器传回的数据
    10. });
    11. socket.send(); // 发送数据

    2. SharedWorker(H5新特性)

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

    1. let data = '';
    2. let onconnect = function (e) {
    3. let port = e.ports[0];
    4. port.onmessage = function (e) {
    5. if (e.data === 'getData') {
    6. port.postMessage(data)
    7. } else {
    8. data = e.data
    9. }
    10. }
    11. }

    index01.js、index02.js:

    1. const worker = new SharedWorker('worker.js');
    2. // 与worker建立连接
    3. worker.port.start();
    4. worker.port.addEventListener('message', function (e) {
    5. console.log('worker发来的数据:', e.data);
    6. }, false);
    7. setBtn.addEventListener('click', function (e) {
    8. worker.port.postMessage(value);
    9. }, false);
    10. getBtn.addEventListener('click', function (e) {
    11. // 获取发送到worker的数据(约定 'getData' 是获取数据)。
    12. worker.port.postMessage('getData');
    13. }, false);

  • 相关阅读:
    【一花一世界-郑一教授-繁简之道】可解释神经网络
    深入理解关键字 一(auto,register,static,sizeof)
    安卓调用onnx模型并计算
    electron-vue的electron的升级
    Day9_9 Java学习之Dao层模式与JDBC事务
    国家开放大学 模拟试题 训练
    Cocos3.x 对象池NodePool使用介绍和注意事项
    APP采用原生开发还是混合开发好?
    数据可视化设计经验分享,正确使用主题风格,打造专属数字大屏
    DotNetCore.Cap分布式事务实现最终一致性
  • 原文地址:https://blog.csdn.net/qq_44647809/article/details/120501104