实现Tab页之间通信的方式

2023-11-15

5 种方式:

  1. localstorage
  2. webworker
  3. web-socket
  4. cookie
  5. postMessage

localstorage

先看效果:


test3.gif

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>
<body>
    <button id="button">Click me.</button>
    <script>
        jQuery("#button").on('click', () => {
            window.localStorage.setItem('a', Math.random())
        })
        window.addEventListener('storage', e => {
            console.log(e)
        })
    </script>
</body>
</html>

webWorker

先看效果:


test1.gif

看代码:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>
<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        let worker;
        if (typeof Worker === "undefined") {
            alert('当前浏览器不支持webworker')
        } else {
            worker = new SharedWorker('work.js', 'work2');
 worker.port.onmessage = function(e) {
                console.log(`获得worker的数据:${e.data}`)
            }
        }
        jQuery('#button1').on('click', () => {
            let data = parseInt(Math.random() * 10)
            console.log(`发送数据:${data}`)
            worker.port.postMessage(data);
        })
        jQuery('#button2').on('click', () => {
            worker.port.postMessage('get');
        })
    </script>
</body>
</html>
//work.js
let data1 = '';
this.onconnect = function(e) {
    console.log('e', e);
    let port = e.ports[0];
    port.onmessage = function(e) {
        if(e.data === 'get') {
            port.postMessage(data1)
        }else {
            data1 = e.data
        }
    }
}

web-socket

先看效果:


test0.gif

客户端代码(web)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>
<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        let ws = new WebSocket("ws://localhost:3009");
        ws.onopen = function(e) {
            console.log("Connection open ...");
            // ws.send("Hello WebSockets!");
        };
        ws.onmessage = function(e) {
            console.log(`收到数据${e.data}`);
            // ws.close();
        };
        ws.onclose = function(evt) {
            console.log("Connection closed.");
        };
        jQuery('#button1').on('click', () => {
            let data = parseInt(Math.random() * 10);
            console.log(`发送数据${data}`);
            ws.send(data)
        })
    </script>
</body>
</html>

服务端代码(koa)

const Koa = require('koa');
const serve = require('koa-static')
const path = require('path')
const Router = require('koa-router');
const websocket = require('koa-websocket')
const home = serve(path.resolve(__dirname, './'))
const app = websocket(new Koa());
let ctxs = new Set();//保证websocket唯一性
app.ws.use(function(ctx, next) {
    ctxs.add(ctx);
    ctx.websocket.on('message', function(message) {
        ctxs.forEach((item, index , arr) => {//客户端每新建一个websokcet就会保存到这个ctx中,每个ctx中的websokcet是独立的
            item.websocket.send(message)
        })
    });
    ctx.websocket.on('close', function(message) {
        ctxs.delete(ctx)
    })
    next(ctx)
} )
const router = new Router()
router.get('*', (ctx, next) => {
    ctx.body = 'hello world';
})
app.use(home)
app.use(router.routes())
    .use(router.allowedMethods());
app.listen(3009, () => {
    console.log('server is started at port 3009')
})

cookie

将要传递的信息存储在cookie中,每隔一定时间读取cookie信息,即可随时获取要传递的信息。

页面1:
<input id="name">  
<input type="button" id="btn" value="提交">  
<script type="text/javascript">  
    $(function(){    
        $("#btn").click(function(){    
            var name=$("#name").val();    
            document.cookie="name="+name;    
        });    
    });    
</script>  

页面2:

<script type="text/javascript">  
    $(function(){   
        function getCookie(key) {    
            return JSON.parse("{\"" + document.cookie.replace(/;\s+/gim,"\",\"").replace(/=/gim, "\":\"") + "\"}")[key];    
        }     
        setInterval(function(){    
            console.log("name=" + getCookie("name"));    
        }, 10000);    
    });  
</script>  

postMessage

这个其实有点限制,就是你必须拿到目标窗口的引用,否则是通信不了的, 先看效果:


test4.gif

先用koa起2个服务(端口号设置不一样就行),分别放置2个index.html.

