使用window.postMessage实现跨域通讯

JavaScript因为同源策略的限制,跨域通讯一直是棘手的问题。固然解决方案也有不少:html

  • document.domain+iframe的设置,应用于主域相同而子域不一样;
  • 利用iframe和location.hash,数据直接暴露在了url中,数据容量和类型都有限
  • Flash LocalConnection, 对象可在一个 SWF 文件中或多个 SWF 文件间进行通讯, 只要在同一客户端就行,跨应用程序, 能够跨域。
  • window.name 保存数据以及跨域 iframe 静态代理动态传输方案,充分的运用了window.name由于页面的url改变而name不改变的特性。

各类方案网上都有不少实例代码,你们能够本身搜索一下。 
html5中最炫酷的API之一:就是   跨文档消息传输Cross Document Messaging 。高级浏览器Internet Explorer 8+, chrome,Firefox , Opera  和 Safari 都将支持这个功能。这个功能实现也很是简单主要包括接受信息的”message”事件和发送消息的”postMessage”方法。
html5

发送消息的”postMessage”方法web

向外界窗口发送消息:chrome

otherWindow.postMessage(message, targetOrigin);

otherWindow:   指目标窗口,也就是给哪一个window发消息,是 window.frames 属性的成员或者由 window.open 方法建立的窗口跨域

参数说明:浏览器

  • message:   是要发送的消息,类型为 String、Object (IE八、9 不支持)
  • targetOrigin:   是限定消息接收范围,不限制请使用 ‘*’

接受信息的”message”事件app

var onmessage = function (event) {  var data = event.data;  var origin = event.origin;  //do someing }; if (typeof window.addEventListener != 'undefined') {  window.addEventListener('message', onmessage, false); } else if (typeof window.attachEvent != 'undefined') {  //for ie  window.attachEvent('onmessage', onmessage); }

回调函数第一个参数接收 Event 对象,有三个经常使用属性:dom

  • data:   消息
  • origin:   消息来源地址
  • source:   源 DOMWindow 对象
相关文章
相关标签/搜索