首页 > 其他分享 >跨标签页通信

跨标签页通信

时间:2023-11-17 18:45:21浏览次数:34  
标签:标签 通信 发送 message data event 客户端

  • Broadcast Channel API(主流推荐):Broadcast Channel API 允许不同标签页之间进行实时通信,而无需使用定时器轮询。你可以创建一个共享的 Broadcast Channel,并在标签页之间发送消息。这样,当其他标签页接收到消息时,可以立即作出响应。Broadcast Channel API 提供了更可靠和高效的跨标签页通信方式,避免了不必要的轮询和性能开销。

首先我们先创建一个文件crossTagMsg

const channel = new BroadcastChannel('sync-update')


export function sendMsg(type: any, content: any) {
    channel.postMessage({
        type,
        content
    });
}    

export function listenMsg(callback: (arg0: any) => any) {
    const handler = (e: { data: any; }) => {
        callback&&callback(e.data);
    }
    channel.addEventListener('message',handler)
    return ()=>{
        channel.removeEventListener('message', handler) 
    }
} 

很简单的两行代码,一个发送,一个监听,监听返回一个移除函数

在页面中引用函数就可以了

import {listenMsg,sendMsg} from '@/utils/crossTagMsg'

const send = ()=>{
    sendMsg('send',{name:'send'})
}

const unmountedListenMsg = listenMsg((info:any)=>{
    console.log(info.content)
})

onUnmounted(unmountedListenMsg)

 

  • window.postMessage() 方法允许在不同的标签页之间进行跨域通信,并且是一种安全的方式来实现跨标签页通信。下面是使用 window.postMessage() 进行跨标签页通信的基本步骤:

  在发送消息的标签页(发送方):

// 发送消息到目标标签页
const targetWindow = window.open('目标标签页的URL', '_blank'); // 打开目标标签页
targetWindow.postMessage('Hello from sender', '目标标签页的源');

// 监听来自目标标签页的响应消息
window.addEventListener('message', function(event) {
  if (event.source === targetWindow) {
    console.log('Received response:', event.data);
  }
});

  在接收消息的标签页(接收方):

// 监听来自发送方标签页的消息
window.addEventListener('message', function(event) {
  if (event.origin === '发送方标签页的源') {
    console.log('Received message:', event.data);

    // 发送响应消息给发送方标签页
    event.source.postMessage('Hello from receiver', event.origin);
  }
});

上述代码中,发送方标签页使用 window.open() 方法打开目标标签页,并使用 targetWindow.postMessage() 发送消息到目标标签页。在接收方标签页中,使用 window.addEventListener() 监听来自发送方标签页的消息,并在收到消息后发送响应消息。

在 postMessage() 方法中,第一个参数是要发送的数据,可以是字符串、数字、对象等。第二个参数是目标窗口的源(origin),用于指定接收方标签页的源。这是为了确保只有来自指定源的消息才会被接收和处理,以提供安全性。

需要注意的是,为了确保安全性,需要在通信的两个标签页之间建立信任关系,即确保目标标签页的源是你所期望的,并且不接受来自未知或不信任的源的消息。

通过使用 window.postMessage() 方法,你可以在不同的标签页之间进行跨域通信,并传递数据和消息。这种方式适用于需要在不同标签页之间进行实时通信或共享数据的场景。

 

 

  • visibilitychange 可以监听页面的状态,判断页面的显示和隐藏,当页面显示的时候可以重新请求最新的数据
window.addEventListener('visibilitychange',function(e:any){
    if (document.visibilityState === 'visible') {
        // 页面显示
        console.log('页面显示');
        // 执行页面显示时的操作 更新数据
    } else if (document.visibilityState === 'hidden') {
        // 页面隐藏
        console.log('页面隐藏');
        // 执行页面隐藏时的操作
    }
})
  • Server-Sent Events(SSE)是一种用于在客户端和服务器之间实现实时单向通信的技术。它允许服务器向客户端推送数据,而无需客户端发送请求。

    SSE 基于 HTTP 协议,使用了长轮询(Long Polling)的机制。客户端通过向服务器发送一个 HTTP 请求,该请求保持打开状态,直到服务器有新的数据可用或连接超时。当服务器有新数据时,它会将数据作为一个持久连接的响应发送给客户端。

    使用 SSE 的关键是服务器端需要发送特殊格式的数据,遵循 SSE 的规范。服务器发送的数据被组织为一系列的事件(events),每个事件具有一个事件类型和数据字段。客户端通过监听相应的事件类型来处理接收到的数据。

下面是一个使用 SSE 的示例:

服务器端代码(Node.js):

const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
  });

  // 发送事件及数据到客户端
  res.write('event: message\n');
  res.write('data: Hello, world!\n\n');

  // 模拟每秒钟发送一个事件
  setInterval(() => {
    res.write('event: message\n');
    res.write(`data: Current time is ${new Date().toLocaleTimeString()}\n\n`);
  }, 1000);
}).listen(3000);

