`

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

阅读更多

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

 

HTML5的window.postMessage简述

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

 

.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之类的繁琐方法。严重推荐大家练习下该方法,目前的确存在浏览器差异问题,但相信以后会成为主流跨域通信方案。

 

分享到:
评论
2 楼 yiway 2014-09-22  
如果是跨域的话,window.parent是拒绝访问的(由于window和window.parent属于不同的域),因此使用window.parent.frames[1].postMessage(message, '*');来发送消息,也是不可能的。
1 楼 yiway 2014-09-22  
如果是跨域的话,window.parent是决绝访问的(由于window和window属于不同的域),因此使用window.parent.frames[1].postMessage(message, '*');来发送消息,也是不可能的。

相关推荐

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

    JavaScript利用window.postMessage实现跨域通信,首先需要了解的是同源策略:当两个页面具有相同的协议、端口和主机名时,我们说这两个页面具有相同的源。同源策略是一种安全机制,它限制了不同源之间的文档或脚本间...

    详解HTML5 window.postMessage与跨域

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

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

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

    iframe+postMessage实现跨域通信

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

    解决window.showModalDialog跨域返回值

    在JavaScript中,`window.showModalDialog`是一个古老但仍然有用的函数,用于打开一个模态...因此,对于新项目,更推荐使用现代的API,如`window.postMessage`进行跨域通信,或者考虑采用服务器端代理等其他解决方案。

    iframe跨域通信--html5.postmessage

    在HTML5中,`iframe`跨域通信是一个重要的特性,它允许不同的源(域名、协议或端口)之间进行安全的数据交换。`postMessage` API是实现这一功能的关键,为了解决传统`iframe`跨域限制的问题,提供了一种安全且灵活的...

    postMessage-l10n:使用 window.postMessage 进行本地化的性能测试集合

    `window.postMessage`是HTML5引入的一个功能,允许来自不同源的脚本通过消息传递机制安全地进行通信。这一API解决了跨域问题,使得页面或框架之间可以安全地交换数据,对于多语言环境下的动态内容更新尤为适用。在...

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

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

    js弹窗并返回值(window.open方式)

    这种方式可以跨域通信,是现代浏览器中实现窗口间通信的一种常见方法。 综上所述,`window.open`方法在JavaScript中提供了强大的功能,可以创建弹窗并实现与原窗口的交互。通过合理的事件监听和通信机制,我们可以...

    H5 postMessage 实现iframe 跨域传递数据

    HTML5的`postMessage`解决了前端开发中的跨域通信难题,使得在iframe、窗口之间以及Web Workers中的数据传递变得安全且简单。正确理解和使用`postMessage`,对于构建现代Web应用至关重要。通过深入学习和实践,...

    html5 API postMessage 实现消息跨域推送

    使用`postMessage`进行跨域通信的基本步骤如下: 1. **发送消息**:在发送者窗口中,调用`window.postMessage()`方法,传入要发送的数据和目标窗口的引用。例如: ```javascript var targetWindow = window.open...

    html5 API postMessage跨域详解.pdf

    HTML5的`postMessage` API是为了解决Web应用程序之间的跨域通信问题而引入的。在传统的Web开发中,由于浏览器的同源策略限制,不同源的页面无法直接交互,但`postMessage`提供了一种安全的方式,允许来自不同源的...

    WKWebViewJS调用OC Demo

    方法名.postMessage("这是传给OC的参数"); } </html> ``` 当用户点击按钮时,JavaScript会调用`callOC`函数,向OC发送消息,OC的`userContentController:didReceiveScriptMessage:`代理方法会被触发,从而接收到...

    layer弹窗:top.layer弹窗到父页面跨域解决办法

    `window.postMessage()`方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文档的消息传递,即跨域通信。它的工作原理是:一个窗口向其打开的子窗口、其父窗口或者任何其他与之有某种关系的窗口发送...

    什么是跨域解决方案有哪些.docx

    通过使用 postMessage,可以实现跨域通信。 六、 跨域资源共享(CORS) 通过设置 HTTP 头,可以实现跨域资源共享。 七、 nginx 代理跨域 通过使用 nginx 代理,可以实现跨域通信。 八、 nodejs 中间件代理跨域 ...

    跨域问题 之 window.name

    标题提到的“跨域问题之window.name”是指在处理跨域通信时,开发者利用`window.name`属性来传递数据的一种策略。这种技术主要应用于iframe之间的通信,因为浏览器的同源策略限制了不同源的页面直接交互,但`window....

Global site tag (gtag.js) - Google Analytics