zoukankan      html  css  js  c++  java
  • 跨文档消息传递 postMessage

    一、跨文档消息传递

    1. postMessage

    发送信息

    向当前页面的 <iframe> 元素传送数据

    // 接收方window对象.postMessage( "message", "接收方域名" ); 
    
    var iframeWindow = document.getElementById("myframe").contentWindow;  //contentWindow
    iframeWindow.postMessage("a secret","http://www.wrox.com"); //向内嵌框架发送消息
    

    接收信息

    该方法触发接收方 window 对象的 message 事件,并且传递个 onmessage处理程序的 event 包括以下三方面信息

    • data:postMessage()第一个参数传过来的 message,最好只传字符串 (结合: JSON.stringify(), JSON.parse())
    • origin: 发生消息的文档所在的域
    • source: 发送消息的文档的 window对象代理
    //接收到其他窗口发送过来的信息
    window.addEventListener("message", function(event){
        event.source.postMessage("收到",event.origin)  //向原窗口发送回执
    })
    

    2. 例子

    外层 top 窗口 和 内层 iframe 窗口可进行通信,top 窗口可发送消息给 iframe 窗口,iframe 在接受到消息后返回 'Ok' 作为回应;iframe 也可以发送信息给 window,不过为了避免两个窗口无限的互发 'Ok' 回应信息,top 窗口在收到信息后不给予回应。

    http://localhost:3000 域下页面代码

    <style>
        #textarea{
             300px;
            height: 100px;
        }
    </style>
    
    <body>
        <h1>TOP</h1>
        <p id="localOrigin"></p>
        <button id="button">发信息给 iframe</button><br/>
        <textarea id="textarea"></textarea>
        <div id="message"></div>
    
        <hr>
    
        <iframe id="iframe" src="https://czsheng.cn:8080/demo/iframe.html" frameborder="1" style=" 100%; height: 300px"></iframe>
    </body>
    <script>
        document.getElementById('localOrigin').innerHTML = '我的域名为:' + window.location.origin;
        window.addEventListener("message", function(event){
            var messageBox = document.getElementById("message");
            var msg = "【origin】:"  + event.origin + "<br/>"      // 收到发送方的消息及发送发所在的域
                    + "【message】:" + event.data + "<br/>"
            messageBox.innerHTML = msg
        
            // 因为 iframe 里面会在收到信息后返回 OK 信息,如果我这样也返回的话会造成循环,所以这里就注销掉了
            /* setTimeout(function(){
                event.source.postMessage("--------------------OK--------------------", event.origin)
            }, 1000) */
        })
        document.getElementById("button").addEventListener("click",function(){
            var ifm = document.getElementById("iframe").contentWindow    // 也可以通过 window.frames[0] 获取 iframe 的 window 对象
            var text = document.getElementById('textarea').value;
            ifm.postMessage(text, "https://czsheng.cn:8080")    // 向接收方窗口的 window 对象发送消息,指明接收方所在的域
        })
    </script>
    
    

    https://czsheng.cn:8080 域下页面代码

    <style>
        #textarea{
             300px;
            height: 100px;
        }
    </style>
    
    <body>
        <h1>Iframe</h1>
        <p id="localOrigin"></p>
        <button id="button">发送信息给 Top window</button><br/>
        <textarea id="textarea"></textarea>
        <div id="message"></div>
    </body>
    
    <script>
        document.getElementById('localOrigin').innerHTML = '我的域名为:' + window.location.origin;
    
        window.addEventListener("message", function(event){
            var messageBox = document.getElementById("message");
            var msg = "【origin】:"  + event.origin + "<br/>"
                    + "【message】:" + event.data + "<br/>"
            messageBox.innerHTML = msg
            setTimeout(function(){
                event.source.postMessage("--------------------OK--------------------", event.origin)
            }, 1000)
        })
        document.getElementById("button").addEventListener("click",function(){
            var text = document.getElementById("textarea").value;
            top.postMessage(text, "http://localhost:3000")
        })
    </script>
    </html>
    

    注意

    转载、引用,但请标明作者和原文地址

  • 相关阅读:
    命令行标签
    ts关键还是js 因为要编译成js
    nuxt axios
    vuecli3-ssr
    v-text
    这样竟然也可以水平居中 两个属性都必须
    纯CSS实现垂直居中的几种方法
    下图片异步变同步
    [Java] 扯淡系列_找工作流程 与 注意问题
    [Java] Spring3.0 Annotation
  • 原文地址:https://www.cnblogs.com/CccZss/p/8515845.html
Copyright © 2011-2022 走看看