使用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 相关文章推荐
使用css3制作动感导航条示例
Jan 26 HTML / CSS
CSS3制作漂亮的照片墙的实现代码
Jun 08 HTML / CSS
基于ccs3的timeline时间线实现方法
Apr 30 HTML / CSS
浅谈cookie和localStorage那些事
Aug 27 HTML / CSS
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
Jan 09 HTML / CSS
html5 乒乓球(碰撞检测)实例二
Jul 25 HTML / CSS
【HTML5】3D模型--百行代码实现旋转立体魔方实例
Dec 16 HTML / CSS
HTML5中的Web Notification桌面右下角通知功能的实现
Apr 19 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
Aug 23 HTML / CSS
详解canvas绘制网络字体几种方法
Aug 27 HTML / CSS
HTML5公共页面提取作为公用代码的方法
Jun 30 HTML / CSS
clear 万能清除浮动(clearfix:after)
May 21 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
Yii2中关联查询简单用法示例
2016/08/10 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
[36:02]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第一局
2016/02/28 DOTA
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
使用Python绘制图表大全总结
2017/02/11 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
解决python replace函数替换无效问题
2020/01/18 Python
Python @property及getter setter原理详解
2020/03/31 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
如何查找网页漏洞
2016/06/22 面试题
公务员综合考察材料
2014/02/01 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
七一慰问简报
2015/07/20 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
Python中文纠错的简单实现
2021/07/07 Python
Python OpenCV实现图像模板匹配详解
2022/04/07 Python