如何實現iframe跨域通信

一、同源策略

同源策略是瀏覽器的一種安全策略,它可以防止一個源載入的文檔或腳本與來自另一個源的資源進行交互。同源是指協議、主機、埠號均相同。

因此,同源限制會導致iframe無法通過JavaScript來訪問其父頁面,除非兩者處於同一個源。

二、跨域問題

跨域是指在同一頁面下,一個域名的內容訪問了另一個域名的資源,這時瀏覽器會阻止這種行為。

解決跨域的方法有多種,其中iframe跨域通信就是一種。

三、iframe實現跨域通信

1、使用postMessage

postMessage是HTML5引入的一種新特性,用於在跨域的兩個窗口之間傳遞數據。

該方法基於事件模型,傳遞的消息只有在對方窗口正確響應的情況下,才能接收到。

// 父頁面代碼
var ifr = document.getElementById('childFrame');

ifr.contentWindow.postMessage('你好子窗口', 'http://www.child.com');

window.addEventListener('message', function(e) {
  if (e.origin === 'http://www.child.com') {
    console.log(e.data);
  }
}, false);
// 子頁面代碼
window.addEventListener('message', function(e) {
  if (e.origin === 'http://www.parent.com') {
    console.log(e.data);
    e.source.postMessage('你好父窗口', 'http://www.parent.com');
  }
}, false);

2、使用location.hash

在同一個域名下,當改變瀏覽器的地址欄時,會觸發hashchange事件。因此,可以通過修改iframe的location.hash值,來實現同源下的跨窗口通信。

// 父頁面代碼
var ifr = document.getElementById('childFrame');

txt.onkeyup = function() {
  ifr.src = ifr.src.split('#')[0] + '#' + txt.value;
};

window.addEventListener('hashchange', function() {
  console.log(ifr.contentWindow.location.hash);
}, false);
// 子頁面代碼
window.onhashchange = function() {
  console.log(location.hash);
  parent.window.location.hash = location.hash;
};

3、使用window.name

window.name屬性在同一窗口下,即使頁面跳轉,值也不會發生變化。因此,可以通過給iframe的window.name屬性賦值,來實現同源下的跨窗口通信。

// 父頁面代碼
var ifr = document.getElementById('childFrame');

ifr.onload = function() {
  ifr.contentWindow.name = '你好子窗口';
};

window.onmessage = function(e) {
  console.log(e.data);
};
// 子頁面代碼
window.name = '你好父窗口';
window.onload = function() {
  window.parent.postMessage(window.name, '*');
};

四、總結

通過上述三種方法,我們可以在同一個頁面的iframe之間實現跨域通信。postMessage是HTML5的推薦方法,具有較高的可靠性和安全性。而location.hash和window.name則適用於同一源的情況,但其實現起來相對較為簡單。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159094.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 18:57
下一篇 2024-11-19 18:57

相關推薦

  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Django ORM如何實現或的條件查詢

    在我們使用Django進行資料庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Python一次性輸入10個數如何實現?

    Python提供了多種方法進行輸入,可以手動逐個輸入,也可以一次性輸入多個數。在需要輸入大量數據時,一次性輸入十個數就非常方便。下面我們從多個方面來講解如何一次性輸入10個數。 一…

    編程 2025-04-28
  • 如何實現van-picker點擊遮罩不關閉

    van-picker是一個非常實用的Vue組件,但默認情況下,點擊遮罩會自動關閉選擇器。本文將介紹如何通過代碼實現van-picker點擊遮罩不關閉的功能。 一、通過覆蓋遮罩實現 …

    編程 2025-04-27
  • 如何實現矩陣相乘等於E

    本文將介紹如何通過代碼實現兩個矩陣相乘等於單位矩陣E。 一、線性代數基礎 要理解矩陣相乘等於E,需要先了解一些線性代數基礎知識。 首先,矩陣的乘法是滿足結合律的,即(A*B)*C=…

    編程 2025-04-27
  • 跨域通信浮標——實現客戶端之間的跨域通信

    本文將介紹跨域通信浮標的使用方法,該浮標可以實現客戶端之間的跨域通信,解決了瀏覽器同源策略的限制,讓開發者能夠更加方便地進行跨域通信。 一、浮標的原理 跨域通信浮標的原理是基於浮動…

    編程 2025-04-27
  • 通信專業Python和Java的開發技巧

    本文旨在介紹通信專業Python和Java的開發技巧,為讀者提供實用且可操作的思路和方法。 一、Python在通信領域中的應用 Python是一種優秀的程序設計語言,因其易學易用、…

    編程 2025-04-27
  • 如何實現一個隨機抽數生成器

    隨機數在程序開發中是非常常見的需求,而隨機抽數生成器則是其一大應用場景。在這篇文章中,我們將從多個方面來探討如何實現一個隨機抽數生成器,包括隨機數的概念、生成隨機數的方法、如何抽取…

    編程 2025-04-27
  • ROS通信

    一、概述 ROS是機器人操作系統,是一個開源的、靈活的、分散式的軟體平台,可以幫助我們快速開發機器人應用程序。ROS中的通信是機器人應用程序開發中最重要的部分之一,它是實現多模塊協…

    編程 2025-04-25
  • Python 進程通信

    當需要在不同進程之間進行通信時,Python 提供了幾種方法來實現進程間通信。這些方法包括隊列,管道,共享內存以及套接字。 1. 隊列 Python 隊列是進程安全的,並且可以很方…

    編程 2025-04-24

發表回復

登錄後才能評論