[乐意黎转载]Window.postMessage() HTML5 跨域解决方案
Hey,everybody~
又是倒霉的跨域 T T , 有多少人死在了“说出你知道的跨域解决方案,越多越好?”这个面试问题上。
今天和大家说说,HTML5提供的一个跨域解决方案,Window.postMessage , 它足够易学好用,会让你眼前一亮。但是往往大多数情况下,都不会让人一直笑下去,俗话说道高一尺魔高一丈,这个方法同样也会被HTTP的一些协议所限制着,比如X-Frame-Options:SAMEORIGIN
,不过好在大多数情况下,情况不至于这么糟糕。下面进入正题:
Window.postMessage 提供了一种安全的跨域通讯方案。
语法
语法分为两部分,发和收,其实都很简单。
发送
otherWindow.postMessage( message , origin [ , transfer] )
* otherWindow
跨域的window对象的引用,比如iframe、window.open创建的对象等。
* message
发给跨域对象的消息,可以是string,object,number等对象
* origin
指定消息发送的域名,可以使用通配符 *
接收
我们可以监听window 的 "message" 事件来获取到传递过来的值,例如:
window.addEventListener('message',receiveMessage,false);function receiveMessage(event){// ...
}
接收到的event包含下面几个重要的属性:
* data
传递过来的信息。
* origin
发送消息的域名,包含了协议和端口(如 https://developer.mozilla.org:443),通常情况下 默认端口会被省略,例如 https://www.google.com 意味着省略了端口443 , http://www.google.com 省略了端口 80。
* source
发送数据的window的引用,例如b域名收到a域名的消息,此时的source指的是a域名的window,你可以通过它来实现双向通讯。
举例:
好了,终于可以举个例子了,(等等我的糖炒板栗呢?)
示例页面:
http://jsbin.com/wecoqi
示例代码:
http://jsbin.com/wecoqi/9/edit?html,js
http://jsbin.com/qetuwicebo/9/edit?html,js
代码解释
用户打开A页面,点击Open Window按钮,打开一个新的B页面(由于资源有限,Demo中用同域作为演示), 回到A页面点击 push message 按钮 ,发送你好到B页面,同时收到B页面的反馈。 这时候回到B页面,就能看到B页面的收到的消息了。
具体代码如下。
A页面
//获取按钮以及显示文本的DOM
var openWindow = document.getElementById('open');
var pushMessage = document.getElementById('push');
var messageBox = document.getElementById('message');var newWin;//Open Window 按钮事件
openWindow.addEventListener('click',function(){//点击之后,打开一个新的窗口,并获得该窗口的引用newWin = window.open('http://jsbin.com/qetuwicebo');
})pushMessage.addEventListener('click',function(){//点击发送消息按钮,发送你好到新打开的窗口//注意第二参数是接收消息的域名,虽然可以用*匹配所有的域名,//但是在生产环境中,强烈建议写成真实的域名,以防不必要的攻击newWin.postMessage('你好','*');//messageBox.innerHTML= messageBox.innerHTML+'发送了消息“你好“,请移步新打开的页面查看收到的消息'
})//监听message事件,已接收其他页面发来的信息
window.addEventListener('message',function(event){messageBox.innerHTML= messageBox.innerHTML+'<br>收到了回复:'+event.data
})
B页面
//监听message事件
window.addEventListener("message", receiveMessage, false);function receiveMessage(event){//注意,在生产环境中,一定要验证event.origin,以避免潜在的安全问题var html='event.data: '+event.data+'<br>';html += 'event.origin: '+event.origin+'<br>';html += 'event.source: '+event.source+'<br>';document.getElementById('message').innerHTML= html;//收到消息之后我们会给,父页面发送一条回复//event.source可以获取到消息来源页面的引用event.source.postMessage('hi,我来之新打开的页面,我收到你post的消息了',event.origin);
}
结尾
不想写结尾,但是,如果不写 @Robin Ma 又要说我的文章结尾太唐突了。 好吧,这里是结尾,就这样。 对了,记得回复哦,这是最好的鼓励 ~ :)
原文地址: https://www.zhuwenlong.com/blog/article/5524f05cfd9753d106000001
[乐意黎转载]Window.postMessage() HTML5 跨域解决方案相关推荐
- 使用window.postMessage实现跨域通信
JavaScript由于同源策略的限制,跨域通信一直是棘手的问题.当然解决方案也有很多: document.domain+iframe的设置,应用于主域相同而子域不同: 利用iframe和locati ...
- ifrme嵌入外部页面,在外部页面调用本页面方法,window.postMessage实现跨域通信
项目场景:vue页面开发的系统要继承外部系统页面,并且在外部系统页面调用本系统的方法,这样来看的话肯定会存在跨域的问题,而且直接调用方法的话,也不太安全,后来了解到window.postMessage ...
- window.postMessage - 前端跨域通信
window.postMessage - 前端跨域通信 window.postMessage() 语法 The dispatched event 安全问题 示例 注意 HTMLIFrameElemen ...
- html5跨域 postmessage,html5跨域通讯之postMessage的用法总结
postMessagePortal.html 页面代码 复制代码代码如下: 标题 var targetOrigin = "http://22527.vhost20.boxcdn.cn&quo ...
- 页面嵌套iframe(window.postMessage()实现跨域通信)
项目中的需求 需要外接一个iframe与主页面之间需要通信 的情况 在iframe 中: 在主页面中: window.postMessage() 方法可以安全地实现跨源通信.通常,对于两个不同页面的脚 ...
- 服务端转发html页面,html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
说起来挺简单的,可以直接去查询postMessage推送和window.addEventListener接收使用方式,能自己搞明白是最好的,本文章也只是记录一下自己的使用方式 使用postMessag ...
- html5跨域通信之postMessage
html5跨域通信之postMessage的用法 不同域名下的文档因为安全问题,不允许相互之间文档的访问,但是有的时候却不得不需要这样的操作.因此我们一般可以采用 window.name,hash,或 ...
- [转]html5: postMessage解决跨域和跨页面通信的问题
[转]html5: postMessage解决跨域和跨页面通信的问题 参考文章: (1)[转]html5: postMessage解决跨域和跨页面通信的问题 (2)https://www.cnblog ...
- postMessage解决跨域问题
postMessage解决跨域问题 html5有了很多新的功能,解决了以前很多一些很纠结的问题,比如说跨域访问数据,html5中就有了postMessage来解决了这一问题,它提供的api也一样简单易 ...
最新文章
- python netty_Netty源码解读(一)概述
- IOS 非常流畅的滑动tableView
- 关于documentFrgament 文档片段的简单理解
- WINCE下SOS驱动开发
- 【ABAP】Native SQL
- 10-异步爬虫(线程池/asyncio协程)实战案例
- xLite连接asterisk提示sip408错误
- ssms没有弹出服务器验证_powerbi报表服务器搭建链接
- c语言字符类型强制换成内码,C语言实现不同汉字系统的内码转换方法
- sql练习三(DataWhale 系列-最终)
- 工程linux下创建svn仓库目录结构
- 拓端tecdat|用SPSS估计HLM多层(层次)线性模型
- 关系数据库设计理论--3NF
- xp电脑多少位怎么看_怎么看电脑是32位还是64位
- SQL Server2008数据库置疑修复办法
- 使用Eclipse统计自己项目程序代码量【实测可用】
- 10bit灰阶测试图_我可能买的是一块假10bit显示器以及一块假8bit显示器?
- PCB的埋孔、盲孔、通孔
- ubuntu 更换桌面为 KDE
- JS逆向加密——B 站弹幕 protobuf 分析
热门文章
- dotnet项目移植瑞芯微3568板卡
- opencv python3 找图片色块_OpenCV中色块的检测与标注
- 【技巧】数据生成器对拍
- 2022-2027年中国大麦行业市场调研及未来发展趋势预测报告
- 说给妈妈的10个对不起
- jiffies防溢出
- Android FILE_PROVIDER_PATHS 冲突错误 meta-data#android.support.FILE_PROVIDER_PATHS@resource
- 网络优化工程师这个职业怎么样
- 蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)
- 从LDD 到 studio,我们来说说市面上的LEGO设计软件