小tips:postMessage处理iframe跨域通信
实例
父页面发消息给子页面,子页面接收消息后回复父页面。
父页面代码:
<body>
父级页面:
<button id="btn">给iframe子页面传递消息button</button>
<iframe src="index2.html" id="iframe1"></iframe>
<script>
var btn = document.getElementById('btn');
btn.addEventListener('click',function() {
var data = {
message: '子页面应该接收的消息'
}
// 给子页面发送消息
document.getElementById('iframe1').contentWindow.postMessage(data,"/");
},false); // 接收子页面传递的消息
window.addEventListener('message',function(e) {
console.log(e.data); // 父页面:我接收到消息了
},false);
</script>
</body>
iframe子页面代码:
<script type="text/javascript">
// 接收父页面发送的内容
window.addEventListener('message',function(e) {
console.log(e.data) // {message: "子页面应该接收的消息"} // 接收内容后,我们也可以给父页面发消息
window.parent.postMessage('父页面:我接收到消息了','/');
},false);
</script>
message事件
- data 包含任意字符串数据,由原始脚本发送
- origin 一个字符串,包含原始文档的方案、域名以及端口(如:http://domain.example:80)
- lastEventId 一个字符串,包含了当前的消息事件的唯一标识符。
- source 原始文件的窗口的引用。更确切地说,它是一个WindowProxy对象。
- ports 一个数组,包含任何MessagePort对象发送消息。
我们可以打印下子页面接收父页面的消息的对象,如下:
// 接收父页面发送的内容
window.addEventListener('message',function(e) {
console.log(e)
},false);
打印结果:
postMessage方法
postMessage方法支持两个参数,具体参考下表:
- message:发送的数据
- targetOrigin: 发送数据的来源
postMessage
方法中的message
参数不仅仅可以是字符串,结构对象、数据对象(如:File
和ArrayBuffer
)或是数组都是可以的。在IE8/IE9/FireFox3.6及其以下版本只支持字符串数据。
targetOrigin
参数指接收文档的来源。除非接收信息浏览上下文来源于提供的targetOrigin
中的一个匹配,否则浏览器是不会发送消息的。直接使用"*"
通配符绕开限制,但显然这样很不安全。您在实际使用的时候务必指定目标来源。您还可以通过使用"/"
来限制信息只能同源发送。
参考地址
小tips:postMessage处理iframe跨域通信的更多相关文章
- Javascript使用postMessage对iframe跨域通信
今天才发现原来有这么个好东西啊,跨域通信太方便了, 举个小栗子: 共两个页面, 页面1:www.a.com/a.html 页面2:www.b.com/b.html 实现目标:两个网站页面实现跨域相互通 ...
- iframe跨域通信实战
"长时间不写文章,开头的方式总是那么出奇的相似",最近很忙,好久没写博客了啊(是不是?). 更换工作已经有三个月有余,这段三个月把过去三年没加过的班都加了一次.收获挺多,发现的问题 ...
- Javascript 使用postMessage对iframe跨域传值或通信
实现目标:两个网站页面实现跨域相互通信 当前例子依赖于 jQuery 3.0 父页面代码:www.a.com/a.html <iframe id="myIframe" src ...
- iframe跨域通信方案
概述 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首先什么 ...
- 对iframe跨域通信的封装
github源码:https://github.com/boycy815/topProxy 为了偷懒所以依赖了Kissy:http://docs.kissyui.com/ 用法举例:需求是在http: ...
- iframe跨域通信window.postMessage()方法
需求:A页面中要嵌入一个iframe,这个iframe是B页面,此时A页面需要得到B页面的一些信息. window.postMessage() 我们都知道浏览器的同源策略,即对于两个不同页面的脚本,只 ...
- postMessage解决iframe跨域问题
转:https://juejin.im/post/5b8359f351882542ba1dcc31 https://juejin.im/post/590c3983ac502e006531df11 ht ...
- 【JavsScript】父子页面之间跨域通信的方法
由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...
- 【JavaScript】父子页面之间跨域通信的方法
由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...
- iframe跨域数据传递
项目中需要和其他单位合作开发,方案采用iframe嵌入页面,开发过程中设计到了跨域数据的传递,初步方案决定使用html5 API postMessage进行iframe跨域数据传递: 域名A下的页面 ...
随机推荐
- 如何查看Chrome内核版本
Blink Google chrome即谷歌浏览器原来采用的渲染引擎是Webkit,自chrome 28开始,谷歌浏览器放弃了Webkit,改用自主开发的渲染引擎Blink. 所以现在大多数喜欢尝鲜的 ...
- VS Code 开发统一代码格式化配置
eslint: 是用来做代码风格检查的,比较关注代码质量,并且会提示不符合风格规范的代码,也有一部分代码格式化的功能.不是消除空行. "editor.formatOnSave": ...
- Django集成的密码找回功能
要实现忘记密码功能,您需要进行以下修改: 添加忘记密码链接到登录页面. 创建密码丢失修改页面. 创建密码修改页面. 编写相应的视图函数来处理密码丢失修改和密码修改逻辑. 编写发送验证信息到邮箱的逻辑. ...
- 「模拟赛」暑期集训CSP提高模拟4(7.21)
很祭的一次比赛,啥也不会. 题目列表: A.White and Black B.White and White C.Black and Black D.Black and White A.White ...
- 解锁 SQL Server 2022的时间序列数据功能
解锁 SQL Server 2022的时间序列数据功能 SQL Server2022在处理时间序列数据时,SQL Server 提供了一些优化和功能,比如 DATE_BUCKET 函数.窗口函数(如 ...
- 从pytest源码的角度分析pytest工作原理
从pytest源码的角度分析pytest工作原理 从 pytest 源代码的角度来分析其工作原理,我们需要关注几个关键的部分,特别是 pytest 的启动过程以及测试的收集与执行.下面是基于 pyte ...
- 【SQL】SQL训练网站 SQLBlot
网站地址: https://sqlbolt.com/ Lesson1: -- https://sqlbolt.com/lesson/select_queries_introduction -- Fin ...
- 【Vue】Re19 Promise
一.概述 Promise是异步编程的解决方案 异步事件的处理: 封装的异步请求函数不能立即获取结果, 通常会传入另外一个函数,在请求成功的时候将数据通过传入的函数回调出去 如果只是一个简单的请求,那么 ...
- PVE linux_VM 扩容分区
页面 调整磁盘大小 手动分区 fdisk -l fdisk /dev/sda 对该磁盘进行分区, 输入n并回车,n是"new"新建分区 [root@localhost ~]# fd ...
- python语言下的迷宫游戏的实现猜想
由于本人是研究AI的,尤其是AI的强化学习方向,有时候就会对一些小游戏环境的实现有几分兴趣,因为刚看了有关reinforcement learning解决maze游戏的论文,于是就突发奇想的对这个ma ...