小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下的页面 ...
随机推荐
- 最近很火的Vue Vine是如何实现一个文件中写多个组件
前言 在今年的Vue Conf 2024大会上,沈青川大佬(维护Vue/Vite 中文文档)在会上介绍了他的新项目Vue Vine.Vue Vine提供了全新Vue组件书写方式,主要的卖点是可以在一个 ...
- HBase 在统一内容平台业务的优化实践
作者:来自 vivo 互联网服务器团队-Leng Jianyu.Huang Haitao HBase是一款开源高可靠性.扩展性.高性能和灵活性的分布式非关系型数据库,本文围绕数据库选型以及使用HBas ...
- 第六节 JMeter基础-中级登录【用户自定义变量】
1.认识JMeter (1)配置元件:配置对应的一些数据 (例如:HTTP请求默认值.用户定义的变量) (2)[HTTP请求默认值]:HTTP请求默认值是设置的Web服务器部分信息,可以贯穿多个接口. ...
- 【DataBase】MySQL 10 SQL函数 单行函数其四 其他函数
其他函数 -- 其他函数 -- MySQL版本查看 SELECT VERSION(); -- DATABASE 当前所属的数据库查看 SELECT DATABASE(); -- USER 当前用户 S ...
- 【Linux】真机安装CentOS8
先制作启动U盘 https://www.cnblogs.com/mindzone/p/12961506.html 插入电脑,开机[这里我是把电脑硬盘格式化了,不会在电脑磁盘上找到任何系统,直接跳到启动 ...
- 【Vue】Re03 computed属性计算和ES6的一些补充
一.Computed属性计算 四种计算处理的方式方法 <!DOCTYPE html> <html lang="en"> <head> <m ...
- 【Mybatis-Plus】06 代码生成器 CodeGenerator
导入生成器需要的依赖坐标: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybat ...
- 图解Java设计模式
待补充 设计模式介绍 设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案. 设计模式使用的位置 功能模块+框架上. 设计模式在软件中哪里?面向对象( ...
- 第7期(大连站)—— OpenHarmony城市技术论坛:边缘智能
PS. 为了进一步的推动国产信息化,国内的各个高校也是踊跃参与呢.
- Ubuntu18.04 server 双网卡,一个设置为静态IP, 一个设置为动态IP
操作目的如题: 修改网络配置文件: sudo vim /etc/netplan/50-cloud-init.yaml 修改内容如下: # This file is generated from inf ...