美文网首页我爱编程
优雅的使用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