zoukankan      html  css  js  c++  java
  • html5 postMessage

    hmtl5 推出postMessage后,在解决跨文档消息通信、及跨域请求数据的问题 时方便了很多。

    一、postMessage的使用方法: 

    otherWindow.postMessage(message, targetOrigin, [transfer]);
    参数含义:
    otherWindow:要接收信息页面的window的引用
    message: 要发送的信息,可以是string,也可以是object,具体的兼容性请看文章最后
    targetOrigin:标识要发向的哪个目标源,可以是一个url地址,也可是“*”表示不作限制
     
    另一个页面可以通过以下的方式监听message事件
    window.addEventListener("message", receiveMessage, false);
    
    function receiveMessage(event){
      if (event.origin !== "http://example.org:8080")
        return;
    
      // ...
    }

    二、postMessage实例

    下面我们用一个实例来看看postMessage的应用: 
    为了实现不同域之间的通信,需要在操作系统的 hosts 文件添加两个域名,进行模拟。
     
    代码1:hosts文件中添加两个不同的域名
    127.0.0.1     sx.daily.taobao.net
    127.0.0.1     sx.taobao.com

     

    在父网页中通过 iframe 嵌入子页面。

    代码2.
    <!DOCTYPE html>
    <html>
    <head>
        <title>门户页</title>
        <meta charset="utf-8"/>
    </head>
    <body>
    <div>
        输出的内容是:<span id="msg"></span>
    </div>
    <!-- 通过 iframe 嵌入子页面 -->
    <iframe id="widget" src="http://sx.daily.taobao.net/study/postMessage/chat.html" frameborder="0"></iframe>
    
    <script>
        var fromOrigin = "http://sx.daily.taobao.net";    //iframe来自的源
        function msgHandler(e){
            if(e.origin == fromOrigin){
                notify(e.data);
            }else{
                //忽视
            }
        }
        function notify(data){
            var msg = document.querySelector('#msg');
            msg.innerText = data.msg;
            console.log(data);
        }
        window.addEventListener('message',msgHandler,true);
    
    </script>
    </body>
    </html>

     

    在子窗口中监听 onmessage 事件,并在 JavaScript 代码中调用 postMessage 方法发送数据到父窗口
    代码3.
    <!DOCTYPE html>
    <html>
    <head>
        <title>聊天件</title>
        <meta charset="utf-8"/>
        <style>
            body{
                background: #fb0;
                height: 200px;
            }
        </style>
    </head>
    <body>
    <h2>chat页面</h2>
    <input id="txtCont" type="text" value=""/>
    <button id="btnSend">发送</button>
    <script>
       var targOrigin = "http://sx.taobao.com"; //要发向的目标源
    
        var btn = document.querySelector('#btnSend');
        var txt = document.querySelector('#txtCont');
        function sendMsg(){
            //支持情况 ie9及以上,注意,ie9只支持字符.部分ie8支持
            //chrome
            if(window.top.postMessage){
                //有些浏览器支持javascript对象,canvas imageData等数据类型
                //支持情况 ie9下不支持 ie9支持 postMessage的值为字符串,不支持对象。ie10及以上支持对象
                //如: {'msg':txt.value}
                var obj = {'msg':txt.value};
                // 通过 postMessage 向父窗口发送数据
                window.top.postMessage(obj,targOrigin);
            }
        };
        btn.addEventListener('click',sendMsg,true);
    
    </script>
    
    </body>
    </html>

    三、各个浏览器的支持情况 

    写完上面的demo后,我所它放到常用的浏览器里测试了一下兼容性:
    ie: 支持情况:
         ie8  我装的ie8不支持,但发现别的机器ie8支持。
         ie9  支持 postMessage的值为字符串,不支持对象。
         ie10 及以上支持对象
    chrome: 支持
    firefox: 支持
     
    后来发现有个网站可以查看html5的支持情况,测试结果如下:
     
  • 相关阅读:
    高可用——Keepalived安装部署使用详解
    Java—File类详解及实践
    MySQL—设置数据库(库、表等)不区分大小写
    MySQL—Mysql与MariaDB启停命令的区别
    Linux—微服务启停shell脚本编写模板
    SpringBoot—集成AOP详解(面向切面编程Aspect)
    Java—Map集合详解
    手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊
    Java高效编程:总结分享
    Redis的几种应用实战
  • 原文地址:https://www.cnblogs.com/summer_shao/p/3998695.html
Copyright © 2011-2022 走看看