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

JavaScript中瀏覽器多標簽頁通信的8種方案盤點

 更新時間:2025年03月07日 09:04:58   作者:前端小吳7  
這篇文章主要為大家詳細介紹了JavaScript中瀏覽器多個標簽頁通信的8種方案與實戰(zhàn)場景深度對比,文中的示例代碼簡潔易懂,有需要的可以參考下

一、8大通信方案全景解析

1. LocalStorage 事件驅(qū)動(同源)

// 頁面A發(fā)送消息
localStorage.setItem('msg', JSON.stringify({ type: 'SYNC', data: 'Hello' }));

// 所有頁面監(jiān)聽storage事件
window.addEventListener('storage', (e) => {
  if (e.key === 'msg') {
    const message = JSON.parse(e.newValue);
    console.log('收到消息:', message);
  }
});

特點

  • 跨頁簽實時通信
  • 數(shù)據(jù)自動持久化
  • 同源策略限制

2. BroadcastChannel API(同源

// 創(chuàng)建頻道
const channel = new BroadcastChannel('chat');

// 發(fā)送消息
channel.postMessage({ user: 'Alice', text: 'Hello!' });

// 接收消息
channel.onmessage = (e) => {
  console.log('收到廣播:', e.data);
};

優(yōu)勢

  • 精準頻道控制
  • 支持Web Workers通信

3. SharedWorker 共享線程(同源)

// shared-worker.js
const connections = [];
onconnect = (e) => {
  const port = e.ports[0];
  connections.push(port);
  
  port.onmessage = (event) => {
    // 廣播給所有連接的頁簽
    connections.forEach(conn => {
      if (conn !== port) conn.postMessage(event.data);
    });
  };
};

// 頁面使用
const worker = new SharedWorker('shared-worker.js');
worker.port.start();
worker.port.onmessage = (e) => {
  console.log('來自共享線程的消息:', e.data);
};

適用場景

  • 多頁簽實時聊天室
  • 復雜狀態(tài)同步

4. window.postMessage(跨域)

// 父頁面向子頁面發(fā)送消息
const iframe = document.getElementById('child-frame');
iframe.contentWindow.postMessage('secret', 'https://child.com');

// 子頁面接收
window.addEventListener('message', (e) => {
  if (e.origin !== 'https://parent.com') return;
  console.log('跨域消息:', e.data);
});

核心要點

  • 必須驗證origin防止攻擊
  • 支持跨域通信

5. Service Worker 代理(同源)

// service-worker.js
self.addEventListener('message', (event) => {
  event.waitUntil(
    clients.matchAll().then((clients) => {
      clients.forEach(client => {
        client.postMessage(event.data);
      });
    })
  );
});

// 頁面發(fā)送消息
navigator.serviceWorker.controller.postMessage('廣播消息');

獨特優(yōu)勢

  • 支持離線場景通信
  • 可攔截網(wǎng)絡請求

6. Cookies 輪詢(同源)

// 頁面A設置Cookie
document.cookie = "msg=hello; path=/; max-age=60";

// 頁面B輪詢檢查
setInterval(() => {
  const msg = document.cookie
    .split('; ')
    .find(row => row.startsWith('msg='))
    ?.split('=')[1];
  if (msg) {
    console.log('收到Cookie消息:', msg);
    document.cookie = "msg=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
  }
}, 1000);

適用場景

  • 兼容IE9等老舊瀏覽器
  • 低頻簡單消息傳遞

7. IndexedDB 監(jiān)聽(同源)

// 頁面A寫入數(shù)據(jù)
const db = await idb.openDB('msgDB', 1);
await db.put('messages', { id: Date.now(), content: '新消息' });

// 頁面B監(jiān)聽變化
const db = await idb.openDB('msgDB', 1);
db.on('changes', (changes) => {
  changes.forEach(change => {
    if (change.type === 'put') {
      console.log('數(shù)據(jù)庫更新:', change.value);
    }
  });
});

優(yōu)勢

  • 支持大數(shù)據(jù)量傳輸
  • 數(shù)據(jù)持久化存儲

8. WebSocket 服務中轉(zhuǎn)(跨域)

// 公共WebSocket服務
const ws = new WebSocket('wss://message-server.com');

// 所有頁簽連接同一服務
ws.onmessage = (event) => {
  console.log('服務端中轉(zhuǎn)消息:', event.data);
};

// 發(fā)送消息
ws.send(JSON.stringify({ 
  type: 'broadcast',
  payload: 'Hello all tabs!'
}));

企業(yè)級方案

  • 支持千萬級并發(fā)
  • 消息軌跡可追溯

二、8種方案橫向?qū)Ρ扰c選型指南

