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

JavaScript實現(xiàn)瀏覽器內(nèi)多個標簽頁通信方式詳解

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

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

1. 使用 localStorage 和 storage 事件

原理:當 localStoragesessionStorage 中的數(shù)據(jù)發(fā)生變化時,會觸發(fā) storage 事件,其他同源頁面可以監(jiān)聽此事件來實現(xià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!"
  }
});

特點

  • 適用于簡單數(shù)據(jù)傳遞。
  • 僅在同源頁面間生效。
  • storage 事件不會在修改數(shù)據(jù)的當前標簽頁觸發(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!"
};

特點

  • 支持復雜對象傳遞。
  • 僅在同源頁面間生效。
  • 現(xiàn)代瀏覽器支持良好(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 數(shù)據(jù)庫作為中介,多個頁面監(jiān)聽數(shù)據(jù)庫變化。

// 發(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!"
    }
  });
});

特點

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

6. 使用 Service Worker

原理:通過 Service Worker 作為消息中轉(zhuǎn)站,多個頁面與 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ā)除外)。

總結(jié)

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

選擇建議

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

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

相關文章

  • 淺談javascript中的 “ && ” 和 “ || ”

    淺談javascript中的 “ && ” 和 “ || ”

    本文主要介紹了Javascript中的 “ && ” 和 “ || ”的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JS上傳組件FileUpload自定義模板的使用方法

    JS上傳組件FileUpload自定義模板的使用方法

    這篇文章主要為大家詳細介紹了JS上傳組件FileUpload自定義模板的使用方法,感興趣的小伙伴們可以參考一下
    2016-05-05
  • js游戲人物上下左右跑步效果代碼分享

    js游戲人物上下左右跑步效果代碼分享

    這篇文章主要介紹了js游戲人物上下左右跑步效果,推薦給大家,有需要的小伙伴可以參考下。
    2015-08-08
  • 用原生js統(tǒng)計文本行數(shù)的簡單示例

    用原生js統(tǒng)計文本行數(shù)的簡單示例

    這篇文章我們來看看如何利用原生的JavaScript實現(xiàn)統(tǒng)計文本的行數(shù),代碼實現(xiàn)起來很簡單,有需要的可以參考借鑒。
    2016-08-08
  • js仿微信搶紅包功能

    js仿微信搶紅包功能

    這篇文章主要為大家詳細介紹了js仿微信搶紅包功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • JavaScript動態(tài)獲取和修改DOM元素內(nèi)容的完整指南

    JavaScript動態(tài)獲取和修改DOM元素內(nèi)容的完整指南

    在現(xiàn)代Web開發(fā)中,動態(tài)獲取和修改DOM元素內(nèi)容是構(gòu)建交互式用戶界面的核心技能,無論是更新實時數(shù)據(jù)、創(chuàng)建動態(tài)內(nèi)容還是響應用戶交互,都離不開對DOM內(nèi)容的精確控制,本文將全面介紹JavaScript中操作DOM內(nèi)容的各種方法,需要的朋友可以參考下
    2025-06-06
  • 基于HTML5上使用iScroll實現(xiàn)下拉刷新,上拉加載更多

    基于HTML5上使用iScroll實現(xiàn)下拉刷新,上拉加載更多

    本文主要介紹在HTML5中使用iScroll實現(xiàn)下拉刷新,上拉加載更多數(shù)據(jù)的方法,主要就是寫了兩個自定義函數(shù)pullDownAction和pullUpAction,分別在下拉和上拉的事件中調(diào)用他們。
    2016-05-05
  • JavaScript使用ZeroClipboard操作剪切板

    JavaScript使用ZeroClipboard操作剪切板

    這篇文章主要為大家詳細介紹了JavaScript使用ZeroClipboard操作剪切板的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 移動端滑動插件Swipe教程

    移動端滑動插件Swipe教程

    swipe.JS是一個比較有名的觸摸滑動插件,它能夠處理內(nèi)容滑動,支持自定義選項,你可以讓它自動滾動,控制滾動間隔,返回回調(diào)函數(shù)等。經(jīng)??梢娛褂迷谝苿忧岸碎_發(fā)中。
    2016-10-10
  • js單頁hash路由原理與應用實戰(zhàn)詳解

    js單頁hash路由原理與應用實戰(zhàn)詳解

    本篇文章主要介紹了js單頁hash路由原理與應用實戰(zhàn)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論