SkyBlog

©2020 - 2026 By Flysky
框架Next.js|主题Shadcn
Built by vercel on Fri, 02 Jan 2026 14:18:05 GMT

浏览器跨窗口共享数据

这篇文章发布于 2025年01月24日,星期五,06:12。阅读 ? 次,? 条评论

同源

仅能同源窗口之间传递数据

LocalStorage / SessionStorage

看起来不是什么正经方案,唯一想到的用途是页面明暗主题切换

window.localStorage.setItem('key', 'hello world')
window.addEventListener('storage', event => {
  console.log(event)
})

MessagePort

点对点双向通讯,MessagePort 是可转移对象

const { port1, port2 } = new MessageChannel()
 
const worker = new Worker('worker.js')
worker.postMessage({ port: port1 }, [port1])
 
port2.onmessage = event => {
  console.log('Received from worker:', event.data)
}
 
port2.postMessage('hello world')
worker.js
self.onmessage = event => {
  const { port } = event.data
 
  port.onmessage = event => {
    console.log('Received from main thread:', event.data)
  }
 
  port.postMessage('hello world')
}

BroadcastChannel

多个窗口或标签页之间的广播通信

const channel = new BroadcastChannel('name')
channel.postMessage('hello world')
const channel = new BroadcastChannel('name')
channel.onmessage = event => {
  console.log(event.data)
}

SharedWorker

多个窗口或标签页共享同一个后台线程

const worker = new SharedWorker('worker.js')
 
worker.port.onmessage = event => {
  console.log('Received from worker:', event.data)
}
 
worker.port.postMessage('hello world')
worker.js
const ports = []
 
self.onconnect = event => {
  const port = event.ports[0]
  ports.push(port)
 
  port.onmessage = event => {
    console.log(event.data)
  }
 
  port.postMessage('hello world')
}

不同源

不同源窗口之间也能传递数据

PostMessage

window.postMessage('hello world', '*')
window.addEventListener('message', event => {
  console.log(event.data)
})

上一页

排序

下一页

canvas
  • 同源
  • LocalStorage / SessionStorage
  • MessagePort
  • BroadcastChannel
  • SharedWorker
  • 不同源
  • PostMessage