页面用 layui 搭的,按钮上写着 lay-submit,点了之后页面不跳、控制台不报错、断点也进不去。删了重写一遍还是这样,最后一查,容器是后来用 innerHTML 插进去的,根本没渲染。

三个东西必须对上

第一,按钮要有 lay-submit 属性,或者 type 设成 submit;第二,按钮上的 lay-filter 名字,要和 form.on 里监听的名字一模一样,大小写都算;第三,表单所在区域得被 form.render 渲染过。少一个,事件就绑不上。

layui.use([form], function () { var form = layui.form; form.on(submit, function (data) { console.log(data.field); return false; }); });

submit 其实是字符串监听名,实际写法里要用单引号,这里只是示意。返回 false 很关键,否则表单会按原生方式提交,页面刷新,看着就像没反应。

动态插入的表单要重新渲染

弹层里加载的 HTML,插进 DOM 之后要再执行一次 form.render(),复选框、下拉框才会变成 layui 的样式,隐藏的 select 没渲染时取不到值。lay-filter 加在 form 容器上,不要加在里面的 div 上。

取值和校验

  • data.field 里拿到的是表单里带 name 的控件值
  • lay-verify 的规则名要和 form.verify 里注册的一致
  • 文件上传不走 submit,用 upload 模块单独处理

2.8 之后推荐用 layui.use 按模块引入,别再全局挂一堆脚本。排查时先看渲染后的 DOM 里有没有 layui-form 这个 class,一眼就能判断渲染没生效。