Vue中iframe?結合?window.postMessage?實現(xiàn)跨域通信
一、前言
什么是iframe
?
iframe
元素會創(chuàng)建包含另外一個文檔的內聯(lián)框架(即行內框架)。
什么是postMessage
?
window.postMessage()
方法可以安全地實現(xiàn)跨源通信。通常,對于兩個不同頁面的腳本,只有當執(zhí)行它們的頁面位于具有相同協(xié)議(通常為https
),端口號(443
為https
的默認值),以及主機 (兩個頁面的模數(shù) Document.domain
設置為相同值) 時,這兩個腳本才能相互通信。window.postMessage()
方法提供了一種受控機制來規(guī)避此限制,只要正確的使用,這種方法就很安全。
二、應用場景
在一個項目的頁面中嵌入另一個項目的頁面,需要實現(xiàn)父子,子父頁面的通信。
2.1 嵌入頁面
iframe
使用如下(端口為8080
):
<iframe id="myframe" name="myframe" :src="src" ref="iframe" scrolling="no" width="350px" height="350px" frameborder="0"></iframe>
在data
中定義src
引入端口號為8081的頁面:
src:"http://127.0.0.1:8081/#/Login",
那么問題就來了,嵌入的登錄模塊屬于子頁面(另一個項目,端口號8081)的東西,如何能讓我自己的頁面知道用戶點擊了藍色按鈕,達到登錄后隱藏登錄框的效果呢?在這里,postMessage
就派上了用場。
2.2 postMessage 實現(xiàn)父子頁面通信
window.postMessage
中的window
在iframe
中是指什么呢?
我們首先要獲取到iframe
的contentWindow
屬性放到mounted
鉤子函數(shù)中。
mounted() { this.iframeWin = this.$refs.iframe.contentWindow; },
目標源寫成 *
,具備了兩個必要參數(shù),我們就可以開始使用postMessage
了。
2.3 子頁面向父頁面?zhèn)髦?/h3>
在這個項目中,我需要在點擊login按鈕(子頁面),并且登陸成功后在父頁面中隱藏登錄模塊。
父頁面如何才能知道用戶點擊了子頁面按鈕?
postMessage
只是一個溝通的橋梁。
子頁面說話,父頁面需要聽到。所以我們在父頁面的mounted函數(shù)中寫一個監(jiān)聽。
mounted() { window.addEventListener('message', this.handleMessage); this.iframeWin = this.$refs.iframe.contentWindow; },
下面為完整代碼
子頁面代碼:
submit() { // 向父vue頁面發(fā)送信息 window.parent.postMessage({ data: { code:"success", test:"我是子頁面的test!" } }, '*'); } submit() { // 向父vue頁面發(fā)送信息 window.parent.postMessage({ data: { code:"success", test:"我是子頁面的test!" } }, '*'); }
父頁面代碼:
<div class="login" v-if="!loginStatus"> <iframe id="myframe" name="myframe" :src="src" ref="iframe" scrolling="no" width="350px" height="350px" frameborder="0"></iframe> </div> methods: { handleMessage (event) { const data = event.data.data if(data.code === "success"){ alert(data.test) } } } mounted() { window.addEventListener('message', this.handleMessage); this.iframeWin = this.$refs.iframe.contentWindow; },
2.4父頁面代碼:
sendMessage () { // 外部vue向iframe內部傳數(shù)據 this.iframeWin.postMessage({ cmd: 'success', data: "我是來自父頁面的data!" }, '*')
子頁面監(jiān)聽同理。
三、拓展閱讀
到此這篇關于Vue中iframe 結合 window.postMessage 實現(xiàn)跨域通信的文章就介紹到這了,更多相關vue iframe 跨域通信內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Vue-Router 2實現(xiàn)路由功能實例詳解
vue-router 2只適用于Vue2.x版本,下面我們是基于vue2.0講的如何使用vue-router 2實現(xiàn)路由功能,需要的朋友可以參考下2017-11-11基于vue2.0+vuex+localStorage開發(fā)的本地記事本示例
這篇文章主要介紹了基于vue2.0+vuex+localStorage開發(fā)的本地記事本示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02vue 路由懶加載中給 Webpack Chunks 命名的方法
這篇文章主要介紹了在 vue 路由懶加載中給 Webpack Chunks 命名的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04keep-alive include和exclude無效問題及解決
這篇文章主要介紹了keep-alive include和exclude無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11