溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue中iframe怎么結(jié)合window.postMessage實(shí)現(xiàn)跨域通信

發(fā)布時(shí)間:2023-01-03 10:25:40 來源:億速云 閱讀:170 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Vue中iframe怎么結(jié)合window.postMessage實(shí)現(xiàn)跨域通信”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“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)跨源通信。通常,對于兩個(gè)不同頁面的腳本,只有當(dāng)執(zhí)行它們的頁面位于具有相同協(xié)議(通常為https),端口號(443https的默認(rèn)值),以及主機(jī) (兩個(gè)頁面的模數(shù) Document.domain設(shè)置為相同值) 時(shí),這兩個(gè)腳本才能相互通信。window.postMessage() 方法提供了一種受控機(jī)制來規(guī)避此限制,只要正確的使用,這種方法就很安全。

二、應(yī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引入端口號為8081的頁面:

src:"http://127.0.0.1:8081/#/Login",

那么問題就來了,嵌入的登錄模塊屬于子頁面(另一個(gè)項(xiàng)目,端口號8081)的東西,如何能讓我自己的頁面知道用戶點(diǎn)擊了藍(lán)色按鈕,達(dá)到登錄后隱藏登錄框的效果呢?在這里,postMessage就派上了用場。

2.2 postMessage 實(shí)現(xiàn)父子頁面通信

window.postMessage中的windowiframe中是指什么呢?

Vue中iframe怎么結(jié)合window.postMessage實(shí)現(xiàn)跨域通信

我們首先要獲取到iframecontentWindow屬性放到mounted鉤子函數(shù)中。

mounted() {
  this.iframeWin = this.$refs.iframe.contentWindow;
},

目標(biāo)源寫成 * ,具備了兩個(gè)必要參數(shù),我們就可以開始使用postMessage了。

2.3 子頁面向父頁面?zhèn)髦?/h4>

在這個(gè)項(xiàng)目中,我需要在點(diǎn)擊login按鈕(子頁面),并且登陸成功后在父頁面中隱藏登錄模塊。

父頁面如何才能知道用戶點(diǎn)擊了子頁面按鈕?

postMessage只是一個(gè)溝通的橋梁。

子頁面說話,父頁面需要聽到。所以我們在父頁面的mounted函數(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)跨域通信”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI