`

利用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发送消息
var message = 'hello,RIA之家!   ' + (new Date().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时就会触发这个事件。
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之类的繁琐方法。严重推荐大家练习下该方法,目前的确存在浏览器差异问题,但相信以后会成为主流跨域通信方案。
分享到:
评论

相关推荐

    HTML5如何用window.postMessage在网页间传递数据

    估计很少人知道HTML5 APIS里有一个window.postMessage API。window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息。基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个...

    JavaScript使用HTML5的window.postMessage实现跨域通信例子

    主要介绍了JavaScript使用HTML5的window.postMessage实现跨域通信例子,需要的朋友可以参考下

    详解HTML5 window.postMessage与跨域

    本篇将详细阐述HTML5 window.postMessage,借助postMessage API,文档间可以以安全可控的方式实现跨域通信,第三方JavaScript代码也可以与iframe内加载的外部文档进行通信。 HTML5 window.postMessage API HTML5 ...

    iframe+postMessage实现跨域通信

    iframe+postMessage实现跨域通信 window.postMessage()方法安全地启用Window对象之间的跨源通信;例如,在页面和它产生的弹出窗口之间,或者在页面和嵌入其中的iframe之间。 

    详解html5 postMessage解决跨域通信的问题

    postmessage解析HTML5提供了新型机制PostMessage实现安全的跨源通信. 语法 otherWindow.postMessage(message, targetOrigin, [transfer]); otherWindow: 其他窗口的一个引用, 比如IFRAME的contentWindow属性, 执行,...

    html5通过postMessage进行跨域通信的方法

    最近工作中遇到一个需求,场景是:h5页作为预览模块内嵌在pc页中,用户在pc页中能够做一些操作,然后...otherWindow.postMessage(message, targetOrigin, [transfer]); otherWindow是目标窗口的引用,在当前场景下就是i

    HTML5中使用postMessage实现两个网页间传递数据

    估计很少人知道HTML5 APIS里有一个window.postMessage API。window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息。基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个...

    HTML5中使用postMessage实现Ajax跨域请求的方法

     这里不细说这几种方法,记录的是HTML5的window.postMessage。postMessage兼容IE8+、Firefox、Opera、Safari、Chrome。 需要两个异域的服务器来做测试,当然也可以用本地和线上服务器作为两个异域的服务器。假如...

    html5关于外链嵌入页面通信问题(postMessage解决跨域通信)

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

    postMessage-demo:使用postMessage进行iframe通信

    window.postMessage()方法可以安全地启用对象之间的跨域通信。 例如,在页面与其产生的弹出窗口之间,或在页面与嵌入其中的iframe之间。 通常,只有并且当它们源自的页面共享相同的协议,端口号和主机时,才允许...

    使用iframe+postMessage实现页面跨域通信的示例代码

    经常会利用iframe在一个父页面中嵌入另外一个子页面,或者在一个父页面中弹出另一个页面,由于同源策略的限制,父子页面之间的脚本无法实现通信,而使用postMessage方法就实现了父子页面之间的跨域信息传递。...

    详解使用postMessage解决iframe跨域通信问题

    这周碰到一个让人头疼的需求:要在我的web项目中嵌入另一个第三方web...在window对象下有个postMessage方法,是专门用来解决跨域通信问题的。 关于postMessage的详细介绍请戳这里,不过MDN的文档太详细了,导致有些同学

    JS实现iframe中子父页面跨域通讯的方法分析

    在非跨域的情况下,iframe中的子父页面可以很方便的通讯,但是在跨域的情况下,只能通过window.postMessage()方法来向其他页面发送信息,其他页面要通过window.addEventListener()监听事件来接收信息; #跨域发送...

    使用HTML5中postMessage知识点解决Ajax中POST跨域问题

    postMessage是HTML5为解决js跨域问题而引入的新的API,允许多个iframe/window跨域通信。 HTML5中提供了在网页文档之间相互接收与发送信息的功能。使用这个功能,只要获取到网页所在窗口对象的实例,不仅仅同源(域+...

    cross-domain-events:类似事件的 api,用于 postMessage 在跨域框架之间发送对象

    跨域事件用于跨域通信的 postMessage 类事件接口。 postMessage 在 Internet Explorer 8 中实现,但仅支持发送文本字符串。 现代浏览器可以发送对象,但如果您想监听不同类型的对象,您必须实现自己的委托。例子 // ...

    html父子页面iframe双向发消息的实现示例

    postMessage方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。 语法: otherWindow.postMessage(message, targetOrigin, [transfer]); otherWindow:其他窗口的引用...

    PostEvent:跨域事件处理程序javascript库。 纯香草JS,无依赖性

    功能集跨域如果iFrame不共享相同的原始URL,或者标头未设置为允许跨域通信,则默认情况下无法进行事件处理。 因此,该库使用postMessage API启用通信,并保留了与常规事件处理相同的功能。方法链如果愿意,可以按照...

Global site tag (gtag.js) - Google Analytics