美文网首页我爱编程
优雅的使用XDM(跨文档消息传递)

优雅的使用XDM(跨文档消息传递)

作者: Weastsea | 来源:发表于2018-04-16 16:58 被阅读0次

    问题

    如何才能使两个甚至多个不同域的系统在一个页面进行通信呢?
    在工作中,老板交给我一个任务,他需要2个甚至多个不同域的系统集成在一个页面上,并进行信息的交换与传递,找了很多资料,最终发现可以通过这个方法简单来实现

    跨文档消息传递

    指的是在不同域的页面间传递消息,例如在http://www.xxx.com域中的某个页面中与其内嵌框架中的http://www.yyy.com域中 页面进行通信。XDM 的核心是 postMessage()方法。其作用是向另一个地方传递数据,‘‘另一个地方’’指的是包含在当前页面中的<iframe>元素。
    postMessage()方法接收两个参数:一条消息和消息接收方地址字符串。第二个参数对保障安全通信非常重要,可以防止浏览器把消息发送到不安全的地方。

    var iframe = document.getElementById("myFrame")
    iframe.postMessage("hello, postMessage", "http://www.yyy.com")
    

    iframe内嵌里面的页面接收到XDM消息时,会触发window对象的message事件,这个事件以异步的形式触发,执行时,可能会延迟。触发message事件后,事件对象包含以下2个重要信息:

    1. data: 作为postMessage()第一个参数传入的字符串数据
    2. origin:发送消息的文档所在域

    http://www.yyy.com域中的页面进行监听

     window.addEventListener('message', function (event) {
         // 确保发送消息的域是已知的域 
        if(event.origin === "http://www.xxx.com") {
              handler(event.data) // 处理数据'hello, postMessage'
        }
    })
    

    实例演示

    假如这个页面是http://www.xxx.com域中的某个页面(请根据实际情况命名,这里只是用作演示之用)

    <!DOCTYPE html>
    <html>
    <head>
        <title>Cross Document Messaging Example</title>
    </head>
    <body>
        <div id="status"></div>
        <div>
            <input type="text" id="message" size="40"><input type="button" id="btn" value="Send to iframe">
        </div>
        <iframe width="400" height="300" id="inner" src="http://www.yyy.com"></iframe>
        
        <script>
       //注册message事件,接收来至http://www.yyy.com的信息
        window.addEventListener('message', function (event)) {
            var status = document.getElementById("status");
            if(event.origin == "http://www.yyy.com") {
                status.innerHTML = "iframe said: " + event.data;        
             }
        });
       //从http://www.xxx.com发送消息
        document.getElementById("btn").onclick = function (evnet) {
            var message = document.getElementById("message").value,
                innerWindow = document.getElementById("inner").contentWindow;
                
            if (innerWindow.postMessage){
                innerWindow.postMessage(message, "http://www.yyy.com");  
            } else {
                alert("Your browser doesn't support Cross Document Messaging.");
            }
            
        });
        </script>
    </body>
    </html>
    

    假设以下这个页面是http://www.yyy.com的某个页面(是www.xxx.com的内嵌页面)

    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
        <div id="status"></div>
        <div>
            <input type="text" id="message" size="40"><input type="button" id="btn" value="Send to parent">
        </div>
        <script>
        //注册message事件,接收来至"http://www.xxx.com"的信息
        window.addEventListener("message", function (event) {
            var status = document.getElementById("status");
            if(event.origin == "http://www.xxx.com"){
                status.innerHTML = "parent said: " + event.data;        
            }
        });
        // 发送消息
        document.getElementById("btn").onclick = function (event) {
            var message = document.getElementById("message").value  
            if (parent.postMessage){
                parent.postMessage(message, "http://www.xxx.com")
            } else {
                alert("Your browser doesn't support Cross Document Messaging.");
            }
            
        });
        </script>
    </body>
    </html>
    

    网页效果展示:


    向内嵌页面发送数据
    内嵌页面向父页面发送数据

    相关文章

      网友评论

        本文标题:优雅的使用XDM(跨文档消息传递)

        本文链接:https://www.haomeiwen.com/subject/eidekftx.html