使用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最新技术(与图片背景相关)
Dec 24 HTML / CSS
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
Jun 03 HTML / CSS
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
May 07 HTML / CSS
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
Sep 02 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
Oct 29 HTML / CSS
你不知道的5个HTML5新功能
Jun 28 HTML / CSS
HTML5 与 XHTML2
Oct 17 HTML / CSS
使用HTML5进行SVG矢量图形绘制的入门教程
Feb 19 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
Jan 08 HTML / CSS
使用html5 canvas绘制圆环动效
Jun 03 HTML / CSS
html5自动播放mov格式视频的实例代码
Jan 14 HTML / CSS
HTML5 textarea高度自适应的两种方案
Apr 08 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中的 == 运算符进行字符串比较
2006/11/26 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
js中有关IE版本检测
2012/01/04 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
js模糊查询实例分享
2016/12/26 Javascript
JS中的多态实例详解
2017/10/15 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
python实现上传下载文件功能
2020/11/19 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
python中selenium库的基本使用详解
2020/07/31 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
介绍一下木马病毒的种类
2015/07/26 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
年会主持词结束语
2014/03/27 职场文书
积极向上的团队口号
2014/06/06 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
大学生团日活动总结
2015/05/06 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
中小学生安全教育观后感
2015/06/17 职场文书