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 跨域解决方案相关推荐

  1. 使用window.postMessage实现跨域通信

    JavaScript由于同源策略的限制,跨域通信一直是棘手的问题.当然解决方案也有很多: document.domain+iframe的设置,应用于主域相同而子域不同: 利用iframe和locati ...

  2. ifrme嵌入外部页面,在外部页面调用本页面方法,window.postMessage实现跨域通信

    项目场景:vue页面开发的系统要继承外部系统页面,并且在外部系统页面调用本系统的方法,这样来看的话肯定会存在跨域的问题,而且直接调用方法的话,也不太安全,后来了解到window.postMessage ...

  3. window.postMessage - 前端跨域通信

    window.postMessage - 前端跨域通信 window.postMessage() 语法 The dispatched event 安全问题 示例 注意 HTMLIFrameElemen ...

  4. html5跨域 postmessage,html5跨域通讯之postMessage的用法总结

    postMessagePortal.html 页面代码 复制代码代码如下: 标题 var targetOrigin = "http://22527.vhost20.boxcdn.cn&quo ...

  5. 页面嵌套iframe(window.postMessage()实现跨域通信)

    项目中的需求 需要外接一个iframe与主页面之间需要通信 的情况 在iframe 中: 在主页面中: window.postMessage() 方法可以安全地实现跨源通信.通常,对于两个不同页面的脚 ...

  6. 服务端转发html页面,html5关于外链嵌入页面通信问题(postMessage解决跨域通信)

    说起来挺简单的,可以直接去查询postMessage推送和window.addEventListener接收使用方式,能自己搞明白是最好的,本文章也只是记录一下自己的使用方式 使用postMessag ...

  7. html5跨域通信之postMessage

    html5跨域通信之postMessage的用法 不同域名下的文档因为安全问题,不允许相互之间文档的访问,但是有的时候却不得不需要这样的操作.因此我们一般可以采用 window.name,hash,或 ...

  8. [转]html5: postMessage解决跨域和跨页面通信的问题

    [转]html5: postMessage解决跨域和跨页面通信的问题 参考文章: (1)[转]html5: postMessage解决跨域和跨页面通信的问题 (2)https://www.cnblog ...

  9. postMessage解决跨域问题

    postMessage解决跨域问题 html5有了很多新的功能,解决了以前很多一些很纠结的问题,比如说跨域访问数据,html5中就有了postMessage来解决了这一问题,它提供的api也一样简单易 ...

最新文章

  1. python netty_Netty源码解读(一)概述
  2. IOS 非常流畅的滑动tableView
  3. 关于documentFrgament 文档片段的简单理解
  4. WINCE下SOS驱动开发
  5. 【ABAP】Native SQL
  6. 10-异步爬虫(线程池/asyncio协程)实战案例
  7. xLite连接asterisk提示sip408错误
  8. ssms没有弹出服务器验证_powerbi报表服务器搭建链接
  9. c语言字符类型强制换成内码,C语言实现不同汉字系统的内码转换方法
  10. sql练习三(DataWhale 系列-最终)
  11. 工程linux下创建svn仓库目录结构
  12. 拓端tecdat|用SPSS估计HLM多层(层次)线性模型
  13. 关系数据库设计理论--3NF
  14. xp电脑多少位怎么看_怎么看电脑是32位还是64位
  15. SQL Server2008数据库置疑修复办法
  16. 使用Eclipse统计自己项目程序代码量【实测可用】
  17. 10bit灰阶测试图_我可能买的是一块假10bit显示器以及一块假8bit显示器?
  18. PCB的埋孔、盲孔、通孔
  19. ubuntu 更换桌面为 KDE
  20. JS逆向加密——B 站弹幕 protobuf 分析

热门文章

  1. dotnet项目移植瑞芯微3568板卡
  2. opencv python3 找图片色块_OpenCV中色块的检测与标注
  3. 【技巧】数据生成器对拍
  4. 2022-2027年中国大麦行业市场调研及未来发展趋势预测报告
  5. 说给妈妈的10个对不起
  6. jiffies防溢出
  7. Android FILE_PROVIDER_PATHS 冲突错误 meta-data#android.support.FILE_PROVIDER_PATHS@resource
  8. 网络优化工程师这个职业怎么样
  9. 蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)
  10. 从LDD 到 studio,我们来说说市面上的LEGO设计软件