Vue中iframe?結(jié)合?window.postMessage?實(shí)現(xiàn)跨域通信
一、前言
什么是iframe?
iframe 元素會(huì)創(chuàng)建包含另外一個(gè)文檔的內(nèi)聯(lián)框架(即行內(nèi)框架)。
什么是postMessage?
window.postMessage() 方法可以安全地實(shí)現(xiàn)跨源通信。通常,對(duì)于兩個(gè)不同頁面的腳本,只有當(dāng)執(zhí)行它們的頁面位于具有相同協(xié)議(通常為https),端口號(hào)(443為https的默認(rèn)值),以及主機(jī) (兩個(gè)頁面的模數(shù) Document.domain設(shè)置為相同值) 時(shí),這兩個(gè)腳本才能相互通信。window.postMessage() 方法提供了一種受控機(jī)制來規(guī)避此限制,只要正確的使用,這種方法就很安全。
二、應(yīng)用場(chǎng)景
在一個(gè)項(xiàng)目的頁面中嵌入另一個(gè)項(xiàng)目的頁面,需要實(shí)現(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引入端口號(hào)為8081的頁面:
src:"http://127.0.0.1:8081/#/Login",
那么問題就來了,嵌入的登錄模塊屬于子頁面(另一個(gè)項(xiàng)目,端口號(hào)8081)的東西,如何能讓我自己的頁面知道用戶點(diǎn)擊了藍(lán)色按鈕,達(dá)到登錄后隱藏登錄框的效果呢?在這里,postMessage就派上了用場(chǎng)。
2.2 postMessage 實(shí)現(xiàn)父子頁面通信
window.postMessage中的window在iframe中是指什么呢?

我們首先要獲取到iframe的contentWindow屬性放到mounted鉤子函數(shù)中。
mounted() {
this.iframeWin = this.$refs.iframe.contentWindow;
},目標(biāo)源寫成 * ,具備了兩個(gè)必要參數(shù),我們就可以開始使用postMessage了。
2.3 子頁面向父頁面?zhèn)髦?/h3>
在這個(gè)項(xiàng)目中,我需要在點(diǎn)擊login按鈕(子頁面),并且登陸成功后在父頁面中隱藏登錄模塊。
父頁面如何才能知道用戶點(diǎn)擊了子頁面按鈕?
postMessage只是一個(gè)溝通的橋梁。
子頁面說話,父頁面需要聽到。所以我們?cè)诟疙撁娴膍ounted函數(shù)中寫一個(gè)監(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內(nèi)部傳數(shù)據(jù)
this.iframeWin.postMessage({
cmd: 'success',
data: "我是來自父頁面的data!"
}, '*')子頁面監(jiān)聽同理。
三、拓展閱讀
到此這篇關(guān)于Vue中iframe 結(jié)合 window.postMessage 實(shí)現(xiàn)跨域通信的文章就介紹到這了,更多相關(guān)vue iframe 跨域通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Vue-Router 2實(shí)現(xiàn)路由功能實(shí)例詳解
vue-router 2只適用于Vue2.x版本,下面我們是基于vue2.0講的如何使用vue-router 2實(shí)現(xiàn)路由功能,需要的朋友可以參考下2017-11-11
基于vue2.0+vuex+localStorage開發(fā)的本地記事本示例
這篇文章主要介紹了基于vue2.0+vuex+localStorage開發(fā)的本地記事本示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
vue axios請(qǐng)求頻繁時(shí)取消上一次請(qǐng)求的方法
這篇文章主要介紹了vue axios請(qǐng)求頻繁時(shí)取消上一次請(qǐng)求的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
Vue.js每天必學(xué)之?dāng)?shù)據(jù)雙向綁定
Vue.js每天必學(xué)之?dāng)?shù)據(jù)雙向綁定,如何進(jìn)行綁定,如何進(jìn)行數(shù)據(jù)雙向綁定,感興趣的小伙伴們可以參考一下2016-09-09
vue 路由懶加載中給 Webpack Chunks 命名的方法
這篇文章主要介紹了在 vue 路由懶加載中給 Webpack Chunks 命名的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
keep-alive include和exclude無效問題及解決
這篇文章主要介紹了keep-alive include和exclude無效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

