使用 postMessage() 方法實(shí)現(xiàn)跨域通信

由于同源策略存在,javascript 的跨域一直都是一個(gè)棘手的問題

父頁面無法直接獲取 iframe 內(nèi)部的跨域資源;同時(shí),iframe 內(nèi)部的跨域資源也無法將信息直接傳遞給父頁面

下面我來簡單介紹下父子之間通信的方式, 以 Vue 項(xiàng)目為例

父傳子

  • 父頁面
<template>
  <div class="test">
    <!-- 通過 iframe 嵌入子頁面 -->
    <iframe ref="iframe" src="http://localhost:8082/#/home"></iframe>
  </div>
</template>

<script>
export default {
  mounted() {
    let iframe = this.$refs.iframe;
    // 必須等 iframe 加載完畢后再發(fā)送消息,否則子頁面接收不到數(shù)據(jù)
    iframe.onload = () => {
      // 通過 postMessage(data, 子頁面協(xié)議+域名+端口號) 發(fā)送數(shù)據(jù)
      iframe.contentWindow.postMessage({
        name: 'wells'
      }, 'http://localhost:8082');
    }
  }
};
</script>
  • 子頁面
<script>
export default {
  mounted() {
    // 接收父頁面?zhèn)鬟f的數(shù)據(jù)
    window.addEventListener('message', evt => {
      // 判斷是否為父頁面?zhèn)鬟^來的
      if (evt.origin !== 'http://localhost:8080') return;
      console.log(evt.data); // {name: 'wells'}
    }, false); 
  }
};
</script>

子傳父

  • 子頁面
<script>
export default {
  mounted() {
    // 通過 postMessage(data, 子頁面協(xié)議+域名+端口號) 發(fā)送數(shù)據(jù)
    window.parent.postMessage({
      age: 24
    }, 'http://localhost:8080');
  }
};
</script>
  • 父頁面
<template>
  <div class="test">
    <!-- 通過 iframe 嵌入子頁面 -->
    <iframe ref="iframe" src="http://localhost:8082/#/home"></iframe>
  </div>
</template>

<script>
export default {
  mounted() {
    // 接收子頁面?zhèn)鬟f的數(shù)據(jù)
    window.addEventListener('message', evt => {
      // 判斷是否為子頁面?zhèn)鬟^來的
      if (event.origin !== 'http://localhost:8082') return;
      console.log(evt.data); // {age: 24}
    }, false);
  }
};
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:安靜de沉淀https://segmentfault.com/a/1190000011145364 什么是跨...
    layjoy閱讀 1,391評論 1 8
  • 做個(gè)收錄,方便以后復(fù)盤。本文轉(zhuǎn)自:前端常見跨域解決方案(全)。 什么是跨域? 跨域是指一個(gè)域下的文檔或腳本試圖去請...
    貴在隨心閱讀 451評論 0 1
  • 什么是跨域? 跨域是指一個(gè)域下的文檔或腳本試圖去請求另一個(gè)域下的資源,這里跨域是廣義的。 廣義的跨域: 其實(shí)我們通...
    CodeMT閱讀 289評論 0 2
  • 好句摘抄 51、有人——慚愧,我不記得是誰了——曾經(jīng)寫過這樣的話,說所有的小說其實(shí)都是信件,專寫給一個(gè)人看的。我碰...
    董瑄100514閱讀 210評論 0 0
  • 人常說師者“桃李滿天下,春暉遍四方”,教出的優(yōu)秀學(xué)子很多。的確如此,每屆都有些突出的學(xué)子會(huì)讓人印象深刻,但...
    唯麗閱讀 362評論 0 11

友情鏈接更多精彩內(nèi)容