HTML5中的跨文档消息传递

Vue进阶(九十二):应用 postMessage 实现窗口通信_vue使用postmessage 其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)《前端开发四大模块核心知识笔记》最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】 阅读详情

跨文档消息传送(cross-document messaging),有时候也简称为XDM,指的是来自不同域的页面间传递消息。例如,www.w3cmm.com域中的一个页面与一个位于内嵌框架中的p2p.w3cmm.com域中的页面通信。在XDM机制出现之前,更稳妥地实现这种通信需要花很多功夫。XDM把这种机制规范化,让我们能既稳妥有简单地实现跨文档通信。

XDM的核心是postMessage()方法。在HTML5规范中,除了XDM部分之外的其它部分也会提到这个方法名,但都是为了同一个目的:向另一个地方传递数据。对于XDM而言,“另一个地方”指的是包含在当前页面中的<iframe>元素,或者由当前页面弹出的窗口。

postMessage()方法接收两个参数:一条消息和一个表示消息接收方来自哪个域的字符串。第二个参数对保障安全通信非常重要,可以防止浏览器把消息发送到不安全的地方。来看下面的例子。

//向id为myframe的iframe发送信息
var iframWindow = document.getElementById("myframe").contentWindow;
iframWindow.postMessage("A secret", "http://www.w3cmm.com");

最后一行代码尝试向内嵌框架中发送一条消息,并指定框架中的文档必须来源于“ http://www.w3cmm.com”域。

如果来源匹配,消息会传递到内嵌框架中;否则,postMessage()什么也不做。这一限制可以避免窗口中的位置在你不知道的情况下发生改变。如果传给postMessage()的第二个参数是“*”,则表示可以把消息发送给来自任何域的文档,但我们不推荐这样做。

接收到XDM消息时,会触发window对象的message事件。这个事件是以异步形式触发的,因此从发送消息到接受消息(触发接受窗口的message事件)可能要经过一段时间的延迟。触发message事件后,传递给onmessage处理程序的事件对象包含以下三方面的重要信息。

data:作为postMessage()第一个参数传入的字符串数据。
origin:发送消息的文档所在的域,例如“http://www.w3cmm.com”。
source:发送消息的文档的window对象的代理。这个代理对象主要用于在发送上一条消息的窗口中调用postMessage()方法。如果发送消息的窗口来自同一个域,那这个对象就是window。

接受到消息后验证发送窗口的来源是至关重要的。就像给postMessage()方法指定第二个参数,以确保浏览器不会把消息发送给未知页面一样,在onmessage处理程序中检测消息来源可以确保传入的消息来自已知的页面。基本的检测模式如下。

//iframe的页面内
window.addEventListener("message", function (event) {
    //确保发送消息的域是已知的域
    if (event.origin == "http://www.w3cmm.com") {
        //处理接收到的数据
        processMessage(event.data);
        //可选:向来源窗口发送回执
        event.source.postMessage("Received!", "http://p2p.w3cmm.com");
    }
}, false);

还是要提醒大家,event.source大多数情况下只是window对象的代理,并非实际的window对象。换句话说,不能通过这个代理对象访问window对象的其它任何信息。记住,只通过这个代理调用postMessage()就好。

XDM还有一些怪异之处。首先,postMessage()第一个参数最早是作为“永远都是字符串”来实现的。但后来这个参数的定义改了,改成允许传入任何数据结构。可是,并非所有浏览器都实现了这一变化。为保险起见,使用postMessage()时,最好还是只传字符串。如果你想传入结构化的数据,最佳选择是先在要传入的数据上调用JSON.stringify(),通过postMessage()传入得到的字符串,然后再在onmessage事件处理程序中调用JSON.parse()。

在通过内嵌框架加载其它域的内容时,使用XDM是非常方面的。因此,在混搭和社交网络应用中,这种传递消息的方法极为常用。有了XDM,包含<iframe>的页面可以确保自身不受恶意内容的侵扰,因为它只通过XDM为嵌入的框架通信。而XDM也可以来自相同域的页面间使用。

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

相关推荐

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

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

等风来 3149

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

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

