使用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 相关文章推荐
HTML5 CSS3给网站设计带来出色效果
Jul 16 HTML / CSS
CSS3实战第一波 让我们尽情的圆角吧
Aug 27 HTML / CSS
利用css3制作3D样式按钮实现代码
Mar 18 HTML / CSS
CSS3新属性transition-property transform box-shadow实例学习
Jun 06 HTML / CSS
使用CSS3来匹配横屏竖屏的简单方法
Aug 04 HTML / CSS
html5文本内容_动力节点Java学院整理
Jul 11 HTML / CSS
用HTML5.0制作网页的教程
May 30 HTML / CSS
HTML中使用SVG与SVG预定义形状元素介绍
Jun 28 HTML / CSS
html5 viewport使用方法示例详解
Dec 02 HTML / CSS
简单整理HTML5的基本特性和语法
Feb 18 HTML / CSS
html5手机端页面可以向右滑动导致样式受影响的问题
Jun 20 HTML / CSS
html5用video标签流式加载的实现
May 20 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+js iframe实现上传头像界面无跳转
2014/04/29 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
google地图的路线实现代码
2009/08/20 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
python实现多人聊天室
2020/03/31 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
在pycharm中显示python画的图方法
2019/08/31 Python
python配置文件写入过程详解
2019/10/19 Python
python 实现多维数组转向量
2019/11/30 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
C语言笔试题
2014/09/04 面试题
C语言编程题
2015/03/09 面试题
保安员岗位职责
2013/11/17 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
诚信考试承诺书
2014/03/27 职场文书
银行业务授权委托书
2014/10/10 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript