html5 postMessage解決跨域、跨窗口消息傳遞


問題:

對於跨域問題,研究了一下html5的postMessage,寫了代碼測試了一下,感覺html5新功能就是好用啊。
此文僅使用html5的新特性postMessage,演示其執行過程和效果:

方法解釋:
postMessage()方法允許來自不同源的腳本采用異步方式進行有限的通信,可以實現跨文本檔、多窗口、跨域消息傳遞。
postMessage(data,origin)方法接受兩個參數:
1.data:你需要傳遞的消息,消息傳遞的格式有一定要求:參數可以是JavaScript的任意基本類型或可復制的對象,然而並不是所有瀏覽器都做到了這點兒,部分瀏覽器只能處理字符串參數,所以建議直接傳遞string類型參數。json格式使用JSON.stringify()方法對對象參數序列化,在低版本IE中引用json2.js可以實現類似效果。
2.origin:該參數指明目標窗口的源。postMessage()方法只會將message傳遞給指定窗口,也可以設置為"*",表示可以傳遞給任意窗口。

原理:

1.我的頁面是parent.html,接收我發送的消息並按照要求返回消息的頁面是child.html;

2.兩個頁面放在同一個文件夾內;

3.parent.html發送postMessage消息給child.html,child.html收到消息后通過source.postMessage返回所需信息!

 

具體過程如下:

我的頁面是parent.html:

<html>
<div>
    <iframe id="child" src="./child.html"></iframe>
</div>
<script type="text/javascript">
    window.addEventListener('message',function(e){
        alert("msg from child:" + e.data);
    });
    window.onload=function(){//頁面加載完即向iframe發送消息
        //var tmp = document.getElementById("child");
        //tmp.postMessage('hello babi','*');  //此處tmp沒有postMessage方法,類型錯誤。
        //alert(tmp); //這是object HTMLIFrameElement類型
        //alert(window.frames[0]);  //這是object Window類型
        //以上方式不可行,只有window類型才能調用postMessage方法!
        window.frames[0].postMessage('hello babi','*');
    }
</script>
</html>

中間的文字全都來自child.html!

 

我們看看接收消息頁面child.html:

parent頁面向child頁面發送了消息,那么在child頁面上如何接收消息呢,監聽window的message事件就可以

<html>
<p id="ll1">I'm child</p>
<p id="ll2">I'm child</p>
<p id="ll3">I'm child</p>
<p id="ll4">I'm child</p>
<script type="text/javascript">
    window.addEventListener('message',function(e){//接收信息后返回信息!
        alert("msg from parent:" + e.data);
        e.source.postMessage('Hello papi', "*");
    });
</script>
</html>

這樣我們就可以接收任何窗口傳遞來的消息了!

我們運行一下:

這樣就實現了跨域、跨窗口消息傳遞

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM