iframe嵌入页面跨域(使用iframe+postMessage实现页面跨域通信的示例代码)
iframe嵌入页面跨域
使用iframe+postMessage实现页面跨域通信的示例代码通常情况下,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为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> <li>这里是子页面</li> <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的攻击
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
- frameset与iframe 的应用与区别
- 判断iframe是否加载完成
- iframe标签教程(关于解决iframe标签嵌套问题的解决方法)
- iframe向子页面发送消息(使用postMessage让 iframe自适应高度的方法示例)
- vue前台解析pdf文件流(Vue实现在线预览pdf文件功能利用pdf.js/iframe/embed)
- 少用iframe的原因
- iframe解决跨域问题(跨域修改iframe页面内容详解)
- iframe嵌入页面高度自动适应
- iframe如何解决跨域问题(关于iframe跨域使用postMessage的实现)
- js操作iframe
- iframe 弹窗(遮罩层 + Iframe实现界面自动显示的示例代码)
- iframe怎么设置域名(iframe与window.onload如何使用详解)
- iframe跨域原理(详解使用postMessage解决iframe跨域通信问题)
- iframe跨域获取标签(iframe跨域的几种常用方法)
- iframe嵌入页面跨域(使用iframe+postMessage实现页面跨域通信的示例代码)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
- 小米音乐与 QQ 音乐合作,便捷迁移会员(小米音乐与QQ音乐合作)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
- 贾怀胤唱《白龙马》 炸场 了 没想到京剧还能这么玩(贾怀胤唱白龙马)
- 白龙马的改编学生版,快来看看(白龙马的改编学生版)
热门推荐
- 用户 IIS APPPOOLDefaultAppPool 登录失败的解决方法
- ConcurrentDictionary与Dictionary的区别
- dede织梦的后台如何调整和使用(织梦DEDECMS中增加父栏目调用,以及多级支持currentstyle的方法)
- pymongo是否线程安全(pymongo中group by的操作方法教程)
- css水平或者垂直居中的写法(深入理解CSS行高line-height与文本垂直居中的原理)
- python中递归方法(Python中最大递归深度值的探讨)
- vue3 props用法(vue3组合API中setup、 ref、reactive的使用大全)
- sqlserver统计表大小(SqlServer 垂直分表减少程序改动)
- mysql 时间戳获取(MySQL时间盲注的五种延时方法实现)
- php对称算法示例(php解决约瑟夫环算法实例分析)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9