textarea内容实时存localStorage需加500ms防抖避免中文输入法高频触发,键名应带路径隔离防覆盖;恢复草稿须在DOMContentLoaded后执行并校验空值,HTML/JS/CSS混合代码恢复时禁用innerHTML防XSS,仅存原始字符串并重绑事件。

textarea 输入内容怎么实时存进 localStorage
直接监听 input 事件就行,但别一敲就存——中文输入法下会高频触发组合过程,导致存入半截内容或卡顿。必须加防抖,延迟 500ms 再写入:localStorage.setItem("editor-draft", el.value)。键名建议带上下文隔离,比如 editor-draft-${location.pathname},否则多个编辑页共用同一域名时会互相覆盖。
页面加载时为什么草稿没恢复出来
八成是执行时机错了。DOM 还没就绪就去读取并赋值,document.getElementById("code-editor") 返回 null,或者框架(如 Vue/React)后续初始化把刚填的值又清掉了。必须等 DOMContentLoaded 触发后再恢复;如果是单页应用,得在 mounted 或 useEffect 里做。另外注意空值校验:if (draft !== null && draft.trim() !== ""),避免用 JSON.parse(null) 报错。
保存和恢复 HTML/JS/CSS 混合代码要注意什么
localStorage 只存字符串,不用转 JSON。但恢复时不能直接塞进 innerHTML —— 有 XSS 风险,尤其用户可能粘贴含 <script></script> 的代码。textarea 用 .value 赋值最安全;如果是预览区(contenteditable),用 .textContent 而非 .innerHTML。另外,如果编辑器支持行号、折叠、高亮,这些 UI 状态不能靠存 HTML 恢复,得单独存光标位置、展开节点等结构化数据。
刷新后代码还在,但按钮点击失效了怎么办
这是典型事件监听器丢失问题。如果你把整个编辑器区域(比如一个 div#preview)的 outerHTML 存进 localStorage,再用 innerHTML = storedHtml 插回去,所有绑定的 click、change 都没了。正确做法是:只存原始代码字符串,DOM 结构由模板固定,交互逻辑在页面加载后重新绑定。动态生成的按钮、菜单项也得走“数据驱动渲染”路径,而不是靠还原 HTML。
立即学习“前端免费学习笔记(深入)”;
真正麻烦的是编辑器本身的状态同步——比如光标位置、选区、折叠行、语法错误标记。这些没法靠 localStorage 字符串自动搞定,得配合编辑器 API(如 CodeMirror 的 getCursor()、Monaco 的 getPosition())单独序列化存储。纯文本草稿能保,但“所见即所得”的交互态,得一层层拆开存。



















