摘要:小結(jié)小結(jié)本文主要是介紹了一個(gè)方案及其使用方法,來解決父窗體與子窗體的通信問題。同時(shí)提供了一個(gè)完整的實(shí)例,可以實(shí)現(xiàn)子窗體向父窗體傳遞消息,父窗體通過監(jiān)聽消息事件,來獲取子窗體消息的目的。
歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~
本文由前端林子發(fā)表于云+社區(qū)專欄
本文主要會(huì)介紹如何基于MessengerJS,實(shí)現(xiàn)iframe父窗體與子窗體間的通信,傳遞數(shù)據(jù)信息。同時(shí)本文會(huì)提供一個(gè)可運(yùn)行的實(shí)例代碼,實(shí)現(xiàn)在父窗體中,獲取到來自子窗體的數(shù)據(jù)的效果。
(1)需要在當(dāng)前的前端項(xiàng)目中,使用iframe嵌套別的站點(diǎn)頁面。
(2)當(dāng)子窗體觸發(fā)了一個(gè)事件后,要給父窗體傳一個(gè)跳轉(zhuǎn)地址的url。父窗體監(jiān)聽到這個(gè)事件后,根據(jù)接收到的url,來更新當(dāng)前父窗體的url,實(shí)現(xiàn)頁面的跳轉(zhuǎn)。
可以采用MessengerJS方案,該方案可以實(shí)現(xiàn)父窗體與iframe之間的通信、多個(gè)iframe之間的通信。不過要前提是要確保對(duì)不同域的頁面有修改權(quán)限,并且父窗體、子窗體頁面都要同時(shí)加載這個(gè)MessengerJS。
(1) 在需要通信的父窗體、和子窗體的文檔中,都需要引入MessengerJS。
(2) 父窗體和子窗體各自的文檔(document)中,都需要自己的Messenger與其他文檔通信,父窗體和子窗體的window對(duì)象都對(duì)應(yīng)著有且僅有一個(gè)Messenger對(duì)象,該Messenger對(duì)象會(huì)負(fù)責(zé)當(dāng)前window的所有通信任務(wù)。因此,每個(gè)Messenger對(duì)象都需要唯一的名字,這樣它們之間才可以知道是在跟誰通信。另外,MessengerJS方案推薦指定項(xiàng)目名稱,(類似命名空間的作用),以增強(qiáng)代碼健壯性與組件復(fù)用性,避免未來與其他項(xiàng)目沖突。(注意: 項(xiàng)目名稱應(yīng)使用字符串類型)
父窗體與子窗體初始化Messenger對(duì)象:
// 父窗口中 - 初始化Messenger對(duì)象
// 推薦指定項(xiàng)目名稱, 避免Mashup類應(yīng)用中, 多個(gè)開發(fā)商之間的沖突
var messenger = new Messenger("Parent", "projectName");
// iframe中 - 初始化Messenger對(duì)象
// 注意! Messenger之間必須保持項(xiàng)目名稱一致, 否則無法匹配通信
var messenger = new Messenger("iframe1", "projectName");
// 多個(gè)iframe, 使用不同的名字
var messenger = new Messenger("iframe2", "projectName");
(3) 在發(fā)現(xiàn)消息前,目標(biāo)文檔要確保已經(jīng)監(jiān)聽了消息事件:
messenger.listen(function(msg){
alert("收到消息: " + msg);
});
(4) 父窗體想給子窗體發(fā)信息,要添加消息對(duì)象,明確告知當(dāng)前的父窗體,要發(fā)送消息的子窗體的window引用與messenger對(duì)象的名字:
// 父窗口中 - 添加消息對(duì)象, 明確告訴父窗口iframe的window引用與名字
messenger.addTarget(iframe1.contentWindow, "iframe1");
// 父窗口中 - 可以添加多個(gè)消息對(duì)象
messenger.addTarget(iframe2.contentWindow, "iframe2");
(5) 發(fā)消息時(shí),要指定messenger的名字和消息,例如父窗體要給子窗體發(fā)消息:
// 父窗口中 - 向單個(gè)iframe發(fā)消息
messenger.targets["iframe1"].send(msg1);
messenger.targets["iframe2"].send(msg2);
// 父窗口中 - 向所有目標(biāo)iframe廣播消息
messenger.send(msg);
基于上面的介紹,下面要實(shí)現(xiàn)開篇提出的需求了(實(shí)例代碼只是示例如何傳遞數(shù)據(jù),沒有更改父窗體url)。這里分別是父窗體和子窗體的代碼實(shí)現(xiàn),可直接在瀏覽器中打開查看效果,其中messenger.js可以在這里下載,放到項(xiàng)目目錄下。
父窗體:
父窗體
這是父窗體
子窗體:
子窗體
這是子窗體
代碼解釋:
父窗體中嵌入iframe,要先引入messenger.js,同時(shí)初始化messenger到一個(gè)統(tǒng)一的項(xiàng)目中,其中第一個(gè)參數(shù)為自己頁面messenger對(duì)象的名字,第二個(gè)參數(shù)為項(xiàng)目名稱;然后父窗體要綁定監(jiān)聽消息事件,當(dāng)接收到iframe子窗體發(fā)來的消息后執(zhí)行。
子窗體也要先引入messenger.js,同時(shí)初始化一個(gè)messenger到一個(gè)統(tǒng)一的項(xiàng)目中,其中第一個(gè)參數(shù)為自己頁面messenger對(duì)象的名字,第二個(gè)參數(shù)為項(xiàng)目名稱;然后添加消息對(duì)象,告知子窗體的window引用與messenger對(duì)象的名字。然后在觸發(fā)onclick事件時(shí),向父窗口傳遞消息。發(fā)消息時(shí),要指定接收消息的父窗體的messenger的名字,以及傳遞的消息。
本文主要是介紹了一個(gè)MessengerJS方案及其使用方法,來解決父窗體與子窗體的通信問題。同時(shí)提供了一個(gè)完整的實(shí)例,可以實(shí)現(xiàn)子窗體向父窗體傳遞消息,父窗體通過監(jiān)聽消息事件,來獲取子窗體消息的目的。如有問題,歡迎指正。
相關(guān)閱讀
【每日課程推薦】機(jī)器學(xué)習(xí)實(shí)戰(zhàn)!快速入門在線廣告業(yè)務(wù)及CTR相應(yīng)知識(shí)
此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,更多原文請(qǐng)點(diǎn)擊
搜索關(guān)注公眾號(hào)「云加社區(qū)」,第一時(shí)間獲取技術(shù)干貨,關(guān)注后回復(fù)1024 送你一份技術(shù)課程大禮包!
海量技術(shù)實(shí)踐經(jīng)驗(yàn),盡在云加社區(qū)!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/1538.html
摘要:作為對(duì)象屬性的文檔元素如果文檔中用屬性為元素命名。其就是交互窗口中的每個(gè)窗口窗體都是的執(zhí)行上下文。以對(duì)象作為全局對(duì)象,這樣的話,一個(gè)窗口窗體中的代碼可以應(yīng)用到其他窗口或者窗體并且同源策略沒有進(jìn)行阻止。 作為window對(duì)象屬性的文檔元素 如果html文檔中用id屬性為元素命名。并且如果 window對(duì)象沒有此名字的屬性,則window對(duì)象會(huì)賦予一個(gè)屬性,其名字為id屬性的值,其值指向該...
摘要:四通過跨域一個(gè)頁面嵌入一個(gè)外域的頁面雖然兩個(gè)窗體之前能獲取彼此的對(duì)象,但是卻拿不到上的屬性和方法,例如一個(gè)頁面嵌入一個(gè)的我是父窗體的方法嵌入的窗體跟的域名不同,很明顯是跨域的,雖然能獲取到對(duì)象,但是拿不到頁面的任何方法和屬性。 js跨域是指通過js在不同域之間進(jìn)行相互通信或者數(shù)據(jù)傳輸,只要協(xié)議,域名,端口號(hào)其中有一個(gè)不同,就是跨域。下面總結(jié)一下我了解到的常用的跨域方法。 一:通過jso...
function setIframeHeight(id){ try{ var iframe = document.getElementById(id); if(iframe.attachEvent){ iframe.attachEvent(onload, function(){ iframe.heigh...
摘要:實(shí)際上是一個(gè)讓出線程的標(biāo)志遇到會(huì)立即返回一個(gè)狀態(tài)的。一個(gè)簡(jiǎn)單的防抖函數(shù)如果定時(shí)器存在則清除重新開始定時(shí)執(zhí)行缺點(diǎn)只能在最后執(zhí)行,不能立即被執(zhí)行,在某些情況下不適用。假設(shè)壓入棧的所有數(shù)字均不相等。接收數(shù)據(jù)不受同源政策限制。 開始 盡管秋招還沒有拿到offer(好難過),但是一些知識(shí)點(diǎn)還是要總結(jié)的,既然自己選了這條路,那就一定要堅(jiān)定不移的走下去...... 注意 new 運(yùn)算符的優(yōu)先級(jí) fu...
摘要:什么是跨域我們先看下以下場(chǎng)景開啟兩個(gè)本地服務(wù)器,頁面為,其中嵌套了,頁面想使用頁面的數(shù)據(jù),例如調(diào)用它的方法,會(huì)報(bào)以下錯(cuò)誤如圖所示,,,譯為協(xié)議主機(jī)和端口號(hào)必須符合,否則,就是跨域??缬虻膸追N常見方案同源策略的限制范圍有以下幾種和無法讀取。 什么是跨域 我們先看下以下場(chǎng)景:開啟兩個(gè)本地服務(wù)器,頁面A為localhost:9800,其中嵌套了iframeB localhost:9000,頁...
閱讀 778·2023-04-26 01:30
閱讀 3326·2021-11-24 10:32
閱讀 2213·2021-11-22 14:56
閱讀 2021·2021-11-18 10:07
閱讀 583·2019-08-29 17:14
閱讀 653·2019-08-26 12:21
閱讀 3134·2019-08-26 10:55
閱讀 2982·2019-08-23 18:09