最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
HTML怎么做聊天撤回消息_HTML聊天消息撤回提示实现纯干货
时间:2026-07-22 10:58:53 编辑:袖梨 来源:一聚教程网
撤回消息本质是DOM节点隐藏+时间戳标记,需保留原始节点、添加revokeTime字段、用CSS控制显隐,并校验时效与权限,确保DOM、内存、服务端三态一致。
撤回消息本质是 DOM 节点的隐藏 + 时间戳标记
HTML 本身没有“撤回”语义,所谓撤回,就是把已渲染的消息 <div> 或 <li> 可视化隐藏,并追加一条「已撤回」提示。关键不是删掉节点(否则无法审计),而是控制显示状态 + 记录操作时间。
常见错误是直接 remove() 元素,导致后续想展示「用户撤回了一条消息」时无从下手;或者用 display: none 却没同步更新消息对象的 isRevoked 字段,造成状态不一致。
- 必须保留原始消息 DOM 节点,仅通过 class 切换控制显隐(如添加
revoked类) - 对应 JS 消息对象需有
isRevoked: true和revokeTime字段 - 服务端返回的消息结构最好自带
revoked_at字段,避免客户端自行打时间戳不准
用 CSS 实现「已撤回」提示文案与样式隔离
撤回提示不是新发一条消息,而是对原消息容器的视觉覆盖或替换。推荐在原消息 DOM 内部插入一个 <span class="message-revoked">,而不是额外追加 <li> —— 否则会破坏消息列表的时间流顺序,也难做动画。
示例结构:
立即学习“前端免费学习笔记(深入)”;
<div class="message-item" data-id="msg_123"> <span class="message-content">你好呀</span> <span class="message-revoked" style="display:none">消息已撤回</span></div>
- 初始状态:只显示
.message-content,.message-revokeddisplay: none - 撤回时:隐藏
.message-content,显示.message-revoked,并加 class 如revoked用于过渡动画 - 字体颜色、字号建议比普通消息更浅(如
color: #999),且禁用选择(user-select: none)
JavaScript 触发撤回要校验时效与权限
前端不能无条件响应撤回请求。真实场景中,撤回通常有窗口期(如 2 分钟内),且只能撤自己的消息。这些判断必须在调用 revokeMessage() 前完成,否则会发无效请求或暴露逻辑漏洞。
- 检查
message.senderId === currentUser.id,防止伪造 data-id 撤他人消息 - 计算当前时间与
message.sentTime的差值,超过阈值(如120 * 1000ms)直接拒绝,不发请求 - 撤回成功后,立即更新 DOM 状态,并在内存消息列表中同步设置
isRevoked = true,避免重复点击 - 失败时(如服务端返回 403 或超时),需恢复 UI 并提示「撤回失败,请稍后重试」,不要静默吞错误
服务端返回撤回事件后,如何安全更新已有消息
WebSocket 或长轮询收到撤回通知(如 { type: 'message_revoked', message_id: 'msg_123' })时,不能直接 querySelector 找节点然后 innerHTML = '已撤回' —— 这会清空原有事件监听器(比如复制按钮、头像点击等)。
- 应只操作预设的提示元素:
el.querySelector('.message-revoked').style.display = 'inline' - 同时确保该消息 DOM 存在(可能已被滚动移除或分页清理),找不到就跳过,不报错
- 如果用了虚拟滚动,撤回状态需同步到数据源(如 messages 数组),下次渲染时自动带出
isRevoked状态 - 注意 XSS:撤回提示文案必须是固定字符串(如硬编码的「消息已撤回」),绝不能拼接服务端传来的任意字段
撤回功能最易被忽略的是状态同步粒度——DOM、内存数据、服务端记录三者必须严格一致,差一个就出现「明明撤了却还显示原文」或「撤回提示叠在未撤回消息上」这类问题。
相关文章
- hbase 数据恢复的工具哪个好 07-31
- mysql一条SQL清理用户的4步操作步骤(顺序一旦写错就翻车) 07-31
- MySQL安装、登录和退出等简单配置操作步骤 07-31
- MySQL完整SQL指令实战示例(含详细解释) 07-31
- Debian C++代码风格规范 07-31
- Debian C++项目构建流程 07-31