浏览器标签页之间的通信方式

1、使用BroadcastChannel api (不支持跨设备、旧设备IE)

let channel = new BroadcaseChannel('channel-name')      // channel-name需要一致,

tab01:【监听】  channel.addEventListener('message',(e)=>{console.log(e.data) // 标签页传递的数据})

tab02:【触发】 channel.postMessage({type: 'add', data: {id:3,msg:'23'}})

注意:channel-name一致

2、利用localStorage浏览器共享数据存储,通过对storage的监听实现

tab01:【监听】 window.addEventListener('storage',(e)=>{console.log(e.data)})

tab02:【触发】localStorage.set('key','value')

缺点:仅支持字符串传输,实时监听,但不能实时更新

3、SharedWorker通过共享线程实现数据通信

tab01:【监听】

let worker = new SharedWorker('postWorker.js')

worker.port.addEventListener('message',(e)=>{console.log(e)})

tab02:【触发】

let worker = new SharedWorker('postWorker.js')

worker.port.postMessage({type: 'add'}, msg: 4)

4、postMessage用于不同源页面间的通信(如 iframe 与父页面),可以通过 window.open() 和 window.opener 实现同源或不同源标签页之间的通信

【触发】: window.open() 打开新标签页,并保存其引用(targetWindow)

【监听】: window.opener 获取发送方的窗口引用    双方通过 postMessage 方法发送消息,通过 message 事件监听消息

// 监听来自发送方的消息

// 存储发送方窗口引用(通过window.opener获取)

const senderWindow = window.opener;

window.addEventListener('message', (e) => { // 验证消息来源

    if (e.origin !== window.location.origin)  return;

    console.log('收到消息:', e.data);

  })

// 向发送方回复消息 

senderWindow.postMessage({

    type: 'reply',

    content: reply,

    from: 'A'

}, window.location.origin);

let targetWindow; // 存储新打开的标签页引用

targetWindow = window.open('B.html', '_blank');

// 监听来自接收方的消息 

window.addEventListener('message', (e) => { // 验证消息来源(重要!防止恶意网站发送消息)

    if (e.origin !== window.location.origin) return;

    console.log('收到接收方回复:', e.data)

});

// 发送消息:targetWindow.postMessage(消息, 目标源) // 这里使用*表示允许任何源,实际应用中应指定具体源(如'http://example.com')

targetWindow.postMessage({

    type: 'chat',

    content: message,

    from: 'B'

},window.location.origin); // 限制同源通信更安全

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容