使用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圆角边框和边框阴影示例
May 05 HTML / CSS
CSS3实现彩色进度条动画的示例
Oct 29 HTML / CSS
基于HTML5 Canvas 实现弹出框效果
Jun 05 HTML / CSS
html5的新增的标签和废除的标签简要概述
Feb 20 HTML / CSS
html5各种页面切换效果和模态对话框用法总结
Dec 15 HTML / CSS
深入解析HTML5的IndexedDB索引数据库
Sep 14 HTML / CSS
HTML 5.1来了 9月份正式发布 更新内容预览
Apr 26 HTML / CSS
Html5实现首页动态视频背景的示例代码
Sep 25 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
Dec 02 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
Dec 03 HTML / CSS
详解如何获取localStorage最大存储大小的方法
May 21 HTML / CSS
纯CSS如何禁止用户复制网页的内容
Nov 01 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从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
文本链接逐个出现的js脚本
2007/12/12 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
Python实现购物车程序
2018/04/16 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
python中关于数据类型的学习笔记
2020/07/19 Python
学python爬虫能做什么
2020/07/29 Python
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
艺术系应届生的自我评价
2013/10/19 职场文书
农村婚礼证婚词
2014/01/10 职场文书
工作表现评语
2014/01/19 职场文书
甜点店创业计划书
2014/01/27 职场文书
目标管理责任书
2014/04/15 职场文书
精神文明单位申报材料
2014/05/02 职场文书
先进党组织事迹材料
2014/12/26 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
Python字符串格式化方式
2022/04/07 Python
Golang并发工具Singleflight
2022/05/06 Golang