根源在于lay-verify仅监听input/select/textarea的value变化,而富文本内容存在于DOM节点中,非表单元素value属性,Layui表单模块无法读取;必须通过form.verify()注册自定义规则,或同步内容至隐藏textarea实现校验。
lay-verify="required" 对富文本编辑器无效的根源
因为 lay-verify 默认只监听 input、select、textarea 的原生值变化,而第三方富文本(如 layedit、tinymce、quill)的内容存在 dom 节点里,不是表单元素的 value 属性。layui 表单模块压根读不到它——哪怕你给容器加了 lay-verify="required",也完全不触发校验逻辑。
必须用 form.verify() 注册自定义 required 规则
这是唯一可靠的方式。Layui 的 form.verify() 允许你接管任意字段的校验逻辑,包括非标准表单控件。
- 把富文本容器(比如一个
div或textarea)加上name属性,例如:<div id="content-editor" name="content"></div> - 在 JS 初始化后注册规则:
layui.use('form', function(){ var form = layui.form; form.verify({ content: function(value, item){ // item 是当前被校验的 DOM 元素(即那个 div) var html = $(item).html().trim(); var text = $(item).text().trim(); if (!html || !text) { return '内容不能为空'; } // 可选:过滤纯空格、换行、<br> 等无意义内容 if (/^[\s\uFEFF\xA0]*$/.test(text) || /^( |\s*<br\s*\/?>\s*)*$/.test(html)) { return '内容不能为空'; } } }); }); - 提交按钮仍用
lay-submit,但对应字段的lay-verify必须设为该规则名:<div name="content" lay-verify="content"></div>
动态同步富文本内容到隐藏 textarea(兼容老版本或简化逻辑)
某些场景下,你不想改校验逻辑,而是想“骗过” Layui —— 让它以为你在校验一个普通 textarea。这时可在富文本初始化后,绑定其内容变更事件,把 HTML 同步进一个隐藏 textarea,再对这个 textarea 做 lay-verify="required"。
- HTML 中加隐藏域:
<textarea name="content_sync" lay-verify="required" lay-reqtext="正文内容不能为空" class="layui-hide"></textarea> - JS 中同步内容(以 layedit 为例):
var editIndex = layedit.build('content-editor', { height: 300, done: function(){ // 每次编辑结束时触发 var html = layedit.getContent(editIndex); $('textarea[name="content_sync"]').val(html); } }); - 注意:
done不覆盖实时校验,若需更及时响应,可监听input或使用setInterval轮询(不推荐),或改用富文本自身的change事件(如 tinymce 的on('Change'))
容易忽略的坑:富文本内容含 script/style 标签或实体编码
用户粘贴内容可能带 <script>、<style> 或未转义的 "、<,导致 html() 取值异常,甚至 JS 报错中断校验流程。
- 不要直接用
$(item).html()做空判断,先做基础清洗:$(item).html().replace(/]+>/g, '').trim() - 避免在
form.verify回调里执行复杂 DOM 操作;校验函数应轻量、同步、无副作用 - 如果后端返回的默认内容含 HTML 实体(如
),.text()会自动解码,但.html()不会——统一用.text().trim()判断纯文本是否为空更稳妥


















