textarea必须置于form内或通过form属性显式关联,且必须设name属性,否则提交时值为空;表格中自适应高度易失效,建议用固定高度+滚动条。

textarea 必须放在 form 内或显式关联 form 属性
直接把 textarea 塞进 td 里,看起来能显示,但提交时值大概率为空——浏览器只收集属于某个 form 的控件数据。没被包裹或没绑定 form 属性的 textarea,等于“游离态”,form.submit() 或序列化时直接忽略。
实操建议:
- 最稳妥:把整张表包在
<form></form>里(注意别嵌套多个form) - 若无法包裹,给
textarea加form="myForm",再配一个同id的<form id="myForm"></form> - 必须设
name属性,否则即使关联了 form,后端也收不到字段名
自适应高度在表格里极难稳定工作
监听 input 事件 + scrollHeight 的套路,在普通容器里可行,但在 table 布局中会频繁失效。根本原因是:表格单元格高度由内容撑开,而 textarea 又反过来试图撑开单元格,形成循环依赖;加上 overflow: hidden、max-height、iOS Safari 的 scrollHeight 计算偏差,结果就是高度跳变、截断、或完全不响应。
更可控的做法:
立即学习“前端免费学习笔记(深入)”;
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 放弃自动撑高,用固定
height(如style="height: 80px;") +overflow-y: auto - 加
resize: none防止用户拖拽破坏列宽 - 若真要动态高度,必须同时限制
min-height和max-height,并手动重置td的vertical-align和padding - 别依赖
scrollHeight精确值,可 fallback 到行数估算:rows = Math.min(8, Math.max(3, Math.ceil(el.value.length / 40)))
Layui 表格里不能直接写 edit: 'textarea'
这个写法会静默失败。Layui 的 edit 属性白名单里没有 'textarea',它只识别 'text'、'number'、'select' 等字符串,遇到未知值就当无效,既不报错也不渲染。
正确路径是用函数返回 HTML 字符串:
- 返回的
textarea必须带class="layui-textarea"才能继承样式和边框 - 初始值得手动拼进去:
+(d.desc || '')+,不会自动填充 - 必须在
done回调里对新插入的textarea绑定click并调用this.focus(),否则双击后还得再点一次才激活 -
table.on('edit(...)')的obj.value永远为空——得用layui.$(obj.tr).find('textarea').val()手动取值,再调obj.update()
别用 contenteditable="true" 给 td
看似一行代码解决,实际埋雷密集:Enter 不提交、Tab 跳不过去、粘贴带样式甚至脚本、移动端长按无反应、Safari 插入 <div> 而非换行符、IE11 行高异常……这些不是偶发 bug,是所有主流浏览器开箱即用就存在的行为。
<p>真正健壮的方案是双击时动态插入 <code>input 或 textarea,并严格处理三个事件:
-
Enter:拦掉默认行为,校验后更新数据源并还原td显示 -
Escape:恢复原始值,移除控件,光标回到td -
blur:仅作兜底,业务逻辑必须明确“失焦=确认”还是“失焦=取消”
表格编辑最难的从来不是怎么放一个输入框,而是怎么让它的生命周期和数据状态完全受控——这点上,任何“省事”的 shortcut 都会在后续排序、筛选、导出时反噬。


