<!--http://localhost:3009/index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>
<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        const targetWindow = window.open('http://localhost:3008/index.html'); //这步很重要,你必须拿到这个引用才行
        jQuery('#button1').on('click', () => {
            let data = parseInt(Math.random() * 10);
            console.log(`发送数据${data}`);
            targetWindow.postMessage(data, "http://localhost:3008")
        })
        window.addEventListener('message', function(e) {
            console.log(`接受到数据:${e.data}, 数据源:${e.origin}`)
        }, true)
    </script>
</body>
</html>
<!--http://localhost:3008/index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }   
        body {
            background-color: grey;
        }
    </style>
    <title>Document</title>
</head>
<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        window.addEventListener('message', function(e) {
            jQuery("body").append(`<p>${e.data}</p>`)
        }, false)
    </script>
</body>
</html>

参考文献

https://www.cnblogs.com/lovling/p/7440360.html
https://blog.csdn.net/u014465934/article/details/98869766

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现Tab页之间通信的方式 的相关文章

  • 面试官:线程崩了,为什么不会导致 JVM 崩溃呢?如果是主线程呢?

    网上看到一个很有意思的美团面试题 为什么线程崩溃崩溃不会导致 JVM 崩溃 这个问题我看了不少回答 但发现都没答到根上 所以决定答一答 相信大家看完肯定会有收获 本文分以下几节来探讨 线程崩溃 进程一定会崩溃吗 进程是如何崩溃的 信号机制简
  • Python中装饰器超详细讲解,看不懂尽管来砍我!

    Python中装饰器的那些事儿 说到装饰器 我们需要首先理解下闭包的概念 走起 定义 具有执行环境的函数 满足三个条件 1 外部函数中定义一个内部函数 2 内部函数中使用外部函数的局部变量 3 外部函数将内部函数作为返回值返回 此时的内部函
  • 算法:2-3平衡树与B树的详细探讨

    2 3树是最简单的B树 B 树是B树的升级 B树的来源 为什么要有树 描述 1 多 N M 层次等关系 从最根本的原因来看 使用树结构是为了提升整体的效率 插入 删除 查找 索引 尤其是索引操作 因为相比于链表 一个平衡树的索引时间复杂度是

