浏览器同一域名下不同标签页通讯方法总结

238 阅读3分钟

前端在工作中,有时会遇到需要在浏览器打开的多个同一域名下标签页之间做一些简单通讯或数据传输的需求。不同标签页之间的通讯我们需要一些特殊的方法:

方法一:localStorage

localStorage 是一个浏览器本地存储机制,允许不同标签页之间共享数据。 一个标签页可以将数据存储在 localStorage 中,而其他标签页可以读取该数据。 请注意,localStorage 存储的数据是基于同一域名的,不同域名下的localStorage存储的数据是不会共享的。同时,localStorage数据的改变我们可以通过可以通过监听storage事件来检测数据更改并作出相应的响应。- 示例代码:

// 在一个标签页中 
localStorage.setItem('myData', 'newData'); 
// 在其他标签页中 
window.addEventListener('storage', function (e) { 
  if (e.key === 'myData') { 
    // 处理数据更改 
    console.log('数据已更改:', e.newValue); 
  } 
});

方法二:使用Web Sockets

  • 在标签页之间建立WebSocket连接,以便它们可以实时通信。
  • 当一个标签页中的操作导致数据更改时,通过WebSocket将更新的数据发送到其他标签页。
  • 示例代码:
// 在标签页中建立WebSocket连接 
const socket = new WebSocket('wss://example.com/socket'); 
// 当收到数据时 
socket.addEventListener('message', function (event) { 
const data = JSON.parse(event.data); 
// 处理数据更改 
console.log('收到数据:', data); }); 
// 在一个标签页中 
const newData = { message: '新数据' }; 
socket.send(JSON.stringify(newData));

我们也可以和后端配合使用Web Sockets,可以实现一些更复杂的数据逻辑交互和处理。

方法三: 使用Service Worker:

  • 当一个标签页中的操作导致数据更改时,Service Worker可以广播通知到其他标签页。
  • 示例代码:
// 在Service Worker 中 
self.addEventListener('message', function (event) { 
  // 处理来自其他标签页的消息 
  const data = event.data; 
  // 广播数据更改 
  self.clients.matchAll().then(function (clients) { 
    clients.forEach(function (client) { 
      client.postMessage({ dataChanged: true, newData: data }); 
    }); 
  }); 
}); 
// 在一个标签页中 
navigator.serviceWorker.controller.postMessage('新数据');

方法四:Broadcast Channel API

  • Broadcast Channel API是一个现代的Web API,用于在不同的标签页之间进行消息广播。它允许您创建一个可以在多个标签页之间共享数据的通道。
  • 示例代码:
// 在一个标签页中 
const channel = new BroadcastChannel('myChannel'); 
channel.postMessage('新数据'); 
// 在其他标签页中 
const channel = new BroadcastChannel('myChannel'); 
channel.onmessage = function (event) { console.log('收到数据:', event.data); };

除了以上几种方案之外,这里还有几个相关的库可以供参考使用:

  1. localForage

    • localForage是一个使用IndexedDB的库,它使数据存储和访问变得更加容易。您可以使用localForage来在多个标签页之间存储和共享数据。
    • 官方网站:localforage.github.io/localForage…
  2. Firebase Realtime Database

    • Firebase提供了一个实时数据库,它可以轻松实现多个标签页之间的数据共享和实时同步。Firebase还提供了实时事件监听,使您能够即时获得数据更改的通知。
    • 官方网站:firebase.google.com/products/re…
  3. Socket.io

    • 如果需要实时通信和数据同步,可以使用Socket.io来构建WebSocket应用程序。Socket.io提供了服务器端和客户端库,可以轻松创建实时应用程序,适用于多个标签页。
    • 官方网站:socket.io/