浏览器窗口间的通信

news2024/12/27 13:25:32

一、汇总

在这里插入图片描述

二、同源策略

在这里插入图片描述

三、webSocket (无跨域限制)

优点:无跨域限制
缺点:成本高
在这里插入图片描述

四、客户端存储

1、localStorage + onStorage

在这里插入图片描述
在这里插入图片描述

例子:
在这里插入图片描述

在这里插入图片描述

2、定时器 + 客户端存储

在这里插入图片描述

例子:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

缺点:
在这里插入图片描述

五、postMessage (无跨域限制)

在这里插入图片描述

例子:
在这里插入图片描述
index.html

<body>
    <div>
        <iframe src="./ifr.html" id="ifr" style="width:600px; height:300px"></iframe>
    </div>

    主窗口
    
    <div>
        <div>Message:</div>
        <div id="messages"></div>
    </div>
    <script>
        window.addEventListener("message", function (event) {
            messages.innerHTML += `
                <div>${event.data}</div>  
            `
        })

        setInterval(() => {
            ifr.contentWindow.postMessage(`message from index.html, ${Date.now()}`)
        }, 5000)
    </script>
</body>

ifr.html

<body>
    iframe窗口
    <div>
        <div>Message:</div>
        <div id="messages"></div>
    </div>
    <script>
        window.addEventListener("message", function (event) {
            messages.innerHTML += `
                <div>${event.data}</div>  
            `
        })

        setInterval(()=> {
            window.parent.postMessage(`message from ifr.html, ${Date.now()}`)
        }, 5000)

    </script>
</body>

六、Broadcast Channel 事件广播 超级好用!!!

  • 允许同源的不同浏览器窗口、Tab页、frame或者iframe下的不同文档之间相互通信
  • 缺点:同源策略

核心代码:
在这里插入图片描述

例子:
在这里插入图片描述

<body>
    <section>
      <iframe src="./page1.html"></iframe>
      <iframe src="./page2.html"></iframe>
    </section>
  </body>
<body>
  <h3>Page 1</h3>
  
  <section style="margin-top:50px; text-align: center">
    <input id="inputMessage" value="page 1的测试消息" />
    <input type="button" value="发送消息" id="btnSend" />
    <section id="messages">
      <p>收到的消息:</p>
    </section>
  </section>

  <script>
    var messagesEle = document.getElementById("messages")
    var messageEl = document.getElementById("inputMessage")
    var btnSend = document.getElementById("btnSend")
    
    var channel = new BroadcastChannel("channel-BroadcastChannel")
    channel.addEventListener("message", function (ev) {
      var msgEl = document.createElement("p")
      msgEl.innerText =
        ev.data.date + " " + ev.data.from + ":" + ev.data.message
      messagesEle.appendChild(msgEl)
    })

    btnSend.addEventListener("click", function () {
      var message = messageEl.value
      channel.postMessage({
        date: new Date().toLocaleString(),
        message,
        from: "page 1"
      })
    })
  </script>
</body>
  <body>
    <h3>Page 2</h3>

    <section style="margin-top:50px; text-align: center">
      <input id="inputMessage" value="page 2的测试消息" />
      <input type="button" value="发送消息" id="btnSend" />
      <section id="messages">
        <p>收到的消息:</p>
      </section>
    </section>

    <script>
      var messagesEle = document.getElementById("messages")
      var messageEl = document.getElementById("inputMessage")
      var btnSend = document.getElementById("btnSend")
      
      var channel = new BroadcastChannel("channel-BroadcastChannel")
      channel.addEventListener("message", function(ev) {
        var msgEl = document.createElement("p")
        msgEl.innerText = ev.data.date + " " + ev.data.from + ":" + ev.data.message
        messagesEle.appendChild(msgEl)
      })

      btnSend.addEventListener("click", function() {
        var message = messageEl.value
        channel.postMessage({
          date: new Date().toLocaleString(),

          message,
          from: "page 2"
        })
      })
    </script>
  </body>

七:MessageChannel (无跨域限制)

  • Channel Messaging API 的 MessageChannel接口允许我们创建一个新的消息通道,并通过它的两个MessagePort属性发送数据
  • 缺点: 需要先创建联系

核心代码:
在这里插入图片描述