方案實時性跨域支持數(shù)據(jù)容量兼容性復雜度
LocalStorage?5MBIE8+
BroadcastChannel極高?無限制Chrome 54+
SharedWorker?依賴實現(xiàn)Chrome 80+
postMessage?受URL限制IE10+
Service Worker?無限制Chrome 40+
Cookies 輪詢?4KB全瀏覽器
IndexedDB 監(jiān)聽?250MB+IE10+
WebSocket 中轉(zhuǎn)極高?無限制IE10+(需polyfill)

選型決策樹

  • 需要跨域? → 選擇 postMessageWebSocket
  • 需要持久化存儲? → IndexedDB + 變更監(jiān)聽
  • 需要最高實時性? → BroadcastChannelWebSocket
  • 兼容老舊瀏覽器? → Cookies輪詢LocalStorage

三、實戰(zhàn)場景:多頁簽協(xié)同編輯器

1. 架構(gòu)設計

2. 核心代碼實現(xiàn)

class CollaborationCore {
  constructor() {
    this.channel = new BroadcastChannel('editor-sync');
    this.db = await idb.openDB('editorDB', 1, {
      upgrade(db) {
        db.createObjectStore('operations');
      }
    });
    
    this._initListeners();
  }

  // 發(fā)送編輯操作
  async sendOperation(op) {
    await this.db.put('operations', op, Date.now());
    this.channel.postMessage({ type: 'OPERATION', op });
  }

  // 監(jiān)聽消息
  _initListeners() {
    this.channel.onmessage = async (e) => {
      if (e.data.type === 'OPERATION') {
        this.applyOperation(e.data.op);
      }
    };
    
    // 處理離線期間的操作
    navigator.serviceWorker.addEventListener('message', (e) => {
      if (e.data.type === 'SYNC_OFFLINE_OPS') {
        e.data.ops.forEach(op => this.applyOperation(op));
      }
    });
  }
}

3. 高級優(yōu)化策略

  • 操作壓縮:將連續(xù)輸入合并為單個操作包
  • 沖突解決:采用OT(Operational Transformation)算法
  • 版本快照:定期保存完整文檔狀態(tài)

四、安全加固方案

1. 消息加密

// 使用Web Crypto API加密
async function encryptMessage(message, key) {
  const encoded = new TextEncoder().encode(message);
  const iv = crypto.getRandomValues(new Uint8Array(12));
  const ciphertext = await crypto.subtle.encrypt(
    { name: 'AES-GCM', iv },
    key,
    encoded
  );
  return { iv, ciphertext };
}

2. 權(quán)限控制

// 基于RBAC的通信控制
const allowedRoles = ['editor', 'admin'];
function canSendMessage(user) {
  return allowedRoles.includes(user.role);
}

五、未來:Web Locks API與共享內(nèi)存

1. 資源鎖控制

navigator.locks.request('resource', { mode: 'exclusive' }, async (lock) => {
  await updateSharedResource();
  // 鎖自動釋放
});

2. SharedArrayBuffer 應用

const sharedBuffer = new SharedArrayBuffer(1024);
const view = new Int32Array(sharedBuffer);

// 頁簽A
Atomics.store(view, 0, 123);

// 頁簽B
console.log(Atomics.load(view, 0)); // 123

結(jié)語八大通信方案各有千秋:

追求極致實時:BroadcastChannel

企業(yè)級需求:WebSocket集群

歷史兼容:LocalStorage+輪詢

根據(jù)具體場景靈活組合,方能打造最佳通信架構(gòu)。