qq_45677671的博客 1万+

跨文档消息传递(Cross-Document Messaging)在H5中的实现

跨文档消息传递(Cross-Document Messaging)是一种在HTML5中引入的机制,它允许不同的文档(窗口、标签页或iframe)之间安全地传递消息。通过指定目标窗口的引用和目标窗口的源,我们可以确保消息只发送给预期的窗口。该方法允许我们指定目标窗口、消息内容和接收消息的窗口的源。例如,我们可以在窗口之间传递JSON格式的数据,并根据消息内容执行不同的操作。需要注意的是,为了确保安全性,我们在接收消息时进行了源验证(event.origin)和窗口验证(event.source)。

PmtxPhp的博客 197

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

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

2301_79858914的博客 7869

构建现代贪吃蛇游戏:HTML5与Web技术的融合

本文深入探讨了如何通过HTML5技术增强贪吃蛇游戏的体验。介绍了HTML5的新特性如本地存储、会话存储和IndexedDB的使用,以及如何利用Web存储和消息传递API实现更丰富的用户互动和数据持久化。文章通过代码示例和详细解释,展示了如何将这些技术应用于游戏开发,以提高游戏的趣味性和社交性。

weixin_42590539的博客 376

js中窗口的postMessage方法1

js中窗口的postMessage方法1

HTML5实战与剖析之跨文档消息传递(iframe传递信息)

在来自不同域名的页面间传递消息一般统称为跨文档消息传送,简称XDM。如,www.leemagnum.com域中的页面与位于一个内嵌框架中的http://blog.youkuaiyun.com/lee_magnum域名中的页面通信。在XDM机制出现之前,要毫无压力地实现这种通信需要用很长时间。XDM把这种机制规范化,让咱们能够既稳妥又简单地实现跨文档通信。

梦龙小站 4007

Clion+platformIO开发ESP32时找不到lib文件中引入第三方库的头文件(头文件下有波浪线),实际编译是成功的解决方法

Clion+platformIO开发ESP引入第三方库文件编译器无法找到.h文件但编译成功

zs5218的博客 1852

跨文档消息传递----postMessage()

HTML5 规范中,提出了XDM,又称为跨文档消息传递,其核心是 postMessage()方法,进行跨域和跨文档消息传递,示例如下: <div class="CrossDocumentMessage"> Cross Document Message , core---->postMessage()</div> <iframe i...

ahienoq190204的博客 232

在ros里给机械臂加上夹爪和底盘后,控制真实机械臂

使用ur3_bringup 可以连接真实机械臂 使用官方的ur3_moveit_planning_execution.launch 可以对机械臂 moveit规划。 但是只有机械臂,没有夹爪。 官方如图: 我把原来的ur3_moveit_config 复制出来,修改 然后把ur3.xacro 等模型文件复制出来修改,修改完之后,有了夹爪,有了底盘。 规划组什么的使用moveit setup assistant 配置过了。 在rviz中可以笛卡尔空间规划了。 ...

超级菜 2721

Zephyr OS实战指南:从入门到精通物联网开发

本文提供了一份详尽的Zephyr OS实战指南,涵盖从开发环境搭建到物联网应用开发的全过程。文章详细介绍了如何利用Zephyr OS进行线程管理、设备驱动开发、低功耗设计以及蓝牙通信,并通过具体代码示例帮助开发者快速掌握这一专为物联网设备设计的开源实时操作系统,实现从入门到精通的跨越。

weixin_29201933的博客 547

【js学习笔记-116】-----html5之跨域消息传递

html5之跨域消息传递 一些浏览器窗口和标签之间都是完全相互独立的,在其中一个窗口或者标签中运行的代码在其他窗口或标签中完全无法识别。但是,在其他的一些场景下,当脚本显式打开一个新窗口或者在嵌套的窗体中运行的时候,多个窗口或者窗体之间是互相可识别的。如果它们包含的文档是来自同一台web服务器,则再这些窗口和窗体中的脚本可以互相之间进行交互和操作对方的文档。然而,有时候,尽管脚本可能引用其他的w

Will 的专栏 1999

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