例子:
在这里插入图片描述

<body>
    <iframe id="ifr" src="./ifr.html" style="width:600px; height:300px"></iframe>

    <div>主窗口</div>

    <div>
        <div>Message:</div>
        <div id="messages"></div>
    </div>

    <script>
        const channel = new MessageChannel()

        var ifr = document.querySelector('iframe')

        ifr.onload = function () {
            ifr.contentWindow.postMessage('__init__', '*', [channel.port2])
        }
        // 监听消息
        channel.port1.onmessage = onMessage
        function onMessage(e) {
            messages.innerHTML += `
                <div>${event.data}</div>  
            `
        }
        // 轮询发送
        setInterval(function(){
            channel.port1.postMessage(`message from index.html, ${Date.now()}`)
        }, 5000)


    </script>
</body>
<body>
    iframe窗口
    <div>
        <div>Message:</div>
        <div id="messages"></div>
    </div>
    <script>
        window.addEventListener("message", function (event) {
            if (event.data === "__init__") {
                initChannel( event.ports[0])
            }
        })
        function initChannel(port) {
            port.onmessage = function (event) {
                messages.innerHTML += `
                <div>${event.data}</div>  
            `
                port.postMessage(`message from the iframe, ${Date.now()}`);
            }
        }
    </script>
</body>

八、SharedWorker

  • SharedWorkerWeb Worker的一种, 可单独开启一个进程,用于同域页面通讯
  • Web Worker可开启子进程执行JS,但不能操作DOM
  • 缺点:兼容性、同源策略

例子:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

TypeScript类型判断

快速认知 TS允许我们为变量设置类型限制并进行检测判断 // 常见的类型判断 let age: number 20; let isDead: boolean true; let name: string abc; 但是上面的写法太啰嗦了。ts有一个类型推断机制&#xff0c;ts会根据为变量赋的值自动给该变量设置一个类型。上面可以写为…

SpringMvc--综合案例

目录 1.SpringMvc的常用注解 2.参数传递 基础类型&#xff08;String&#xff09; 创建一个paramController类&#xff1a; 创建一个index.jsp 测试结果 复杂方式 ​编辑 测试结果 RequestParam 测试结果 PathVariable 测试结果 RequestBody pom.xml依赖导入 输…

软件测试之登录测试详解-功能性

功能测试 一、功能测试–登录 功能性测试用例包括&#xff1a; 1.什么都不输入&#xff0c;点击提交按钮&#xff0c;看提示信息。&#xff08;非空检查&#xff09; 2.输入已注册的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 3.输入已注册的用户名和不…

面试中的问题提问:如何通过提问展示你的主动性

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

大型语言模型,第 1 部分:BERT

一、介绍 2017是机器学习中具有历史意义的一年&#xff0c;当变形金刚模型首次出现在现场时。它在许多基准测试上都表现出色&#xff0c;并且适用于数据科学中的许多问题。由于其高效的架构&#xff0c;后来开发了许多其他基于变压器的模型&#xff0c;这些模型更专注于特定任务…

Nginx详解 五:反向代理

文章目录 1. 正向代理和反向代理1.1 正向代理概述1.1.1 什么是正向代理1.1.2 正向代理的作用1.1.3 正向代理的基本格式 1.2 反向代理概述1.2.1 什么是反向代理1.2.2 反向代理可实现的功能1.2.3 反向代理的可用模块 2. 配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其…

(其他) 剑指 Offer 65. 不用加减乘除做加法 ——【Leetcode每日一题】

❓ 剑指 Offer 65. 不用加减乘除做加法 难度&#xff1a;简单 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算符号。 示例: 输入: a 1, b 1 输出: 2 提示&#xff1a; a, b 均可能是负数或 0结果不会溢出 …

在 Windows 上远程对 Linux 进行抓包

文章目录 名词解释事先准备下载安装 Wireshark下载运行 libpcap设置 libpcap 环境变量在 Wireshark 中远程连接 libpcap 笔者的运行环境&#xff1a;&#xff08;成功&#xff09; 本地客户端&#xff1a; Windows&#xff1a; Windows 10 教育版&#xff08;本文&#xff09; …

基于STM32设计的生理监测装置

