js 同源页面间通信 storage 和跨域页面间通信 postMessage

postMessage实现Js、Javascript跨域通信 一、概要介绍 1、什么是跨域? 跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。跨域的严格的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域。2、跨域通信的解决方法: (1)通过jsonp实现跨域... 阅读详情

同源页面间通信

(1) storage事件监听

参考博客:h5 storage事件监听

介绍

当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发,所以满足触发监听的条件有三个:

  • 同一浏览器打开了两个同源页面
  • 其中一个网页修改了localStorage
  • 另一网页注册了storage事件
    注意:在同一个网页修改本地存储,又在同一个网页监听,这样是没有效果的
使用
//A页面
window.addEventListener("storage", function (e) {
	console.log(e);
});

//B页面
localStorage.clear();
localStorage.setItem('aaa', '111');

A页面打印如下:
在这里插入图片描述

我们可以根据传值让B页面控制A页面刷新:

//A页面
window.addEventListener("storage", function (e) {
    if(e.key === 'freshen' && e.newValue === '刷新A页面'){
    	localStorage.setItem('freshen', '');
        window.location.reload();
    }
});

//B页面
localStorage.setItem('freshen', '刷新A页面');
扩展

如果非得要在同一网页监听怎么办?可以重写localStorage的方法,抛出自定义事件:

var orignalSetItem = localStorage.setItem;
localStorage.setItem = function (key, newValue) {
    var setItemEvent = new Event("setItemEvent");
    setItemEvent.newValue = newValue;
    window.dispatchEvent(setItemEvent);
    orignalSetItem.apply(this, arguments);
}
window.addEventListener("setItemEvent", function (e) {
    console.log(e.key + '---' + e.newValue);
});
localStorage.setItem("aaa", "111");

(2) BroadcastChannel

介绍

允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信

使用

在A页面:

const bcA = new BroadcastChannel('aaa');
bcA.addEventListener('message', (event) => {
  console.log(event);
});
//或
bcA.onmessage = (event) => {
  console.log(event);
}

在B页面:

const bcB = new BroadcastChannel('aaa');
bcB.postMessage('New listening connected!');

即可在A页面收到信息

bcB.close()

关闭频道对象,告诉它不要再接收新的消息,并允许它最终被垃圾回收。

浏览器兼容(不支持ie)

在这里插入图片描述

跨域页面间通信 postMessage

参考博客:window.postMessage()

介绍

postMessage 可用于解决以下方面的问题:

  • 页面和其打开的新窗口的数据传递
  • 页面与嵌套的 iframe 消息传递
  • 多窗口之间消息传递

语法

otherWindow.postMessage(message, targetOrigin, [transfer]);

otherWindow:

其他窗口的一个引用,比如 iframe 的 contentWindow 属性、执行 window.open 返回的窗口对象、或者是命名过或数值索引的 window.frames。

message:

要发送的数据。它将会被结构化克隆算法序列化,所以无需自己序列化(部分低版本浏览器只支持字符串,所以发送的数据最好用JSON.stringify() 序列化)。

targetOrigin:

通过 targetOrigin 属性来指定哪些窗口能接收到消息事件,其值可以是字符串“*”(表示无限制)或者一个 URI(如果要指定和当前窗口同源的话可设置为"/")。在发送消息的时候,如果目标窗口的协议、主机地址或端口号这三者的任意一项不匹配 targetOrigin 提供的值,那么消息就不会发送。

执行如下代码,其他 window 可以监听派遣的 message 获取发送过来的数据:

window.addEventListener("message", (event)=>{
   var origin = event.origin
   if (origin !== "http://example.org:8080")
     return;
   // ...
}, false);

使用 addEventListener 绑定事件,如果代码走多次,会导致监听绑定多次,在VUE中,当组件销毁时需要调用 removeEventListener 移除监听
还可以使用另一种监听写法,则不会重复绑定监听事件