以上就是JavaScript中瀏覽器多標簽頁通信的8種方案盤點的詳細內(nèi)容,更多關(guān)于JavaScript瀏覽器標簽頁通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解JavaScript?中的變量聲明與賦值

    詳解JavaScript?中的變量聲明與賦值

    在?JavaScript?中使用變量或常量之前,必須先進行聲明,這篇文章主要介紹了JavaScript中的變量聲明與賦值,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • JavaScript學習筆記之創(chuàng)建對象

    JavaScript學習筆記之創(chuàng)建對象

    在JavaScript中對象是一種基本的數(shù)據(jù)類型,在數(shù)據(jù)結(jié)構(gòu)上是一種散列表,可以看作是屬性的無序集合,除了原始值其他一切都是對象。這篇文章主要給大家介紹JavaScript學習筆記之創(chuàng)建對象,需要的朋友參考下吧
    2016-03-03
  • js清空表單數(shù)據(jù)的兩種方式(遍歷+reset)

    js清空表單數(shù)據(jù)的兩種方式(遍歷+reset)

    這篇文章主要介紹了js清空表單數(shù)據(jù)的兩種方式(遍歷+reset),需要的朋友可以參考下
    2014-07-07
  • 不用AI也能實現(xiàn)的文字自動播報(SpeechSynthesis文本實例合成)

    不用AI也能實現(xiàn)的文字自動播報(SpeechSynthesis文本實例合成)

    SpeechSynthesis是HTML5的一個新特性,基于SpeechSynthesis可以實現(xiàn)在客戶瀏覽器端進行動態(tài)文本的語音合成播放,這篇文章主要介紹了不用AI也能實現(xiàn)的文字自動播報(SpeechSynthesis文本實例合成),需要的朋友可以參考下
    2023-03-03
  • JavaScript中實現(xiàn)map功能代碼分享

    JavaScript中實現(xiàn)map功能代碼分享

    這篇文章主要介紹了JavaScript中實現(xiàn)map功能代碼分享,本文直接給出實現(xiàn)代碼,給出一個MAP類,類中包含大多數(shù)的常用方法,還可以自己擴展,需要的朋友可以參考下
    2015-06-06
  • 原生Js實現(xiàn)的畫廊功能

    原生Js實現(xiàn)的畫廊功能

    這篇文章主要介紹了原生Js實現(xiàn)的畫廊功能,幫助大家更好的理解和學習使用JavaScript,感興趣的朋友可以了解下
    2021-05-05
  • 淺析JavaScript中的CSS屬性及命名規(guī)范

    淺析JavaScript中的CSS屬性及命名規(guī)范

    這篇文章主要介紹了JavaScript中的CSS屬性及命名規(guī)范。需要的朋友可以過來參考一下,希望對大家有所幫助
    2013-11-11
  • 使用ECharts實現(xiàn)狀態(tài)區(qū)間圖

    使用ECharts實現(xiàn)狀態(tài)區(qū)間圖

    這篇文章主要為大家詳細介紹了使用ECharts實現(xiàn)狀態(tài)區(qū)間圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • echarts實現(xiàn)折線圖的拖拽效果

    echarts實現(xiàn)折線圖的拖拽效果

    這篇文章主要為大家詳細介紹了echarts實現(xiàn)折線圖的拖拽效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • arrayToJson將數(shù)組轉(zhuǎn)化為json格式的js代碼

    arrayToJson將數(shù)組轉(zhuǎn)化為json格式的js代碼

    arrayToJson將數(shù)組轉(zhuǎn)化為json格式的js代碼,需要的朋友可以參考下。
    2010-10-10

最新評論

德昌县| 凉城县| 邯郸市| 合水县| 三穗县| 盐边县| 广东省| 五莲县| 乃东县| 罗定市| 玛多县| 乌苏市| 图木舒克市| 铜川市| 长子县| 甘孜县| 肥东县| 乐都县| 安塞县| 宁都县| 改则县| 泸西县| 溧水县| 淳安县| 鲁甸县| 鄂托克旗| 丰镇市| 方正县| 新乡县| 洛川县| 科技| 临夏市| 喀什市| 通榆县| 垣曲县| 禄劝| 兴化市| 新乐市| 读书| 改则县| 彰化县|