首頁 > 軟體

Vue中iframe 結合 window.postMessage 實現跨域通訊

2022-12-31 14:01:09

一、前言

什麼是iframe

iframe 元素會建立包含另外一個檔案的內聯框架(即行內框架)。

什麼是postMessage

window.postMessage() 方法可以安全地實現跨源通訊。通常,對於兩個不同頁面的指令碼,只有當執行它們的頁面位於具有相同協定(通常為https),埠號(443https的預設值),以及主機 (兩個頁面的模數 Document.domain設定為相同值) 時,這兩個指令碼才能相互通訊。window.postMessage() 方法提供了一種受控機制來規避此限制,只要正確的使用,這種方法就很安全。

二、應用場景

在一個專案的頁面中嵌入另一個專案的頁面,需要實現父子,子父頁面的通訊。

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 實現父子頁面通訊

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

我們首先要獲取到iframecontentWindow屬性放到mounted勾點函數中。

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

目標源寫成 * ,具備了兩個必要引數,我們就可以開始使用postMessage了。

2.3 子頁面向父頁面傳值

在這個專案中,我需要在點選login按鈕(子頁面),並且登陸成功後在父頁面中隱藏登入模組。

父頁面如何才能知道使用者點選了子頁面按鈕?

postMessage只是一個溝通的橋樑。

子頁面說話,父頁面需要聽到。所以我們在父頁面的mounted函數中寫一個監聽。

mounted() {
    window.addEventListener('message', this.handleMessage);
    this.iframeWin = this.$refs.iframe.contentWindow;
},

下面為完整程式碼

子頁面程式碼:

 submit() {
   // 向父vue頁面傳送資訊
   window.parent.postMessage({
     data: {
       code:"success",
       test:"我是子頁面的test!"
     }
   }, '*');
 }

 submit() {
   // 向父vue頁面傳送資訊
   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內部傳資料
   this.iframeWin.postMessage({
   cmd: 'success',
   data: "我是來自父頁面的data!"
}, '*')

子頁面監聽同理。

三、拓展閱讀

postMessage的兩種使用方式

到此這篇關於Vue中iframe 結合 window.postMessage 實現跨域通訊的文章就介紹到這了,更多相關vue iframe 跨域通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com