iframe子頁面與父頁面的通信早就被研究透徹了,之前一直沒有用到這個內容所以也沒有去研究,今天突然遇到一道題目,所以稍微試了一下,跨域通信使用了來自騰訊團隊給的messenger.js,原始碼也很簡單值的一看,官方給的demo很全面,這裡我只是給了一個簡單的例子。
<!DOCTYPE html><html><head><title>iframe子页面与父页面通信(同域)</title><meta charset="utf-8"><script type="text/javascript"> function sayHello(){ alert("iframeCommunication1.html"); } function say(){ child1.window.sayHello(); child1.window.document.getElementById("button_c").value = "the call is complete"; }</script></head><body><h1>iframe子页面与父页面同域通信</h1>调用子页面child1.html中的sayHello()函数:<input type="button" id="button_p" name="hello" value="call" onclick="say()"><br><br><iframe src="child1.html" id="child1"></iframe></body></html>
<!DOCTYPE html><html><head><title>iframe子页面与父页面通信(同域)</title><meta charset="utf-8"><script type="text/javascript"> function sayHello(){ alert("child.html"); } function say(){ parent.sayHello(); parent.window.document.getElementById("button_p").value = "the call is complete"; }</script></head><body><p>调用父页面iframeCommunication1.html中的sayHello()函数:</p><input type="button" id="button_c" name="hello" value="call" onclick="say()"></body></html>
對於IE8+及現代瀏覽器,跨域通訊主要使用了html5給出的postMessage API來實現域間通訊。 postMessage的功能是允許程式設計師跨網域在兩個視窗/frames間發送資料資訊。基本上,它就像是跨域的AJAX,但不是瀏覽器跟伺服器之間交互,而是在兩個客戶端之間通訊。
對於舊版瀏覽器,messenger.js使用了navigator物件在父視窗和iframe之間是共享的特性,在navigator物件上註冊訊息回呼函數實作訊息傳遞及共享。
下面給一個很簡單的例子:
<!DOCTYPE html><html><head><title>iframe子页面与父页面通信(跨域)</title><meta charset="utf-8"><script src="js/messenger.js"></script></head><body><h1>iframe子页面与父页面跨域通信</h1>向子页面child2.html发送信息:<input type="button" id="button_p" value="call" onclick="sendMessage('child2')"><br><br>获取信息:<pre id="output">