html父子頁面iframe雙向發(fā)消息的實現(xiàn)示例

某天,領導提了一個需求,主頁面里面嵌套iframe,父子頁面雙向發(fā)送消息。然后我就提了一個方案: postMessage
知識理論準備:
postMessage方法允許來自不同源的腳本采用異步方式進行有限的通信,可以實現(xiàn)跨文本檔、多窗口、跨域消息傳遞。
語法:
otherWindow.postMessage(message, targetOrigin, [transfer]);
- otherWindow:其他窗口的引用,如 iframe的contentWindow、執(zhí)行window.open返回的窗口對象、或者是命名過或數(shù)值索引的window.frames。
- message:將要發(fā)送到其他window的數(shù)據(jù)。
- targetOrigin:指定那些窗口能接收到消息事件,其值可以是字符串 “*” 表示無限制,或者是一個URI。
- transfer:是一串和message同時傳遞的Transferable對象,這些對象的所有權將被轉移給消息的接收方,而發(fā)送方將不再保留所有權。
postMessage方法被調用時,會在所有頁面腳本執(zhí)行完畢之后像目標窗口派發(fā)一個 MessageEvent 消息,該MessageEvent消息有四個屬性需要注意:
- type:表示該message的類型
- data:為 postMessage 的第一個參數(shù)
- origin:表示調用postMessage方法窗口的源
- source:記錄調用postMessage方法的窗口對象
操作流程如下:
1.準備兩個頁面
- http://a.com/main.html 主頁面
- http://b.com/iframepage.html 嵌套頁面
main.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>iframe+postMessage 跨域通信 主頁面</title> </head> <body> <h1>主頁面</h1> <iframe id="child" src="http://b.com/iframepage.html"></iframe> <div> <h2>主頁面接收消息區(qū)域</h2> <span id="message"></span> </div> </body> </html>
iframepage.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>iframe+postMessage跨域通信 子頁面</title> </head> <body> <h2>子頁面</h2> <div> <h3>接收消息區(qū)域</h3> <span id="message"></span> </div> </body> </html>
2、父向子發(fā)送消息
main.html
<script> window.onload = function(){ document.getElementById('child') .contentWindow.postMessage("主頁面消息", "http://b.com/iframepage.html") } </script>
注意:
一定是頁面加載完成后在發(fā)送消息,否則會因為 iframe 未加載完成報錯。
Failed to execute ‘postMessage’ on ‘DOMWindow’
子頁面接收消息:
iframepage.html
<script> window.addEventListener('message',function(event){ console.log(event); document.getElementById('message').innerHTML = "收到" + event.origin + "消息:" + event.data; }, false); </script>
此時可看到頁面中,iframe的子頁面中打印了
收到http://a.com消息:主頁面消息`
以及控制臺打印了MessageEvent對象。
3、子向父發(fā)送消息
子頁收到消息后回復父頁面
iframepage.html
<script> window.addEventListener('message',function(event){ console.log(event); document.getElementById('message').innerHTML = "收到" + event.origin + "消息:" + event.data; top.postMessage("子頁面消息收到", 'http://a.com/main.html') }, false); </script>
父頁面收到消息并顯示:
window.addEventListener('message', function(event){ document.getElementById('message').innerHTML = "收到" + event.origin + "消息:" + event.data; }, false);
4、完整代碼
main.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>iframe+postMessage 跨域通信 主頁面</title> </head> <body> <h1>主頁面</h1> <iframe id="child" src="http://b.com/iframepage.html"></iframe> <div> <h2>主頁面接收消息區(qū)域</h2> <span id="message"></span> </div> </body> <script> window.onload = function(){ document.getElementById('child') .contentWindow.postMessage("主頁面消息", "http://b.com/iframepage.html") } window.addEventListener('message', function(event){ document.getElementById('message').innerHTML = "收到" + event.origin + "消息:" + event.data; }, false); </script> </html>
iframepage.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>iframe+postMessage跨域通信 子頁面</title> </head> <body> <h2>子頁面</h2> <div> <h3>接收消息區(qū)域</h3> <span id="message"></span> </div> </body> <script> window.addEventListener('message',function(event){ if(window.parent !== event.source){return} console.log(event); document.getElementById('message').innerHTML = "收到" + event.origin + "消息:" + event.data; top.postMessage("子頁面消息收到", 'http://a.com/main.html') }, false); </script> </html>
到此這篇關于html父子頁面iframe雙向發(fā)消息的實現(xiàn)示例的文章就介紹到這了,更多相關html父子頁面iframe雙向發(fā)消息內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!
相關文章
HTML阻止iframe跳轉頁面并使用iframe在頁面內嵌微信網(wǎng)頁版的實現(xiàn)方法
就想弄一個winform結合html5的一個小東西,突有心血來潮,想在里面嵌套一個微信網(wǎng)頁版,下面小編給大家介紹下HTML阻止iframe跳轉頁面并使用iframe在頁面內嵌微信網(wǎng)頁版的實2018-01-09- 這篇文章主要介紹了HTML中iFrame標簽的兩個用法,分別是作為彈出層鋪底覆蓋 ,和跨域寫入cookie,需要的朋友可以參考下2015-07-09
- 這篇文章主要介紹了html懸浮框架的設置使用示例(iframe加載html),需要的朋友可以參考下2014-04-16
HTML5 window/iframe跨域傳遞消息 API介紹
window.postMessage允許多個 window/frame之間跨域傳遞數(shù)據(jù)和信息。下面為大家介紹下window.postMessage的工作原理,以及如何在FireFox,IE8+,Opera,Safari和Chrome中使用2013-08-26html Frame、Iframe、Frameset 的區(qū)別
框架頁有Frame、Iframe、Frameset 3個標記,初學者容易將三者混淆,下面分別講解三者的區(qū)別。2009-11-26- 使用 iframe 可以輕易的調用其他網(wǎng)站的頁面,但應謹慎使用。它比創(chuàng)建其他 DOM 元素(包括 style 和 script)多耗費數(shù)十甚至數(shù)百倍的性能。增加100個不同元素的時間對比顯示2009-08-19
- iframe是框架的一種形式,也比較常用到。2009-04-23