window.onmessage=function(event){
   var origin = event.origin
   if (origin !== "http://example.org:8080")
     return;
   // ...
}

event 的属性有:

  • data: 从其他 window 传递过来的数据
  • origin: 调用 postMessage 时,消息发送窗口的 origin。例如:“http://example.com:8080”。
  • source: 对发送消息的窗口对象的引用。可以使用此来在具有不同 origin 的两个窗口之间建立双向数据通信。

使用

通过window.open打开的页面

父传子

//父页面
const targetWindow = window.open('http://www.bbb.com');
setTimeout(()=>{
     targetWindow.postMessage('父传子', 'http://www.bbb.com')
}, 3000)

//子页面
window.addEventListener('message', (e) => {
     console.log(e.data)
})

子传父

//父页面
window.open('http://www.bbb.com');
window.addEventListener('message', (e) => {
     console.log(e.data)
})

//子页面
window.opener.postMessage('子传父', 'http://www.aaa.com')

两个窗口之间建立双向数据通信

/**
* localhost:10002/index页面
**/
// 接收消息
window.addEventListener('message', (e) => {
     console.log(e.data)
})
// 发送消息
const targetWindow = window.open('http://localhost:10001/user');
setTimeout(()=>{
     targetWindow.postMessage('来自10002的消息', 'http://localhost:10001')
}, 3000)
/**
* localhost:10001/user页面
**/
window.addEventListener('message', (e) => {
     console.log(e.data)
     if (event.origin !== "http://localhost:10002") 
     return;
     e.source.postMessage('来自10001的消息', e.origin)
})

页面与嵌套的 iframe 消息传递
http://www.domain1.com/a.html

<iframe id="iframe" src="http://www.domain2.com/b.html"></iframe>
 
<script>
var iframe = document.getElementById('iframe');
 
iframe.onload = function() {
   // 向domain2发送跨域数据
   iframe.contentWindow.postMessage('来自domain1的消息', 'http://www.domain2.com');
};
 
// 接受domain2返回数据
window.addEventListener('message',(e) => {
    console.log(e.data);
}, false);
</script>

http://www.domain2.com/b.html

<script>
// 接收domain1的数据
window.addEventListener('message',(e) => {
    console.log(e.data);
 
    if(e.origin !== 'http://www.domain1.com')
    return;
 
    // 发送消息给domain1
    window.parent.postMessage('来自domain2的消息', e.origin);
}, false);
</script>

安卓平台差异化处理

/* Android 平台 Post Message 消息监听 Hook */
window.Android_handleMessage = message => {
    // Android 使用 Base64 编码格式,需要先解码
    let data = decodeURIComponent(escape(window.atob(message)));
};

安全问题

  • 如果你不希望从其他网站接收 message,请不要为 message 事件添加任何事件监听器。
  • 如果你确实希望从其他网站接收message,请始终使用 origin 和 source 属性验证发件人的身份。
  • 当你使用 postMessage 将数据发送到其他窗口时,始终指定精确的目标 origin,而不是 *。
Web窗口间数据传递:从postMessage到SharedWorker的实战指南 在Web开发中,跨窗口通信是构建复杂应用架构的关键技术,它允许不同浏览器上下文(如窗口、标签页、iframe)安全、高效地交换数据。其核心原理在于利用浏览器提供的特定API,在遵守同源策略等安全边界的前提下,建立消息传递机制。这项技术的工程价值在于能实现状态同步、提升用户体验,并支撑如微前端、多标签页管理、实时协作等高级应用场景。其中,window.postMessage适用于有直接引用关系的窗口通信,而Broadcast Channel API则为同源下的平行标签页提供了简洁的广播方案。开发者需根据通信频 阅读详情

相关推荐

GM_xmlhttpRequest 跨域实现解析:从油猴脚本到 Chrome 扩展 V3 的 3 种方案

