在laydate的done回调中调用form.submit()或原生submit()可实现选择后自动提交,需确保已加载并render表单模块,且done比change更可靠。
laydate 选择后如何触发表单提交
直接在 laydate.render() 的 done 回调里调用 form.submit() 或原生 submit() 即可,但要注意表单必须已通过 form.render() 初始化,且不能在回调里重复触发渲染或提交逻辑。
-
done是唯一可靠时机:它在用户点击确定、清空、或按回车确认日期后执行,比change更稳定(change在输入框内容变化时就触发,含非法输入、手动删日期等干扰) - 若表单有
lay-submit属性,需先调用form.on('submit(...)')绑定监听,否则form.submit()不会触发校验和提交事件 - 更稳妥的做法是直接调用原生表单的
submit()方法:document.getElementById('yourFormId').submit(),绕过 layui 表单模块限制
常见错误:表单没反应或报错 “form is not defined”
这通常是因为没加载 form 模块,或没调用 form.render()。laydate 自身不依赖 form,但自动提交需要 form 模块支持校验,或你主动跳过校验走原生提交。
- 未引入
form模块:在layui.use()中补全:layui.use(['laydate', 'form'], function(){...}) - 漏掉
form.render():即使表单没用到验证规则,只要用了lay-submit,就必须先 render,否则监听无效 - DOM 未就绪就初始化 laydate:确保
laydate.render()写在layui.use回调内,或包裹在document.ready逻辑中
带验证的自动提交(推荐用于业务表单)
如果表单启用了 layui 校验(required、lay-verify 等),应在 done 中触发 form.submit(),让校验逻辑自然运行,而不是绕过它直接原生 submit。
layui.use(['laydate', 'form'], function(){
var laydate = layui.laydate;
var form = layui.form;
form.render(); // 必须
laydate.render({
elem: '#datePicker',
done: function(value, date, endDate){
// 触发带校验的提交
form.submit('yourFormFilter'); // 对应 form 的 lay-filter="yourFormFilter"
}
});
});
为什么不用 change 回调
change 在每次输入框值变化时都触发,包括用户只输了一半日期(如 “2024-0”)、手动删除内容、甚至焦点离开又回来等场景。这时候调用 submit 会导致无效提交或重复提交。
-
change:适合做实时预览、联动其他字段,不适合提交 -
done:仅当用户明确完成选择(点确定/回车/清空)才触发,语义准确 - 极端情况:用户用键盘输入合法日期后没点确定就失焦——此时
change已触发但done不会,这是设计使然,应引导用户用鼠标点选或回车确认
form.render() 调用时机和 lay-filter 值是否与 form.submit() 参数一致;这两个错一个,提交就静默失败。