客户端代码(JavaScript):

const eventSource = new EventSource('/stream');

eventSource.addEventListener('message', (event) => {
  const data = event.data;
  console.log('Received message:', data);
});

在上述示例中,服务器创建了一个 HTTP 服务器,当客户端向 /stream 路径发出请求时,服务器会将响应的 Content-Type 设置为 text/event-stream,表示这是一个 SSE 连接。服务器通过发送以 "event" 和 "data" 字段组成的事件响应,向客户端推送数据。

客户端使用 EventSource 对象来建立 SSE 连接,并通过事件监听器来处理接收到的事件。在上述示例中,客户端监听了 message 事件,并在事件发生时将数据打印到控制台。

SSE 提供了一种简单而有效的方式来实现服务器向客户端的实时数据推送,适用于需要实时更新数据的应用程序,如聊天应用、实时通知、股票报价等。它相对于传统的轮询方式具有更低的延迟和更高的效率。

标签:标签,通信,发送,message,data,event,客户端
From: https://www.cnblogs.com/ximenchuifa/p/17839465.html

相关文章

  • matlab plot 画图 刻度标签
    指定坐标轴范围您可以设置x轴、y轴和z坐标轴范围,以控制数据在坐标区上的显示位置。您也可以更改x轴线和y轴线的显示位置(仅适用于二维绘图),或反转值沿每条轴递增的方向。更改坐标轴范围创建一个线图。使用xlim和ylim函数指定坐标轴范围。对于三维绘图,请使用zlim函......
  • 网络通信协议随笔
    网络通信协议随笔  TCP,UDP协议:TCP相当于打电话,需要接通才能传递信息,UDP像发短信,不需要先确定连接,可以直接发;TCP协议发送消息:1.根据ip地址,访问端口定义socket连接,2.通过socket连接获取intputStream流,调用输出流write()方法写数据,数据格式为byte[]Socketsocket=new......
  • iframe 通信
    postMessage接口允许窗口之间相互通信,无论它们来自什么源。因此,这是解决“同源”策略的方式之一。它允许来自于marh.com的窗口与来自于qq.com的窗口进行通信,并交换信息,但前提是它们双方必须均同意并调用相应的JavaScript函数。这可以保护用户的安全。这个接口有两个部分。1......
  • 工业智能网关实现MQTT协议与物联网平台的数据通信
    随着工业物联网技术的不断发展,越来越多的设备和系统需要实现数据共享。MQTT是一种基于发布/订阅模式的轻量级消息传输协议,在物联网各种场景应用广泛,成为许多设备与物联网平台通信的标准协议之一。 物通博联推出的工业智能网关具备多样设备接入、数据采集和传输的边缘计算网关,支持......
  • 升讯威在线客服系统的并发高性能数据处理技术:实现拔网线也不丢消息的高可靠通信(附视频
    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。客服系统开发过程中,最让我意外的是对TCP/IP协议的认识。过去一直认为TCP/IP是可靠的连接,加上过去开发的软件网络环境比较稳定,很少在这个问题上纠结......
  • 隐式空标签与显式空标签
    隐式空标签:特殊标签3,执行次末跳弹出解析:倒数第二跳直接弹出,提高线路,直接将FEC转递给FIB表,不在经过LFIB显示空标签:标签为0,不执行次末跳弹出解析:按部就班执行标签交换,通过egress执行,通过LFIB转给FIB......
  • Linux进程间通信模式
    管道是一种单向传输数据的机制,它其实是一段缓存,里面的数据只能从一端写入,从另一端读出。如果想互相通信,我们需要创建两个管道才行。管道分为两种类型,“|”表示的管道称为匿名管道,意思就是这个类型的管道没有名字,用完了就销毁了。就像上面那个命令里面的一样,竖线代表的管道随着命令......
  • 量子计算和量子通信技术
    一、定义量子计算和量子通信技术是一种基于量子力学原理的计算和通信技术,与传统计算和通信技术相比,具有更高的计算速度和更高的安全性。量子计算技术利用量子比特(qubit)替代传统计算机中的位(bit),利用量子态的叠加和纠缠等特性,实现更快速的计算。量子通信技术利用量子纠缠和量子密钥分......
  • 软件分类——博客园标签分类以及“博客网页编辑博客,如何插入Excel中的表格,并且可在网
    .NET技术:后端开发:软件设计:前端开发:企业信息化:移动端开发:软件工程:数据库:操作系统:其他分类:.NET新手区Java架构设计Html/CssBPMAndroid开发敏捷开发SQLServerWindows非技术区ASP.NETPython面向对象JavaScriptSharePointiOS开发项目与团队管理Orac......
  • 微前端 micro-app 传参、通信
    微前端micro-app传参、通信 环境及配置,参考:https://www.cnblogs.com/1285026182YUAN/p/17828681.html 1. 应用传参主应用:<template><divclass="container"><micro-appname="my-app-page1"url="http://localhost:5173/stand&quo......