問題:
對於跨域問題,研究了一下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>
這樣我們就可以接收任何窗口傳遞來的消息了!
我們運行一下:
這樣就實現了跨域、跨窗口消息傳遞