使用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样式linear-gradient的使用实例
Jan 16 HTML / CSS
利用CSS3的定位页面元素
Aug 29 HTML / CSS
button在IE6/7下的黑边去除方案
Dec 24 HTML / CSS
css3实现背景图片拉伸效果像桌面壁纸一样
Aug 19 HTML / CSS
CSS3之背景尺寸Background-size使用介绍
Oct 14 HTML / CSS
用css3写出气球样式的示例代码
Sep 11 HTML / CSS
css3新单位vw、vh的使用教程
Mar 23 HTML / CSS
Html5剪切板功能的实现代码
Jun 29 HTML / CSS
canvas拼图功能实现代码示例
Nov 21 HTML / CSS
iframe与window.onload如何使用详解
May 07 HTML / CSS
html5中嵌入视频自动播放的问题解决
May 25 HTML / CSS
纯html+css实现奥运五环的示例代码
Aug 02 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源代码数组统计count分析
2011/08/02 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
Python中operator模块的操作符使用示例总结
2016/06/28 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
Django中的ajax请求
2018/10/19 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
String和StringBuffer的区别
2015/08/13 面试题
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
中专毕业生求职简历的自我评价
2013/10/21 职场文书
俄罗斯商务邀请函
2014/01/26 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
共青团员自我评价范文
2014/09/14 职场文书
电工实训报告总结
2014/11/05 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS