使用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 3D位移translate效果实例介绍
May 03 HTML / CSS
CSS3的一个简单导航栏实现
Aug 03 HTML / CSS
CSS3中Animation动画属性用法详解
Jul 04 HTML / CSS
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
Aug 18 HTML / CSS
HTML5 中新的全局属性(整理)
Jul 31 HTML / CSS
HTML5 canvas绘制的玫瑰花效果
May 29 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
Jul 02 HTML / CSS
配置H5的滚动条样式的示例代码
Mar 09 HTML / CSS
HTML5中的websocket实现直播功能
May 21 HTML / CSS
使用canvas压缩图片上传的方法示例
Feb 07 HTML / CSS
CSS预处理框架——Stylus
Apr 21 HTML / CSS
HTML中实现音乐或视频自动播放案例详解
May 30 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
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
2016/08/10 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
Python实现发送与接收邮件的方法详解
2018/03/28 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Python datetime包函数简单介绍
2019/08/28 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Python实现京东抢秒杀功能
2021/01/25 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
最新计算机专业自荐信
2013/10/16 职场文书
毕业生就业意向书
2014/04/01 职场文书
建筑工地文明标语
2014/10/09 职场文书
周年庆典答谢词
2015/01/20 职场文书
颐和园导游词
2015/01/30 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python