欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中不同標(biāo)簽頁間通信的常見方式小結(jié)

 更新時間:2025年05月08日 08:42:23   作者:風(fēng)紀(jì)委員  
在瀏覽器中,不同標(biāo)簽頁之間進(jìn)行通信是一個常見的需求,本文介紹了JavaScript中不同標(biāo)簽頁間通信的常見方式,包括BroadcastChannel、localStorage、SharedWorker和window.postMessage+iframe,并詳細(xì)介紹了每種方法的實現(xiàn)和適用場景,需要的朋友可以參考下

在瀏覽器中,不同標(biāo)簽頁之間進(jìn)行通信是一個常見的需求,例如:

  • 用戶在 A 標(biāo)簽頁登錄后,希望 B 標(biāo)簽頁自動刷新狀態(tài)。
  • 多個頁面需要共享某個數(shù)據(jù)源或狀態(tài)。
  • 實現(xiàn)“跨頁面廣播”功能(如通知所有打開的頁面執(zhí)行某個操作)。

一、實現(xiàn)不同標(biāo)簽頁間通信的常見方式

方法支持情況特點
BroadcastChannel API? Chrome / Firefox / Edge / Safari (部分支持)簡單易用,適合同源頁面通信
localStorage + storage 事件? 所有現(xiàn)代瀏覽器利用存儲變化事件監(jiān)聽通信
SharedWorker? Chrome / Edge / Opera(不支持 Safari)多頁面共享一個 Worker,可作為中介
window.postMessage() + iframe 共享頁面? 所有瀏覽器跨域場景下可用,但略復(fù)雜
IndexedDB + 輪詢/監(jiān)聽(高級)? 所有瀏覽器更復(fù)雜,適用于持久化數(shù)據(jù)同步

二、推薦方案詳解

方法 1:使用 BroadcastChannel(推薦)

優(yōu)點:

  • 簡潔直觀
  • 可以傳遞結(jié)構(gòu)化數(shù)據(jù)(包括 ArrayBuffer)
  • 不依賴 DOM 或本地存儲
  • 支持異步消息收發(fā)

示例代碼:

// 創(chuàng)建一個名為 'my_channel' 的廣播通道
const bc = new BroadcastChannel('my_channel');

// 監(jiān)聽消息
bc.onmessage = function(event) {
  console.log('收到消息:', event.data);
};

// 發(fā)送消息
bc.postMessage({ type: 'login', user: 'Alice' });

注意:BroadcastChannel 是 同源策略 下的 API,即只有相同域名下的頁面才能接收到消息。

方法 2:使用 localStorage + storage 事件(兼容性最好)

優(yōu)點:

  • 幾乎所有瀏覽器都支持
  • 可用于簡單的頁面間通信
  • 可以結(jié)合 JSON 存儲復(fù)雜數(shù)據(jù)

示例代碼:

// 頁面 A 中設(shè)置 localStorage
localStorage.setItem('user', JSON.stringify({ name: 'Alice', status: 'logged_in' }));
// 頁面 B 中監(jiān)聽 storage 事件
window.addEventListener('storage', function(event) {
  if (event.key === 'user') {
    const user = JSON.parse(event.newValue);
    console.log('用戶狀態(tài)更新:', user);
  }
});

注意:

  • storage 事件只在其他標(biāo)簽頁修改了 localStorage 時觸發(fā),當(dāng)前頁面不會觸發(fā)。
  • 數(shù)據(jù)必須是字符串格式,建議使用 JSON.stringify()JSON.parse() 進(jìn)行轉(zhuǎn)換。

方法 3:使用 SharedWorker(適合多頁面共享計算邏輯)

優(yōu)點:

  • 多頁面共享同一個 Worker,可以作為“中介”
  • 可以實現(xiàn)復(fù)雜的通信和狀態(tài)同步
  • 支持結(jié)構(gòu)化數(shù)據(jù)傳輸

示例代碼:

shared-worker.js

let ports = [];

onconnect = function(e) {
  const port = e.ports[0];
  ports.push(port);

  port.onmessage = function(event) {
    // 接收到一個頁面的消息,廣播給所有連接的頁面
    ports.forEach(p => p.postMessage(event.data));
  };
};

頁面 A / 頁面 B

const worker = new SharedWorker('shared-worker.js');

worker.port.start(); // 啟動端口通信

worker.port.onmessage = function(event) {
  console.log('從 SharedWorker 收到:', event.data);
};

// 發(fā)送消息給 SharedWorker
worker.port.postMessage('Hello from page');

注意:

  • SharedWorkerSafari 和 iOS 上不支持
  • 需要啟用 port.start() 才能開始通信。

方法 4:使用 window.postMessage() + iframe 共享頁面(跨域場景)

如果你需要跨域通信(比如 a.comb.com),可以創(chuàng)建一個共享的 iframe 頁面(托管在雙方都能訪問的域名下),通過 postMessage() 實現(xiàn)跨域通信。

示例架構(gòu):

頁面A(a.com) <===> 共享iframe(share.com) <===> 頁面B(b.com)

頁面 A 發(fā)送消息:

const iframe = document.getElementById('sharedIframe');
iframe.contentWindow.postMessage('Hello from A', 'https://share.com');

