利用HTML5的window.postMessage实现跨域通信

4.HTML5的window.postMessage简述

postMessage是html为了解决跨域通信,特别引入的一个新的API,目前支持这个API的浏览器有:Firefox,IE8+,Opera,Safari,Chrome。postMessage允许页面中的多个iframe/window的通信,postMessage也可以实现ajax直接跨域,不通过服务器端代理。

感谢苏河哥哥提供另外个主机作为跨域测试,O(∩_∩)O哈!

在上面的demo中,明河简单演示了postMessage的用法,父页面中有二个不同域的iframe,现在我们要求这二个iframe每过一秒,向对方的内容层传递一行文字,对象一接收到文字就开始输出。

5.postMessage用法解析

这里以iframe1.html的代码为例。

1)向另外一个iframe发送消息

varmessage='hello,RIA之家!  '+(newDate().getTime());

window.parent.frames[1].postMessage(message,'*');

iframe1.html需要向iframe2.html发送消息,也就是第二个iframe,所以是window.parent.frames[1],如果是向父页面发送消息就是window.parent。

postMessage这个函数接收二个参数,缺一不可,第一个参数即你要发送的数据,第二个参数是非常重要,主要是出于安全的考虑,一般填写允许通信的域名,这里明河为了简化,所以使用’*',即不对访问的域进行判断。

2)另外一个iframe监听消息事件

iframe2.html中写个监听message事件,当有消息传到iframe2.html时就会触发这个事件。

varonmessage=function(e){

vardata=e.data,p=document.createElement_x('p');

p.innerHTML=data;

document.getElementById('display').appendChild(p);

};

//监听postMessage消息事件

if(typeofwindow.addEventListener!='undefined'){

window.addEventListener('message',onmessage,false);

}elseif(typeofwindow.attachEvent!='undefined'){

window.attachEvent('onmessage',onmessage);

}

整个通信过程就结束了!是不是非常简单惬意!

如果你有加域名限,比如下面的代码:

window.parent.frames[1].postMessage(message,'http://www.36ria.com');

就要在onmessage中追加个判断:

if(event.origin!==http://www.36ria.com')return;

6.明河结语

html5的postMessage相当强悍和易用!你可以利用这个特性解决大部分场景下的跨域问题,不用再创建个代理iframe之类的繁琐方法。严重推荐大家练习下该方法,目前的确存在浏览器差异问题,但相信以后会成为主流跨域通信方案。

相关推荐