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

JavaScript實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)通信方式詳解

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

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

1. 使用 localStorage 和 storage 事件

原理:當(dāng) localStoragesessionStorage 中的數(shù)據(jù)發(fā)生變化時(shí),會(huì)觸發(fā) storage 事件,其他同源頁(yè)面可以監(jiān)聽此事件來實(shí)現(xiàn)通信。

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

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

特點(diǎn)

  • 適用于簡(jiǎn)單數(shù)據(jù)傳遞。
  • 僅在同源頁(yè)面間生效。
  • storage 事件不會(huì)在修改數(shù)據(jù)的當(dāng)前標(biāo)簽頁(yè)觸發(fā)。

2. 使用 BroadcastChannel API

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

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

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

特點(diǎn)

  • 支持復(fù)雜對(duì)象傳遞。
  • 僅在同源頁(yè)面間生效。
  • 現(xiàn)代瀏覽器支持良好(IE 不支持)。

3. 使用 SharedWorker

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

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

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

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

特點(diǎn)

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

4. 使用 window.postMessage

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

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

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

特點(diǎn)

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

5. 使用 IndexedDB

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

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

// 接收消息的頁(yè)面
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!"
    }
  });
});

特點(diǎn)

  • 適用于需要持久化存儲(chǔ)的場(chǎng)景。
  • 實(shí)現(xiàn)相對(duì)復(fù)雜。

6. 使用 Service Worker

原理:通過 Service Worker 作為消息中轉(zhuǎn)站,多個(gè)頁(yè)面與 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ā)送消息的頁(yè)面
navigator.serviceWorker.controller.postMessage({ text: 'Hello from Tab 1!' });

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

特點(diǎn)

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

總結(jié)

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

選擇建議

  • 簡(jiǎn)單場(chǎng)景:優(yōu)先使用 localStorageBroadcastChannel。
  • 復(fù)雜場(chǎng)景:選擇 SharedWorkerService Worker。
  • 跨域通信:使用 window.postMessage(需目標(biāo)頁(yè)面配合)。

以上就是JavaScript實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)通信方式詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript標(biāo)簽頁(yè)通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

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

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

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

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

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

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

    js仿微信搶紅包功能

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

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

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

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

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

    JavaScript使用ZeroClipboard操作剪切板

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

    移動(dòng)端滑動(dòng)插件Swipe教程

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

    js單頁(yè)hash路由原理與應(yīng)用實(shí)戰(zhàn)詳解

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

最新評(píng)論