随机推荐

  • js关闭当前弹出框,刷新父页面

    alert data msg 点击确定关闭该窗口 reload 关闭当前窗口 刷新上一层页面 location reload 执行结束 刷新当前页面 父级页面 点击操作按钮 点击保存 点击确定可以看到已经回到上一级页面 且已刷新
  • Java 线程同步 - 7种方式

    为何要使用同步 java允许多线程并发控制 当多个线程同时操作一个可共享的资源变量时 如数据的增删改查 将会导致数据不准确 相互之间产生冲突 因此加入同步锁以避免在该线程没有完成操作之前 被其他线程的调用 从而保证了该变量的唯一性和准确性
  • 3分钟学习:获取 URL 查询参数值

    在前端开发工作中 利用 URL 进行参数传递是一项十分常见的方法 在页面跳转时 通过 URL 携带某些信息 如状态 id 区分页面来源的字段值等 因此 学习了解如何获取 URL 查询参数值是很重要的 js 代码手撸 利用 JavaScrip
  • 使用sessionStorage新建与本页面一样的Tab页面,并在页间传递参数。

    客户提了个需求 点击某个链接 新建一个Tab页 当前页面内容不变 新的Tab页中控件的值和当前页一致 查阅了相关博客 发现可以用sessionStorage或者localStorage实现 键值对属性的存储 获取 Demo实现思路 页面加载
  • TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时 数据被传送入协议栈中 然后逐一通过每一层直到被当作一串比特流送入网络 注 UDP数据TCP数据基本一致 唯一不同的是UDP传给IP的信息单元称作U
  • 【详解python中round函数】

    在Python中 round 函数是一个内置函数 用于将一个数字四舍五入为指定的小数位数或整数位数 round 函数有两个参数 第一个参数是要四舍五入的数字 第二个参数 可选 是小数位数或整数位数 表示要保留的小数位数或整数位数 默认为0
  • iOS 审核被拒绝3.2.1 没有金融许可证

    今年金融行业不好做 p2p暴雷好多家 上半年Android应用市场整顿金融类应用 在华为应用市场被误认为p2p应用而下架 经过上诉上传资质证明得而重新上架 各个应用商店平台陆续需要资质证明 最近应用在苹果商店审核被拒绝 同样也是因为金融类资
  • Redirecting to /bin/systemctl stop iptables.service Failed to stop iptables.service: Unit iptables.s

    学习远程访问mysql时 由于centos的防火墙会自动屏蔽很多软件的端口 所以无法连接 于是要关闭防火墙 网上找方法后知道输入 service iptables stop可以关闭防火墙 但是没有成功 因为centos7不能关闭防火墙 所以
  • 这真是冷门又逆天的副业,赚的有点多,分享一下接单心得

    前言 每年春节前后 都会是Python兼职接单的小高潮 这段时间各个行业对爬虫类和数分类的需求会暴增 圈子里很多朋友双休都没闲着 两天赚上万的不在少数 最近发现技术变现 兼职接单问题很多 我总结下来 发现大部分人都有着相同的困惑 听说Pyt
  • CSS鼠标滑过翻转动画图标

    html css鼠标放上去变大效果 效果如下动态图 目录层级 代码如下 html文件 index html li li
  • 图片存在灰白、深黑区域的检测

    import cv2 as cv file path E Python pythonProject 4 1 jpg def blackAndwhite screen file path img cv imread file path row
  • python 解决 pip 时报错 no suchoption: --bulid-dir 的解决办法

    python m pip install pip 20 2 4
  • Struts2 commons-fileupload 在上传2M以上文件出现异常解决方法

    在上传2M以上文件出现异常如下 APPNAME ERROR http 80 3 MultiPartRequest parse 130 org apache commons fileupload FileUploadBase SizeLimi
  • FISCO BCOS 区块链

    FISCO BCOS是由国内企业主导研发 对外开源 安全可控的企业级金融联盟链底层平台 由金链盟开源工作组协作打造 并于2017年正式对外开源 社区以开源链接多方 截止2020年5月 汇聚了超1000家企业及机构 逾万名社区成员参与共建共治
  • 泛型是什么,C++泛型编程又是什么?

    泛型是什么 C 泛型编程又是什么 在计算机程序设计领域 为了避免因数据类型的不同 而被迫重复编写大量相同业务逻辑的代码 人们发展的泛型及泛型编程技术 什么是泛型呢 所以泛型 实质上就是不使用具体数据类型 例如 int double floa
  • 高效率同步4开关Buck-Boost DC/DC控制器TMI5700

    随着户外储能电源应用需求的增加 以及PD大功率车充产品的广泛推广 应对不同输入供电设备 如5V 19V的适配器 以及12V 24V车载充电器 或电池组 4 2V 17 6V 都需要转换成5 20V的PD电压来应对不同负载设备的供电需求 图1
  • 基于R的飞机航线数据可视化(卫星地图)

    基于R的飞机航线数据可视化 卫星地图 数据处理 加载库 加载地图 说明 上一篇是基于行政区划进行可视化 本篇是基于卫星地图进行可视化 上一篇指路 基于R的飞机航线数据可视化 行政区划 数据处理 基础数据的处理与上一篇相同 不做解释 加载库
  • Innodb结构

    从MySQL5 5版本开始默认使用InnoDB作为引擎 它擅长处理事务 具有自动崩满恢复的特性 在日常开发中使用非常广泛 下面是言方的InnoDB引擎美构图 主要分为内存结构和磁盘结构两大部分 内存结构主要包括Buffer Pool Cha
  • 【python】设计一个游戏角色类 属性:角色名、血量、魔法、状态 方法:释放技能 被伤害 要求:设计要合理

    设计一个游戏角色类 a 属性 角色名 血量 魔法 状态 b 方法 释放技能 被伤害 c 要求 设计要合理 import time class Civillian name bp 1100 mp 2000 state def backgrou
  • 实现Tab页之间通信的方式

    5 种方式 localstorage webworker web socket cookie postMessage localstorage 先看效果 test3 gif 代码