码迷,mamicode.com
首页 > Web开发 > 详细

html5 postMessage 实现类似 sendMessage 的同步效果,支持跨域

时间:2018-04-07 19:00:59      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:content   syn   cms   on()   跨域   dex   call   log   class   

实现一个客户端发送 “1+2“ 跨域的另一个页面中,回调返回”3“的场景。

客户端:请在 http://127.0.0.1/pk/index.html 打开

<html>
        <meta charset="utf-8" />
    <head>
        <title>
            测试页面, http://127.0.0.1/pk/index.html
        </title> 

    </head>
    <body>

        <iframe id="database" src="http://localhost/pk/database.html">
           
        </iframe>
        <script type="text/javascript">

            function SyncMessageClient(win,domain){
                var funName = 0;
                var scope = {};
                function getNextCallbackName(callback){
                    var retfunc = "cb_" + (funName++);
                    scope[retfunc] = function(){
                        callback.apply(win,arguments);
                    }

                    return retfunc;
                }

                window.addEventListener("message",function(ev){
                    var rdata = JSON.parse(ev.data);
                    var fn = scope[rdata.fn];
                    
                    fn(rdata.args);
                    delete scope(rdata.fn);
                })

                this.sendMessage = function(targetWindow,data,callback,targetDomain){
                    var callData = {data:data,fn:getNextCallbackName(callback)};
                    targetWindow.postMessage(JSON.stringify(callData),targetDomain);
                }
            };

            function SyncMessageServer(win,domain,onSendMessage){
                window.addEventListener("message",function(ev){
                    var json = JSON.parse(ev.data);
                    var fn = json.fn;
                    console.dir(json);
                    ev.data = JSON.stringify(json);
                    var result = onSendMessage(ev);
                    ev.source.postMessage(
                    JSON.stringify({fn:fn,args:[result]}),"*");               
                      
                });                    
            }



        var objSyncMsg = new SyncMessageClient(window,"*");

            
            function send(data,callback,domain){
                var databaseWindow = document.getElementById("database").contentWindow;
                objSyncMsg.sendMessage(databaseWindow,"1+2",function(ok){
                    alert(ok);
                },"*");

               
            
            }
        </script>

        <input type="button" value="click me" onclick="send()"></input>
    </body>
</html>

  

服务的实现:

<html>
    <meta charset="utf-8" />
<head>
    <title>
        存储页面
    </title>

</head>

<body>

    <script type="text/javascript">

        function SyncMessageServer(win,domain,onSendMessage){
                window.addEventListener("message",function(ev){
                    var json = JSON.parse(ev.data);
                    var fn = json.fn;
                    ev.data = JSON.stringify(json);
                    var result = onSendMessage(ev);
                    ev.source.postMessage(
                    JSON.stringify({fn:fn,args:[result]}),"*");               
                      
                });                    
            }

        var sendMessageServer = new SyncMessageServer(window,"*", function (ev) {
            var json = JSON.parse(ev.data);
            var fn = json.fn;
            var result = eval(json.data)
            return result;
        })
    </script>
</body>

</html>

  

html5 postMessage 实现类似 sendMessage 的同步效果,支持跨域

标签:content   syn   cms   on()   跨域   dex   call   log   class   

原文地址:https://www.cnblogs.com/evlon/p/8734019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!