本文深入解析了GM_xmlhttpRequest在油猴脚本和Chrome扩展V3中的跨域实现方案,对比了三种不同技术栈下的实现原理与优缺点。从油猴脚本的请求代理机制到Chrome V3的Service Worker方案,提供了详细的代码示例和最佳实践,帮助开发者解决浏览器扩展开发中的跨域挑战。

chuliaoqiao4046的博客 1172

【JS】postMessage 用法(可以给iframe传值)

跨文档消息,有时候也简称为`XDM(cross-document messaging)`,是一种在不同执行上下文(如不同源的页面)间传递信息的能力。 例如:`www.wrox.com`上的页面想要与包含在内嵌窗格中的`p2p.wrox.com`上面的页面通信 `XMD`的核心就是`postMessage()`方法,将`message`传递给指定窗口

qq_45677671的博客 1万+

Web Storage API:sessionStorage与localStorage实战指南

Web Storage API是现代前端开发中的核心存储技术,包含sessionStorage和localStorage两种机制。sessionStorage提供会话级存储,数据随标签页关闭而清除,适合临时数据存储;localStorage则实现持久化存储,数据长期保留在浏览器中。这两种技术采用键值对存储模型,遵循同源策略,支持约5MB数据容量。在Web应用开发中,它们常用于用户偏好设置、表单数据暂存和离线缓存等场景。特别是在蓝桥杯等编程竞赛中,合理运用Web Storage能高效解决数据持久化需求。通过J

weixin_33866037的博客 610

js中【postMessage】八大点解读+完整示例

是一个强大而灵活的 API,能够实现不同窗口、iframe、Web Worker 以及其他上下文之间的安全通信。虽然它简化了跨域通信的实现,但也带来了潜在的安全风险。使用时,必须注意确保消息的发送和接收过程都是可信的,尤其是要谨慎指定和验证消息来源的origin属性。

2301_79858914的博客 7852

前端跨标签页通信:从LocalStorage到Broadcast Channel的实战指南

在现代Web开发中,实现不同浏览器标签页间的数据同步与通信是提升应用体验的关键技术。其核心原理在于利用浏览器提供的同源策略下的共享存储或消息传递机制,让隔离的页面上下文能够安全地交换信息。这项技术的核心价值在于保障多页面应用的数据一致性、实现实时状态同步,并最终提升用户的交互体验。常见的应用场景包括中后台管理系统的表单与列表联动、在线协作文档的实时编辑、以及电商网站中购物车状态的全局更新等。本文聚焦于前端同源场景,深入解析了以LocalStorage事件和Broadcast Channel API为代表的多

weixin_30699955的博客 569

前端JWT单点登录(SSO)实战:从原理到安全架构设计

单点登录(SSO)是现代Web应用架构中解决用户身份统一认证的核心技术,其核心原理是通过一次登录,实现用户在多个关联应用间的无缝访问。JWT(JSON Web Token)作为一种无状态、自包含的令牌标准,因其易于跨域传递和验证的特性,成为实现轻量级SSO的热门技术方案。在工程实践中,前端作为用户交互的直接入口,承担着令牌管理、安全存储和流程调度的关键职责。一个稳健的前端SSO架构需要综合考量令牌存储安全(如防范XSS攻击)、跨域认证流程、自动续期机制以及多标签页状态同步等核心问题。本文聚焦于前端视角,深入

weixin_30216561的博客 405

js 多窗口同源页面间通信storage事件和跨域页面间通信postMessage

当同源页面的某个页面修改了,其余的同源页面只要注册了storage同一浏览器打开了两个同源页面其中一个网页修改了localStorage另一网页注册了storage事件注意:在同一个网页修改本地存储,又在同一个网页监听,这样是没有效果的允许同源的不同浏览器窗口,Tab 页,frame 或者iframe下的不同文档之间相互通信页面和其打开的新窗口的数据传递页面与嵌套的 iframe 消息传递多窗口之间消息传递语法。

細水、長流√的专栏 507

【网络安全】PostMessage:分析JS实现XSS

