最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實現瀏覽器內多個標簽頁通信方式詳解

 更新時間:2025年03月06日 11:02:35   作者:Epicurus  
在瀏覽器中,多個標簽頁(頁簽)之間的通信有一些方法可以實現,這篇文章為大家整理了6個常用的方法,感興趣的小伙伴可以跟隨小編一起學習一下

在瀏覽器中,多個標簽頁(頁簽)之間的通信可以通過以下方法實現。這些方法基于同源策略(Same Origin Policy),即通信的頁面必須來自相同的協(xié)議、域名和端口。

1. 使用 localStorage 和 storage 事件

原理:當 localStoragesessionStorage 中的數據發(fā)生變化時,會觸發(fā) storage 事件,其他同源頁面可以監(jiān)聽此事件來實現通信。

// 發(fā)送消息的頁面
localStorage.setItem('message', JSON.stringify({ text: 'Hello from Tab 1!' }));

// 接收消息的頁面
window.addEventListener('storage', (event) => {
  if (event.key === 'message') {
    const message = JSON.parse(event.newValue);
    console.log('Received:', message.text); // 輸出: "Hello from Tab 1!"
  }
});

特點

  • 適用于簡單數據傳遞。
  • 僅在同源頁面間生效。
  • storage 事件不會在修改數據的當前標簽頁觸發(fā)。

2. 使用 BroadcastChannel API

原理:通過 BroadcastChannel 創(chuàng)建一個命名頻道,多個頁面訂閱同一頻道后,可以通過該頻道廣播消息。

// 發(fā)送消息的頁面
const channel = new BroadcastChannel('my-channel');
channel.postMessage({ text: 'Hello from Tab 1!' });

// 接收消息的頁面
const channel = new BroadcastChannel('my-channel');
channel.onmessage = (event) => {
  console.log('Received:', event.data.text); // 輸出: "Hello from Tab 1!"
};

特點

  • 支持復雜對象傳遞。
  • 僅在同源頁面間生效。
  • 現代瀏覽器支持良好(IE 不支持)。

3. 使用 SharedWorker

原理:通過共享的后臺線程(SharedWorker)作為中介,多個頁面通過該線程傳遞消息。

// SharedWorker 腳本(shared-worker.js)
self.onconnect = (event) => {
  const port = event.ports[0];
  port.onmessage = (e) => {
    // 收到消息后廣播給所有連接的頁面
    port.postMessage(e.data);
  };
};

// 發(fā)送消息的頁面
const worker = new SharedWorker('shared-worker.js');
worker.port.postMessage({ text: 'Hello from Tab 1!' });

// 接收消息的頁面
const worker = new SharedWorker('shared-worker.js');
worker.port.onmessage = (event) => {
  console.log('Received:', event.data.text); // 輸出: "Hello from Tab 1!"
};

特點

  • 支持復雜通信場景。
  • 需要處理 SharedWorker 的生命周期。
  • 兼容性較好(IE 不支持)。

4. 使用 window.postMessage

原理:通過 window.open()window.opener 獲取其他頁面的引用,直接通過 postMessage 發(fā)送消息。

// 打開新頁簽并發(fā)送消息
const newTab = window.open('https://example.com/tab2');
newTab.postMessage({ text: 'Hello from Tab 1!' }, 'https://example.com');

// 接收消息的頁面
window.addEventListener('message', (event) => {
  if (event.origin === 'https://example.com') {
    console.log('Received:', event.data.text); // 輸出: "Hello from Tab 1!"
  }
});

特點

  • 需要明確的頁面引用(通過 window.openwindow.opener)。
  • 支持跨域通信(需目標頁面允許)。

5. 使用 IndexedDB

原理:通過共享的 IndexedDB 數據庫作為中介,多個頁面監(jiān)聽數據庫變化。

// 發(fā)送消息的頁面
const db = await openDB('my-db', 1);
await db.put('messages', { text: 'Hello from Tab 1!' });

// 接收消息的頁面
const db = await openDB('my-db', 1);
db.on('changes', (changes) => {
  changes.forEach((change) => {
    if (change.type === 'put') {
      console.log('Received:', change.value.text); // 輸出: "Hello from Tab 1!"
    }
  });
});

特點

  • 適用于需要持久化存儲的場景。
  • 實現相對復雜。

6. 使用 Service Worker

原理:通過 Service Worker 作為消息中轉站,多個頁面與 Service Worker 通信。

