HTML本身不提供编辑冲突检测能力,document和form元素无内置版本号或时间戳;“对方已修改”提示必须由后端返回唯一标识(如revision_id或ETag),前端提交前比对,409时提示并暂存输入后reload恢复。

HTML 本身不处理编辑冲突,所有“多人同时改同一文件”的冲突必须由外部机制介入——要么靠协作编辑器(如 CodeSandbox、VS Code Live Share)实时同步并高亮差异,要么靠后端配合前端做版本比对与提交拦截。
为什么 document 和 form 没有内置冲突检测
HTML 标准里 document、form 元素没有任何版本号、时间戳或锁机制。所谓“对方已修改”,不是浏览器能感知的,而是你主动从服务端拉取最新内容后,和本地 textarea.value 或 DOM 快照做 diff 的结果。
- 常见错误:监听
onbeforeunload并以为它能发现别人改了——它只响应本机页面即将离开,完全不接触服务端状态 - 更错的做法:仅用
localStorage存个本地时间戳,就宣称“我最后保存过”,多人之间根本不同步 - 真正可行的前提:每次编辑提交前,必须和服务端当前版本比对(比如带
ETag或version字段)
用 htmx 实现轻量级冲突拦截(无 WebSocket 也能做)
如果你不想搭完整 OT/CRDT 系统,但又要防止覆盖他人修改,htmx 配合简单服务端校验就能做到。核心是让每次 hx-post 请求带上当前内容的哈希或版本号,服务端判断是否过期。
- 前端示例:
<textarea hx-post="/save" hx-include="[name='version']" hx-trigger="input delay:1s" name="content"></textarea> <input type="hidden" name="version" value="v123">
- 服务端收到请求后,先查数据库当前
version是否仍为v123;如果不是,返回409 Conflict+ 提示文案 -
htmx默认会把409渲染到hx-target区域,你可返回一段含“对方已修改,请刷新后重试”的 HTML 片段 - 注意:这个方案不解决“实时看到别人在打字”,只解决“提交时不覆盖”——够用且零依赖 WebSocket
VS Code Live Share / CodeSandbox 怎么避免手动 merge 冲突
这类工具本质是绕过了 Git 层面的文本合并,直接在编辑器层做操作同步。它们不生成传统 Git conflict markers(如 <<<< HEAD),但仍有边界情况要留意:
立即学习“前端免费学习笔记(深入)”;
- 当两人同时修改同一行 HTML 标签的
class属性时,Live Share 会尝试合并成class="a b c",但如果一方删了整个标签、另一方只改属性,就可能丢内容——此时需人工确认 - CodeSandbox 的自动保存不等于 Git commit;导出前务必手动
git pull再git push,否则本地仓库可能落后线上沙盒 - 光标实时可见是假象:网络延迟 >200ms 时,你看到的“对方光标”其实是 300ms 前的位置,结构性改动(如删 div 块)仍建议先发消息再操作
真正难的从来不是“怎么显示冲突”,而是“怎么让用户愿意看提示并正确响应”。所有技术方案都默认用户会刷新页面、会点“接受远程版本”、会在改大结构前喊一声——这些没法用代码强制,只能靠流程卡点和 UI 强提示来兜底。



















