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

     

  • 相关阅读:
    DbUtil组件及C3P0数据库连接池组件的使用
    servlet过滤器
    JDBC实现往MySQL插入百万级数据
    学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
    一种c#深拷贝方式完胜java深拷贝(实现上的对比)
    JSP三个指令及9个内置对象
    java web工程的错误页面的简单配置
    理解java Web项目中的路径问题
    web应用程序servlet的映射名称的规则及请求过程
    tomcat上servlet程序的配置与处理servlet请求过程
  • 原文地址:https://www.cnblogs.com/grefr/p/5046293.html
Copyright © 2011-2022 走看看