- 使用 localStorage 或 sessionStorage
 
浏览器提供的 localStorage 和 sessionStorage 对象可以用于在多个标签页之间共享数据。当一个标签页修改了 localStorage 或 sessionStorage 中的数据,其他标签页可以通过监听 storage 事件来得知数据的变化。
示例:
            
            
              javascript
              
              
            
          
          	// 在一个标签页中设置数据  
	localStorage.setItem('key', 'value');  
	  
	// 在其他标签页中监听数据变化  
	window.addEventListener('storage', function(event) {  
	  if (event.key === 'key') {  
	    console.log('Value changed to:', event.newValue);  
	  }  
	});
        注意:localStorage 在所有标签页和窗口之间共享数据,而 sessionStorage 只在同一窗口的标签页之间共享数据。
- 使用 BroadcastChannel API
 
BroadcastChannel API 提供了一个简单的方式来在多个浏览上下文(如标签页或窗口)之间发送和接收消息。这是一个比较新的 API,但在现代浏览器中得到了很好的支持。
示例:
            
            
              csharp
              
              
            
          
          	// 创建一个 BroadcastChannel 实例  
	const channel = new BroadcastChannel('my-channel');  
	  
	// 发送消息  
	channel.postMessage('Hello, world!');  
	  
	// 接收消息  
	channel.onmessage = event => {  
	  console.log('Received:', event.data);  
	};
        - 使用 Service Workers
 
Service Workers 是一种在浏览器后台独立于网页运行的脚本,可以用于在多个标签页之间共享数据。Service Workers 可以通过 postMessage API 与其他标签页通信。
示例:
首先,你需要注册一个 Service Worker:
            
            
              javascript
              
              
            
          
          	if ('serviceWorker' in navigator) {  
	  navigator.serviceWorker.register('/service-worker.js')  
	    .then(() => console.log('Service Worker Registered'))  
	    .catch(err => console.log('Service Worker Registration Failed: ', err));  
	}
        然后,在 Service Worker 中使用 postMessage 发送消息:
            
            
              ini
              
              
            
          
          	self.clients.matchAll().then(clients => {  
	  clients.forEach(client => {  
	    client.postMessage('Hello from Service Worker!');  
	  });  
	});
        在网页中监听来自 Service Worker 的消息:
            
            
              markdown
              
              
            
          
          	if ('serviceWorker' in navigator) {  
	  navigator.serviceWorker.controller.postMessage('Hello from Page!');  
	  
	  navigator.serviceWorker.controller.onmessage = event => {  
	    console.log('Received:', event.data);  
	  };  
	}
        - 使用 IndexedDB 或 WebSQL
 
虽然 IndexedDB 和 WebSQL 主要用于存储大量结构化数据,但它们也可以用于在多个标签页之间共享数据。通过在这些数据库中存储和检索数据,多个标签页可以访问和修改相同的数据集。
- 使用 SharedArrayBuffer 和 Atomics
 
SharedArrayBuffer 和 Atomics 提供了一种在多个 Worker 线程之间共享内存的方法。虽然这主要用于 Web Workers,但也可以在某些情况下用于标签页之间的通信。然而,这种方法比较复杂,并且可能涉及到更多的同步和并发问题。
- 使用第三方库或框架
 
有些第三方库或框架提供了更高级别的抽象来简化浏览器内多个标签页之间的通信。例如,一些状态管理库(如 Redux 或 MobX)提供了跨标签页共享状态的功能。