textarea 仅设 maxlength 属性不足以可靠限制字数,必须结合 oninput 实时截断,并处理 compositionstart/end 以兼容中文输入法,粘贴需 setTimeout 延迟读取,动态插入元素要确保事件重绑,表格中须用 templet 自定义模板而非 edit:"textarea"。
直接在 textarea 上加 maxlength 属性有效,但必须配合 oninput 实时截断
单纯写 maxlength="100" 在现代浏览器中能阻止部分超长输入,但粘贴、拖入文本、中文输入法「上屏前」等场景会绕过限制。layui 的 layui-textarea 类本身不干预原生行为,所以得靠 js 主动控制。
-
oninput是核心:每次按键、粘贴、删除都触发,适合实时校验和截断 - 别只依赖
onpropertychange(IE 专属,现代已废弃)或onkeyup(无法捕获鼠标粘贴) - 必须在截断后手动重置
value,否则 DOM 和实际值不同步,导致光标跳到末尾或重复触发 - 示例写法:
<textarea maxlength="100" oninput="limitText(this, 100)" class="layui-textarea"></textarea>
limitText 函数要同时处理粘贴、中文输入法和光标位置
只做 if (val.length > max) val = val.substr(0, max) 会破坏中文输入体验——用户正在用拼音打「中国」,还没上屏就卡住,输入框直接清空或错乱。必须识别 compositionstart / compositionend 状态。
- 监听
compositionstart时暂停截断逻辑,避免干扰输入法中间态 - 监听
compositionend后再执行长度检查,此时才是最终上屏内容 - 粘贴事件(
paste)需setTimeout(..., 0)延迟读取,因为粘贴内容在事件回调里还不可见 - 不要用
document.execCommand或selection操作光标——Layui 表单内嵌场景下容易失焦或失效
显示剩余字数时,.word 元素必须用绝对定位 + 正确选择器
很多代码把计数 <div class="word">0/100</div> 放在 <textarea></textarea> 同级,但没设 position: relative 的父容器,结果数字飘到页面角落。Layui 的 .layui-input-block 必须显式加该样式。
- CSS 中必须写:
.layui-input-block { position: relative; }和.word { position: absolute; right: 10px; bottom: 8px; } - JS 更新时用
$(obj).next('.word').text(`${curr}/${max}`),不能写成$('.word')全局匹配,否则多个 textarea 会互相覆盖 - 如果 textarea 是动态插入(如弹窗表单),绑定事件前先确保
.word已存在,否则.next()返回空
表格内单元格编辑的 textarea 不能用内置 edit: "textarea" 配置
Layui 表格的 edit: "textarea" 是封装过的,不透传 maxlength,也不支持自定义事件绑定。想限制字符数,必须放弃这个快捷方式,改用 templet 自定义模板。
- 模板里写完整
<textarea maxlength="200" oninput="limitCellText(this, 200)"></textarea> - 渲染后需手动绑定
compositionstart/end,且每次表格重载(table.reload())都要重新绑定,建议用事件委托到tbody - 注意:表格列宽若固定,
textarea高度撑开可能影响行高,可加style="max-height: 120px; overflow-y: auto;" - 实测 Firefox 和某些安卓 WebView 下,纯
maxlength对表格内动态插入的textarea完全无效,必须走 JS 截断路径
addEventListener。