weixin_42412049的博客 2301

javascript高级程序设计学习笔记(七)---HTML5脚本编程

HTML5脚本编程 跨文档消息传递 跨文档消息传递,指的是在来自不同域的页面间传递消息。 核心是postMessage方法。目的是向另一个地方传递数据,这里的另一个地方指的是包含当前页面的< iframe>元素,或者当前页面弹出的窗口 接收的参数: 一条消息 一个表示消息接收方来自哪个域的字符串 var iframeWindow = document.getElementById("myframe").contentWindow; iframeWindow.postMessage("hell

ningpeixi679的博客 168

OCR文字识别基础

ocr文字识别

m0_47405013的博客 1755

华为OD机试真题2026双机位C卷 C语言 实现【明日之星选举】

给定一组选票votes。votes[i]代表第 i 张选票的内容,包含一个字符串"zhangsan,hanmei",表示推荐zhangsan为明日之星,反对 hanmei 称为明日之星。赞成或反对使用逗号(,)分割。 给定一个数组n,表示最后将筛选出赞成票最多的n个人,如果赞成票相同,则反对票越少,排序越靠前;如果赞成票和反对票都相同,则按照姓名字典序升序排序。

MISAYAONE的博客 184

通过创建有趣的游戏学习 HTML5(三)

原文:zh.annas-archive.org/md5/0598834ED79056F95FE4B258BB7FBDFD 译者:飞龙 协议:CC BY-NC-SA 4.0 第五章:改进贪吃蛇游戏 本章是我们构建更健壮的贪吃蛇游戏系列的第二部分,也是最后一部分。在本章中,我们将继续使用第三章中已有的内容,理解 HTML5 的重要性,并向其中添加更多的 HTML5 API,以使游戏更加丰富,提供更加引人入胜的用户体验。 游戏的第一个版本使用了五个 HTML5 概念,即 2D 画布渲染、离线应用程序缓存、We

龙哥盟 536

LVGL 蜂巢气泡菜单(Hex Menu)

h。

摸鱼专家 178

HTML5 程序员参考(五)

原文:HTML5 Programmer’s Reference 协议:CC BY-NC-SA 4.0 八、HTML5 API 参考 本章为所有新的 HTML5 JavaScript APIs 提供了详细的参考。有关这些 API 的详细讨论,包括示例和发布时的支持级别,请参见第三章。 服务器发送的事件 服务器发送的事件 API 允许 HTML5 客户端订阅服务器发布的事件服务。然后,服务器可以将事件传输到 HTML5 客户端。 服务器发送事件的 API 是全局 JavaScript 范围内的一个Event

龙哥盟 634

从零到精通:BLDC电机驱动电路详解与设计思路

这套电机驱动电路从核心控制器到反馈采集模块,涉及了BLDC电机驱动的方方面面。每一个模块的设计和选择都需要综合考虑系统需求和实际使用环境。在实际应用中,很多细微的设计改进都会显著影响电机的运行性能。

weixin_43199439的博客 3109

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

16. javacript高级程序设计-HTML5脚本编程

1. HTML5脚本编程 l 跨文档消息传递API能够让我们在不降低同源策略安全性的前提下,在来至不同的域的文档间传递消息 l 原生拖放功能可以方便的指定某个元素是否可以拖动,并在放置时做出响应。还可以创建自定义的可拖放元素及放置目标 l 新的媒体元素<audio>和<video>可以拥有自己的与视频和音频交互的API l 历史状态管理让我们不必卸载当前页面即可以修...

weixin_30571465的博客 163

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

HTML5脚本编程

一,跨文档消息传递   Cross-document message(XDM)   postMessage()方法,向另一个地方传递数据,接收两个参数,一条消息和一个表示接收方来自哪个域的字符串,   接收到XDM消息时,会触发window的message事件,事件是以异步形式触发的,   触发message事件后,传递给onmessage处理程序的事件对象包含三方面的重要信息     data...

weixin_30593443的博客 103

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: Linux(Centos 7.x)下安装nginx
下一篇: node如何实现一个简单的爬虫
Camol
博客等级 码龄10年 1粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值