iframe 頁面接收并轉(zhuǎn)發(fā):

window.addEventListener('message', function(event) {
  if (event.origin !== 'https://a.com' && event.origin !== 'https://b.com') return;
  // 廣播給所有子窗口或父窗口
  window.parent.postMessage(event.data, event.origin);
});

頁面 B 接收消息:

window.addEventListener('message', function(event) {
  if (event.origin === 'https://share.com') {
    console.log('收到消息:', event.data);
  }
});

三、如何選擇合適的方法?

場景推薦方法
同源頁面簡單通信BroadcastChannel
需要兼容舊瀏覽器localStorage + storage
多頁面共享狀態(tài)/邏輯SharedWorker(非 Safari/iOS)
跨域頁面通信window.postMessage() + 共享 iframe
持久化數(shù)據(jù)同步IndexedDB + 輪詢或監(jiān)聽機制

四、補充建議

  • 如果你只需要在頁面間同步用戶登錄狀態(tài)、配置信息等輕量數(shù)據(jù),localStorage 是最穩(wěn)妥的選擇。
  • 如果你需要實時性強、結(jié)構(gòu)化數(shù)據(jù)通信,優(yōu)先使用 BroadcastChannel。
  • 如果你在開發(fā) PWA 或后臺系統(tǒng),考慮使用 Service Worker + BroadcastChannel 做統(tǒng)一狀態(tài)管理。
  • 對于大型項目,可以封裝一個統(tǒng)一的“跨頁面通信庫”,抽象掉底層差異。

總結(jié)

方法是否同源限制是否支持跨域是否支持結(jié)構(gòu)化數(shù)據(jù)是否推薦
BroadcastChannel推薦
localStorage + storage是(需手動序列化)推薦
SharedWorker部分瀏覽器不支持
window.postMessage() + iframe推薦(跨域場景)

以上就是JavaScript中不同標(biāo)簽頁間通信的常見方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript標(biāo)簽頁間通信方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何通過IntersectionObserver實現(xiàn)懶加載

    如何通過IntersectionObserver實現(xiàn)懶加載

    這篇文章主要介紹了通過IntersectionObserver實現(xiàn)懶加載,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Javascript 代碼也可以變得優(yōu)美的實現(xiàn)方法

    Javascript 代碼也可以變得優(yōu)美的實現(xiàn)方法

    Javascript 代碼也可以變得優(yōu)美的一些經(jīng)驗小結(jié)。
    2009-06-06
  • ele-table表格列表內(nèi)雙擊編輯部分信息的示例代碼(el-table組件同理)

    ele-table表格列表內(nèi)雙擊編輯部分信息的示例代碼(el-table組件同理)

    本文介紹如何在ele-table組件中實現(xiàn)雙擊編輯功能,通過雙擊表格列表內(nèi)需要編輯的區(qū)域,可以展示輸入框或日期選擇器進(jìn)行數(shù)據(jù)修改,修改完成后,通過按回車鍵或點擊確認(rèn)按鈕提交修改數(shù)據(jù),感興趣的朋友一起看看吧
    2024-11-11
  • JS基于對象的鏈表實現(xiàn)與使用方法示例

    JS基于對象的鏈表實現(xiàn)與使用方法示例

    這篇文章主要介紹了JS基于對象的鏈表實現(xiàn)與使用方法,結(jié)合實例形式分析了鏈表的原理及javascript定義與使用鏈表的相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • javascript的switch用法注意事項分析

    javascript的switch用法注意事項分析

    這篇文章主要介紹了javascript的switch用法注意事項,實例分析了switch語句進(jìn)行判定的原理與使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • JS數(shù)據(jù)類型判斷的幾種常用方法

    JS數(shù)據(jù)類型判斷的幾種常用方法

    這篇文章主要介紹了JS判斷數(shù)據(jù)類型的幾種常用方法,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • webpack 如何解析代碼模塊路徑的實現(xiàn)

    webpack 如何解析代碼模塊路徑的實現(xiàn)

    這篇文章主要介紹了webpack 如何解析代碼模塊路徑的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 功能強大的Bootstrap效果展示(二)

    功能強大的Bootstrap效果展示(二)

    這篇文章主要介紹了功能強大的Bootstrap效果展示,介紹常用Bootstrap效果的使用方法,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 在微信小程序中使用iconfont的最新圖文教程

    在微信小程序中使用iconfont的最新圖文教程

    由于微信小程序線上的資源限制了各種接口安全域名,所以在小程序里如果想使用iconfont字體圖標(biāo)就會稍有不同,下面這篇文章主要給大家介紹了關(guān)于在微信小程序中使用iconfont的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 使用Webpack壓縮與轉(zhuǎn)譯JavaScript代碼的操作方法

    使用Webpack壓縮與轉(zhuǎn)譯JavaScript代碼的操作方法

    在Web開發(fā)中,代碼的性能和加載時間是用戶體驗的重要組成部分,為此,將JavaScript代碼壓縮和優(yōu)化是發(fā)布前一個必不可少的步驟,所以本文給大家介紹了如何使用Webpack壓縮與轉(zhuǎn)譯JavaScript代碼,需要的朋友可以參考下
    2024-05-05

最新評論