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