一、项目功能要求 设计并制作一个生理监测装置&#xff0c;能够实时监测人体的心电图、呼吸和温度&#xff0c;并在LCD液晶显示屏上显示相关数据。 随着现代生活节奏的加快和环境的变化&#xff0c;人们对身体健康的关注程度越来越高。为了及时掌握自身的生理状况&#xff0c…

Hololens2部署很慢可能是unity工程选择不对

这样就很快&#xff0c;几分钟就完成了。&#xff08;虽然又遇到新问题了&#xff09; 第一次使用时如下&#xff0c;直接运行了一个多小时还没有完

虚拟专用网络——VPN

VPN的英文全称是"Virtual Private Network"&#xff0c;意为"虚拟专用网络"。它的本质是一种特殊的加密通讯协议&#xff0c;可以在不同地点的企业内部网之间建立一条专用的通讯线路&#xff0c;就像真正铺设了一条专线一样&#xff0c;但无需真正的物理线…

【图卷积神经网络】1-入门篇:为什么使用图神经网络

在本节中,将涵盖以下主要内容: 为什么使用图?为什么学习图?为什么使用图神经网络?为什么使用图? 首先需要回答的问题是:为什么对图感兴趣?图论是对图进行数学研究的学科,它已经成为理解复杂系统和关系的基本工具。图是一种将节点(也称为顶点)和连接这些节点的边的集…

go语言的高级特性

go语言调用C语言 go tool cgo main.go

MySQL误删数据 回滚

前言 生产环境数据库不允许删除表&#xff0c;可以将表修改成 XXX_to_delete 如果误删简单数据&#xff0c;可以考虑使用binlog恢复 一、查看命令 1.查看binlog是否开启 show variables like log_bin;切换到MySQL安装目录,查看mysqlbinlog日志文件 2.查看所有 binlog 日志…

网络技术学习十二:子网划分

子网划分 A类地址 ⑴ A类地址第1字节为网络地址&#xff0c;其它3个字节为主机地址。另外第1个字节的最高位固定为0。 ⑵ A类地址范围&#xff1a;1.0.0.1到126.255.255.254。 ⑶ A类地址中的私有地址和保留地址&#xff1a; ①10.0.0.0到10.255.255.255是私有地址&#xff0…

AIGC - 生成模型及其应用

AIGC - 生成模型及其应用 0. 前言1. 生成模型2. 生成模型与判别模型的区别2.1 模型对比2.2 条件生成模型2.3 生成模型的发展2.4 生成模型与人工智能 3. 生成模型示例3.1 简单示例3.2 生成模型框架 4. 表示学习5. 生成模型与概率论6. 生成模型分类小结 0. 前言 生成式人工智能 …

知识大杂烩(uniapp)

首先声明&#xff1a;不敢保证都管用&#xff0c;这是我自己实践得来的。 box-shadow: 这段 CSS 样式代码用于创建一个阴影效果&#xff0c;它是通过 box-shadow 属性来实现的。让我解释一下这段代码的含义&#xff1a; - box-shadow: 这是 CSS 的属性&#xff0c;用于添加阴影…

vue.js+nodejs家庭个人理财收支管理系统5x6nf

本收支管理系统以vue.js作为框架&#xff0c;nodejs语言&#xff0c;B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;用户管理、收入分类、支出分类、每日收入、每日支出等模块。 本文的组织结构如下&#xff1a; 1、绪论。综述了本文的研究背景…

Python之线性数据结构

Python之线性数据结构 线性数据结构 线性表 线性表(简称表)&#xff0c;是一种抽象的数学概念&#xff0c;是一组元素的序列的抽象&#xff0c;它由有穷个元素组成(0 个或任意个)顺序表:使用一大块连续的内存顺序存储表中的元素&#xff0c;这样实现的表称为顺序表&#xff…

优惠来袭,工业树莓派特惠季火爆进行中

为回馈各位新老用户一直以来的支持和信任&#xff0c;虹科工业树莓派特惠季强势来袭&#xff01;9月1日至12月31日期间&#xff0c;订购虹科工业树莓派RevPi Core S或RevPi Connect S型号产品&#xff0c;满足活动条件即可享超值优惠折扣&#xff01;详细活动可扫描海报下方二维…