// Service Worker 腳本(sw.js)
self.addEventListener('message', (event) => {
  event.waitUntil(
    self.clients.matchAll().then((clients) => {
      clients.forEach((client) => {
        client.postMessage(event.data);
      });
    })
  );
});

// 發(fā)送消息的頁面
navigator.serviceWorker.controller.postMessage({ text: 'Hello from Tab 1!' });

// 接收消息的頁面
navigator.serviceWorker.addEventListener('message', (event) => {
  console.log('Received:', event.data.text); // 輸出: "Hello from Tab 1!"
});

特點

  • 支持離線場景。
  • 需要 HTTPS 環(huán)境(本地開發(fā)除外)。

總結

方法適用場景兼容性復雜度
localStorage簡單數據同步所有現代瀏覽器
BroadcastChannel實時消息傳遞現代瀏覽器
SharedWorker復雜通信場景現代瀏覽器
window.postMessage跨域或父子頁面通信所有瀏覽器
IndexedDB持久化數據共享所有現代瀏覽器
Service Worker離線或后臺通信現代瀏覽器

選擇建議

  • 簡單場景:優(yōu)先使用 localStorageBroadcastChannel
  • 復雜場景:選擇 SharedWorkerService Worker。
  • 跨域通信:使用 window.postMessage(需目標頁面配合)。

以上就是JavaScript實現瀏覽器內多個標簽頁通信方式詳解的詳細內容,更多關于JavaScript標簽頁通信的資料請關注腳本之家其它相關文章!

相關文章

  • js實現圖片輪播效果學習筆記

    js實現圖片輪播效果學習筆記

    這篇文章主要為大家詳細介紹了js實現圖片輪播效果的學習筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • layer彈出的iframe層在執(zhí)行完畢后關閉當前彈出層的方法

    layer彈出的iframe層在執(zhí)行完畢后關閉當前彈出層的方法

    今天小編就為大家分享一篇layer彈出的iframe層在執(zhí)行完畢后關閉當前彈出層的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • JavaScript列表獲取指定范圍值的N種方法

    JavaScript列表獲取指定范圍值的N種方法

    在日常開發(fā)中,我們經常需要從數組中提取指定范圍的值,本文為大家總結了一下?JS?中獲取數組指定范圍值的所有方法,文中的示例代碼講解詳細,有需要的小伙伴可以了解下
    2026-05-05
  • Bootstrap和Java分頁實例第二篇

    Bootstrap和Java分頁實例第二篇

    這篇文章主要為大家詳細介紹了Bootstrap和Java分頁實例第二篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • javascript 字符串連接的性能問題(多瀏覽器)

    javascript 字符串連接的性能問題(多瀏覽器)

    今天看了javascript 高級程序設計 談到了字符串連接的性能問題
    2008-11-11
  • 微信小程序Page中data數據操作和函數調用方法

    微信小程序Page中data數據操作和函數調用方法

    這篇文章主要介紹了微信小程序Page中data數據操作和函數調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • JS/jQuery實現簡單的開關燈效果【案例】

    JS/jQuery實現簡單的開關燈效果【案例】

    這篇文章主要介紹了JS/jQuery實現簡單的開關燈效果,結合具體實例形式分析了javascript/jQuery事件響應及頁面元素屬性動態(tài)操作相關實現技巧,需要的朋友可以參考下
    2019-02-02
  • TypeScript?類型斷言的幾種實現

    TypeScript?類型斷言的幾種實現

    本文主要介紹了TypeScript?類型斷言的實現,有使用關鍵字as和標簽<>兩種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 詳解JavaScript中的原型和原型鏈

    詳解JavaScript中的原型和原型鏈

    這篇文章主要為大家介紹了JavaScript中的原型和原型鏈,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 微信小程序實現購物車頁面

    微信小程序實現購物車頁面

    這篇文章主要為大家詳細介紹了微信小程序實現購物車頁面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論

岳阳县| 桂东县| 邵阳市| 柘荣县| 新营市| 洪洞县| 江山市| 岑溪市| 麻江县| 安多县| 永嘉县| 绥芬河市| 洛南县| 西乌珠穆沁旗| 泗水县| 吉安县| 开鲁县| 邮箱| 呼和浩特市| 桂东县| 石城县| 阿尔山市| 五台县| 通渭县| 赤水市| 枝江市| 镇赉县| 高邑县| 河源市| 湖口县| 江城| 鄯善县| 洛宁县| 乐亭县| 神农架林区| 合阳县| 桓台县| 贵德县| 翁源县| 迭部县| 闵行区|