1. 程式人生 > >跨文檔消息傳遞 postMessage

跨文檔消息傳遞 postMessage

窗口 mark 註銷 event markdown on() span mage 所在

一、跨文檔消息傳遞

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{
        width: 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="width: 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{
        width: 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>

註意

轉載、引用,但請標明作者和原文地址

跨文檔消息傳遞 postMessage