自动保存草稿需防抖设计:单字段比对内容是否变更再请求,多字段隔离timer并带标识更新,配合isUnsaved标记与beforeunload同步兜底,延迟按场景动态调优(普通文本600–1000ms,富文本≥1200ms)。

自动保存草稿用防抖,关键不是“加个 setTimeout 就完事”,而是要兼顾数据不丢、不覆盖、不卡顿、关页有兜底。靠简单延时远远不够,得围绕编辑行为本身设计。
单字段输入必须做内容比对
用户敲空格、删换行、光标乱跳都可能触发 input 事件,但内容未必真变。直接发请求等于浪费资源还埋雷。
- 保存前对比当前值与上次成功保存的值(字符串全等或深比较,富文本建议用 innerHTML 或序列化后的结构)
- 若未变化,跳过请求,不清 timer —— 避免误清导致后续停顿失效
- 示例中用
editor.value !== lastSavedValue是基础,但需注意 textarea 换行符差异、富文本 DOM 冗余属性等干扰
多字段编辑器要独立防抖实例
标题改了、正文还在打字,不能因为改标题就取消正文的待保存任务——共用一个 timer 会互相干扰。
- 用 Map 或对象按字段名隔离 timer ID,比如
timers.set('title', timeoutId) - 每个字段保存时带上标识,如
{ field: 'content', value: 'xxx' },服务端按字段更新,避免整篇覆盖 - 配合
isUnsaved全局标记:任一字段内容变更即设为 true;任一字段保存成功且内容匹配才设为 false
必须配合 beforeunload 做强兜底
防抖再稳也拦不住用户狂点关闭按钮。仅靠定时器无法覆盖突发退出场景。
- 每次输入后立即置
isUnsaved = true,保存成功回调里校验响应体 + 内容一致性后再置false - 监听
beforeunload,若isUnsaved为 true,发起一次同步保存(fetch(..., { method: 'POST', keepalive: true })) - keepalive 确保页面卸载时请求仍能发出,浏览器支持良好(Chrome/Firefox/Edge 均可用)
延迟时间要按场景调优,别硬套 300ms
800ms 不是金科玉律。太短易误触,太长用户感知“没保存”。
- 普通文本编辑:600–1000ms 较稳妥,兼顾响应感与防抖效果
- 富文本含图片/代码块:建议 ≥1200ms,避免格式操作频繁打断计时
- 可动态调整:首次输入后设较长延迟,连续快速修改后逐步缩短(如降到 400ms),用户停顿时再拉回
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