PostMessage是一个用于在网页间安全地发送消息的浏览器 API。它允许不同的窗口(例如,来自同一域名下的不同页面或者不同域名下的跨域页面)进行通信,而无需通过服务器。通常情况下,它用于实现跨文档消息传递(Cross-Document Messaging),这在一些复杂的网页应用和浏览器插件中非常有用。

等风来 3148

页面间通信与数据共享解决方案简析

最近在看微服务方面的东西,看到关于 多个微服务页面间通信和数据共享的解决方案,发现了一些比较陌生的 API,说是陌生其实专门拿出来也能说出个所以然来,也知道是个什么东西,但就是不熟练,凭空想的话就很难能想到,看了一下觉得有些门道,于是索性扩展开来整理了一下 BroadcastChannel Broadcast 也是“广播”的意思,将信号广播出去,允许其他人接听。 此 API允许同一原始域和用户代理...

Quiet-Night的博客 1306

跨页面通信实战:从postMessage到BroadcastChannel的可靠调用与状态同步

浏览器中每个标签页都是独立JS执行环境,跨页面调用变量和函数本质上是基于消息路由的异步通信。同源策略严格划定了直接引用链的边界,无论是window.open、iframe父子窗口还是独立多标签页,都需要选择合适的通道。postMessage提供了跨域可控的双向消息机制,而localStorage的storage事件与BroadcastChannel则解决了无引用场景下的状态广播与实时协作。通过统一消息协议、请求标识、超时控制及版本号单调递增策略,可以构建抗竞态、防覆写的稳定跨页链路。这类技术广泛用于多页后台

weixin_34246826的博客 270

js中窗口的postMessage方法1

js中窗口的postMessage方法1

BroadcastChannel:浏览器原生跨标签页通信API详解

BroadcastChannel 是现代浏览器提供的原生跨上下文消息通信机制,基于同源策略实现毫秒级、事件驱动的广播式消息传递。其核心原理是通过频道(channel)抽象出逻辑通信组,无需显式窗口引用或后端中转,规避了 postMessage 的点对点局限、localStorage 的轮询延迟与 SharedWorker 的线程开销。该技术显著提升多标签页协同、实时状态同步与前端进程间通信的工程效率,广泛应用于购物车同步、协作编辑、主题切换等场景。作为 JavaScript API 的重要组成,它已成为构建

weixin_30598225的博客 392

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2164

前端中高级-网络篇

一、浏览器中输入:“`www.xxx.com`” 之后都发生了什么?请详细阐述? 解析:经典的网络协议问题。 答: 由域名→IP地址 寻找IP地址的过程依次经过了浏览器缓存、系统缓存、hosts文件、路由器缓存、 递归搜索根域名服务器。 建立TCP/IP连接(三次握手具体过程) 由浏览器发送一个HTTP请求 HTTP协议是一种基于TCP/IP的应用层协议,进行HTTP数据请求必须先建立TCP/IP连接 可以这样理解:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络

望京十三兄的博客 2884

《数据结构》04-树4 是否同一棵二叉搜索树

题目 给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。 输入格式: 输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要...

叫我皮卡丘 2012

ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇

shardingsphere 5.5.0移除了sm4算法,自己加上即可。增加spi扩展org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm增加以下代码:SM4算法代码/***/static {@Getter@Overrideif (!

qq_21903999的博客 4744

高级之路篇五:浏览器之通信

先说下,时下兼容性较好的,需求量较大的同浏览器同源打开的两个不同tab标签页的通信: 1、window.postMessage 适用情形:A页面中通过JavaScript的window.open打开B页面,或者B页面通过iframe嵌入至A页面 2、onstorage 适用情形:两个互不相关的通源tab页面通信 window.addEventListener("storage", fu...

HuaiCheng9067的博客 307

RK3588 平台imx334 驱动调试记录

rk3588调试imx334

xiaoning132的专栏 1790

Broadcast Channel API 实战:轻松实现多标签页同源通信与状态同步

在现代Web开发中,多标签页之间的数据同步是前端工程化绕不开的挑战。同源策略保障安全的同时,也限制了页面间直接通信,而localStorage事件、postMessage或SharedWorker等传统方案要么实现繁琐、要么语义不清。Broadcast Channel API作为一种轻量级的广播通信机制,以一对多的信道模型,让同源页面通过简单的postMessage即可实时收发消息,无需维护窗口引用或复杂协议,天然适合购物车同步、播放器状态联动、登录态共享等高频场景。它基于结构化克隆算法传递丰富数据类型,配

weixin_29326909的博客 233

YOLOv8【第十一章:视频追踪与流处理篇·第3节】匈牙利算法(Hungarian Algorithm)与 KM 算法匹配机制详解!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 445

TC8:SOMEIPSRV_SD_MESSAGE_07-09

TTL为服务实例的生命周期。在此生命周期之后,不提供服务实例。

jasonj333 908

浏览器Window底层操作全解

答:是浏览器的一种优化机制:当用户点击"后退"时,直接从内存中恢复整个页面状态(包括 DOM、JS 堆内存),而不是重新加载。正常流程:后退 → 重新请求 HTML → 解析 → 执行 JS → 渲染bfcache:后退 → 从内存恢复完整页面状态(瞬间完成)触发 bfcache 的条件页面没有未完成的网络请求(XHR/fetch)没有打开的WebSocket连接页面没有使用unload事件监听器(Chrome 限制)没有正在播放的音频/视频// 检测是否从 bfcache 恢复。

weixin_42687723的博客 757

微信小程序爬虫终极指南:以电商小程序抓包与逆向分析为例(最新版)

在2026年的移动互联网生态中,微信小程序已经成为电商交易的核心载体之一。据统计,超过78%的头部电商平台都推出了微信小程序版本,其用户活跃度甚至超过原生App。对于数据从业者而言,小程序端往往藏着比Web端更丰富的接口数据——包括但不限于商品详情、价格波动、用户评价、库存变化、秒杀活动信息等。与传统的Web爬虫不同,微信小程序爬虫面临着三大核心挑战无URL地址栏:无法通过浏览器直接查看网络请求wx.request封装:所有请求均通过微信原生API发起,难以直接拦截然而,

2201_76125261的博客 536

浏览器多标签页通信方案全解析:六大技术原理与选型

在现代Web开发中,浏览器的每个标签页都是相互隔离的运行单元,同源策略使页面之间无法直接共享内存或全局变量。要实现跨标签页通信,核心思路是利用浏览器提供的共享存储与消息广播机制,例如BroadcastChannel、localStorage事件、SharedWorker等。这些技术为前端应用带来实时状态同步能力,广泛应用于登录态同步、购物车更新、主题切换、协同编辑等场景,有效提升多窗口操作的一致性体验。不同方案在实时性、可靠性、兼容性上各有取舍,开发者需要根据业务场景权衡选择。本文系统梳理了六大主流多标签页

weixin_32631179的博客 210

【Java基础知识 19】Java接口的作用和意义

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

学Java,找哪吒 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Vue跨窗口通信:BroadcastChannel与localStorage实战

跨窗口通信是现代前端开发中的关键技术,主要用于实现多窗口间的数据同步。其核心原理基于浏览器提供的BroadcastChannel API和localStorage机制,前者实现实时消息传递,后者提供数据持久化支持。这种技术方案特别适合需要保持多窗口状态一致的场景,如仪表盘应用、多窗口协同编辑等。在Vue项目中,可以结合响应式系统实现高效的数据同步。通过BroadcastChannel的onmessage事件和localStorage的storage事件监听,开发者能够构建稳定可靠的跨窗口通信方案。相比传统的

weixin_29011239的博客 222

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: HTML5 拖拽换位(drag & drop)
下一篇: js 通过navigator.userAgent 判断不同类型浏览器
haogemr
博客等级 码龄9年 71粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值