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

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp77html

 

HTML5的window.postMessage简述html5

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

 

.postMessage用法解析跨域

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

1)向另一个iframe发送消息安全

var message = 'hello,RIA之家!   ' + (new Date().getTime());服务器

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

iframe1.html须要向iframe2.html发送消息,也就是第二个iframe,因此是window.parent.frames[1],若是是向父页面发送消息就是window.parent。函数

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

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

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

var onmessage = function(e) {

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

       p.innerHTML = data;

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

    };

    //监听postMessage消息事件

    if (typeof window.addEventListener != 'undefined') {

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

    } else if (typeof window.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之类的繁琐方法。严重推荐你们练习下该方法,目前的确存在浏览器差别问题,但相信之后会成为主流跨域通讯方案。

相关文章
相关标签/搜索