需用事件委托监听表格容器的input事件,匹配textarea.layui-textarea,结合tableid、field和rowindex生成唯一key存入localstorage,并在表格渲染完成后空值时恢复,同时监听focusout防软键盘丢失。

layui文本域 edit: 'textarea' 怎么监听内容变化并存 localStorage
layui 表格里用 edit: 'textarea' 开启多行编辑后,table.on('edit') 只在失焦或点击其他单元格时触发,无法捕获实时输入。想自动保存草稿,不能依赖这个事件——得自己监听目标 input 元素的 input 事件。
关键点是:Layui 动态生成的 textarea 是临时 DOM,直接绑定事件容易失效。必须用事件委托,挂到表格容器上,并过滤出当前编辑中的 textarea:
- 监听
layui-table-box或你初始化表格的父容器的input事件 - 用
e.target.matches('textarea.layui-textarea')判断是否为正在编辑的 textarea - 拿到所在
td的data-field和data-index,组合成唯一 key,例如draft-table-user-list-sign-12 - 加防抖(推荐 1000ms),避免中文输入法连续触发污染存储
怎么避免草稿互相覆盖或存错位置
表格多行、多列共存时,光靠字段名(如 sign)当 key 必然串号。必须把上下文信息打包进 key:
- key 格式建议:
draft-${tableId}-${field}-${rowIndex},其中tableId来自table.render({ id: 'user-list' }),rowIndex从td[data-index]提取 - value 存纯字符串,不要 JSON.stringify —— textarea 值本身就是字符串,再套一层反而增加解析成本
- 存之前先比对:如果新值和 localStorage 里已有的值相同,跳过写入,减少无效 I/O
- 特别注意分页场景:
data-index是当前页内序号,不是全局 ID;若需跨页一致,应改用行数据里的唯一标识(如obj.data.id)拼 key
页面刷新后如何安全恢复草稿
恢复不是简单赋值,时机和条件错了会覆盖用户刚输入的内容或引发框架状态错乱:
- 必须等表格完全渲染完成(
done回调之后)再执行恢复逻辑,否则td还没生成,找不到目标元素 - 只在 textarea 当前为空时才恢复:
if (!$(targetTextarea).val().trim()) { $(targetTextarea).val(draft) } - 恢复后手动派发
input事件:targetTextarea.dispatchEvent(new Event('input', { bubbles: true })),否则 layui 不会更新内部缓存,后续编辑可能丢失变更 - 如果用了富文本插件(如 layedit),别直接操作 textarea,得调对应 API(如
layedit.getContent(editIndex))读写,localStorage 存的是 HTML 字符串
移动端软键盘收起时草稿丢失怎么办
Android/iOS 软键盘收起常触发 blur,但此时 input 事件未必已发出,导致最后几个字没存进去。不能只靠 input 事件兜底:
- 额外监听
focusout事件(比blur更可靠),在它触发时强制保存一次 - 对 textarea 加
data-autosave="true"属性,方便统一控制哪些列启用草稿 - 真机测试必不可少:部分安卓 WebView 对
input事件支持不全,可降级为监听compositionend(中文输入完成)+keyup(英文/数字)组合 - 别依赖
window.beforeunload—— 移动端该事件几乎不触发,且 layui 表格重绘后 DOM 引用易失效











