使用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教程:边框属性border的极致应用
Apr 02 HTML / CSS
纯CSS3代码实现文字描边
Apr 25 HTML / CSS
如何用css3实现switch组件开关的方法
Feb 09 HTML / CSS
html5 touch事件实现页面上下滑动效果【附代码】
Mar 10 HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
May 25 HTML / CSS
把富文本的回车转为br标签
Aug 09 HTML / CSS
html5+svg学习指南之SVG基础知识
Dec 17 HTML / CSS
使用HTML5 Canvas API控制字体的显示与渲染的方法
Mar 24 HTML / CSS
详解H5 活动页之移动端 REM 布局适配方法
Dec 07 HTML / CSS
webView加载html图片遇到的问题解决
Oct 08 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
Sep 16 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
Mar 24 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/10/09 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
javascript实现倒计时提示框
2021/03/02 Javascript
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
python实现获取Ip归属地等信息
2016/08/27 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
酒店中秋节活动方案
2014/01/31 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
专项法律服务方案
2014/06/11 职场文书
党员争先创优承诺书
2015/01/20 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
我收到了德劲DE1107
2022/04/05 无线电