使用iframe+postMessage实现页面跨域通信的示例代码


Posted in HTML / CSS onJanuary 14, 2020

通常情况下,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机时,这两个脚本才能相互通信。而在实际项目开发过程中,经常会利用iframe在一个父页面中嵌入另外一个子页面,或者在一个父页面中弹出另一个页面,由于同源策略的限制,父子页面之间的脚本无法实现通信,而使用postMessage方法就实现了父子页面之间的跨域信息传递。

语法:

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

otherWindow:其他页面的引用,例如,iframe的contentWindow属性,或者执行window.open返回的窗口对象。

message:将要传递到另一个页面的数据(可以不受限制的将数据对象安全的传送给目标窗口而无需自己序列化,原因是因为采用了结构化克隆算法)。

targetOrigin:通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是一个字符串"*"(表示无限制)或者一个Url。只有当目标窗口的协议、主机地址、端口号和targetOrigin完全匹配时,目标窗口才会收到message信息。为了防止信息泄露,通常情况下都会指定特定的url。

transfer:可选参数。

使用方法:

1.父页面:(url为http://www.b.com/main.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>父页面</title>
</head>
<body>
    <iframe id="child" src="http://www.a.com/iframepage.html"></iframe>
    <script>
        window.onload = function(){
            document.getElementById("child").contentWindow.postMessage("主页面传递的消息","http://www.a.com/iframepage.html")
        }
        window.addEventListener('message', function(event){  //父获取子传递的消息
            if(event.origin == "http://www.a.com"){
                //可以在这里做一些逻辑操作
            }
        }, false)
    </script>
</body>
</html>

2.子页面(url为http://www.a.com/iframepage.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子页面</title>
</head>
<body>
    <div>这里是子页面</div>
    <script>
        window.addEventListener('message', function(event){
           if(event.origin == "http://www.b.com"){
                //可以在这里做一些操作
                top.postMessage("子页面收到父页面传递来的消息", 'http://www.b.com/main.html')//子页面向父页面传递消息
           }
        }, false);
    </script>
</body>
</html>

postMessage方法被调用时,会在所有页面脚本执行完毕之后像目标窗口派发一个 MessageEvent 消息,该MessageEvent消息有四个属性需要注意:

type:表示该message的类型

data:为postMessage的第一个参数

origin:表示调用postMessage方法窗口的源

source:记录调用postMessage方法的窗口对象

特别注意:
1.一定要等A页面嵌入的B页面加载完成之后,再进行postMessage跨域通信
2.一定要对origin做判断,去掉不是来自我们目标窗口的origin,防止来自其他origin的攻击

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS教程:CSS3圆角属性
Apr 02 HTML / CSS
用CSS3实现Win8风格的方格导航菜单效果
Apr 10 HTML / CSS
用CSS3绘制三角形的简单方法
Jul 17 HTML / CSS
CSS3中的Media Queries学习笔记
May 23 HTML / CSS
html5读取本地文件示例代码
Apr 22 HTML / CSS
使用phonegap查找联系人的实现方法
Mar 31 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
Jul 02 HTML / CSS
Html5 canvas实现粒子时钟的示例代码
Sep 06 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
Aug 11 HTML / CSS
什么是css原子化,有什么用?
Apr 24 HTML / CSS
CSS控制继承中的height能变为可继承吗
Jun 10 HTML / CSS
CSS实现鼠标悬浮动画特效
May 07 HTML / CSS
Html5跳转到APP指定页面的实现
Jan 14 #HTML / CSS
html5自动播放mov格式视频的实例代码
Jan 14 #HTML / CSS
html5响应式开发自动计算fontSize的方法
Jan 13 #HTML / CSS
html5 制作地图当前定位箭头的方法示例
Jan 10 #HTML / CSS
详解HTML5 Canvas标签及基本使用
Jan 10 #HTML / CSS
HTML5自定义mp3播放器源码
Jan 06 #HTML / CSS
html5 canvas手势解锁源码分享
Jan 07 #HTML / CSS
You might like
php变量范围介绍
2012/10/15 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
xml转json的js代码
2012/08/28 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
django中的数据库迁移的实现
2020/03/16 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
团员学习总结的自我评价范文
2013/10/14 职场文书
教师应聘个人求职信
2013/12/10 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
2014年网管工作总结
2014/12/11 职场文书
收银员岗位职责
2015/02/03 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
老人院义工活动感想
2015/08/07 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
详解Java实践之适配器模式
2021/06/18 Java/Android