laydate回调逻辑取决于版本、配置项和按钮类型:done全版本兼容但需通过value判空;change实时触发但不适用于最终确认;onConfirm/onclear仅v5.1.0+支持;choose已废弃。
laydate 的回调逻辑不是“选完就走”,而是取决于你用哪个回调、怎么配按钮、以及当前用的是哪个版本——尤其 onclear 和 onconfirm 在旧版里根本不存在,硬写进去不会执行。
done 回调:最常用但容易误判清空动作
done 是唯一全版本兼容的回调,它会在点击「确定」「现在」「清空」甚至手动输入后失焦时都触发。但它的第一个参数 value 是唯一可靠信号:
- 选日期后:
value是格式化字符串(如"2026-07-01") - 点清空后:
value是空字符串""(不是null或undefined) - 不要依赖
date对象判空——清空时它仍返回默认时间(如{year: 2026, month: 6, date: 1}) - 如果同时要重置关联控件的
min/max,必须在value === ""分支里手动设回原始值,否则联动会卡住
change 回调:适合实时响应年/月切换,但不适用于“确认后才生效”场景
change 在用户滚动年份、点击左右箭头、或点选某个月时立即触发,不是等点「确定」才执行。它适合做实时加载(比如按年查报表),但不适合校验或提交:
- 年选择器(
type: 'year')下,change比done更早触发,且只传value(如"2025")和date - 日期选择器中,每点一次日历格子都会触发
change,频繁调用可能影响性能 - 它不等用户点「确定」,所以不能替代
done做最终确认逻辑
onConfirm 和 onclear:v5.1.0+ 才支持,旧版必须手动模拟
如果你用的是 layui 2.8.x 自带的 laydate(通常是 v5.0.9),onConfirm 和 onclear 配置项直接被忽略。此时只能靠 DOM 操作或 done 判空:
-
onConfirm只在点「确定」按钮时触发,适合做最终校验(比如检查是否晚于开始时间);但 v5.0.x 不识别,得手动绑定:document.querySelector('.layui-laydate-footer .layui-btn-primary').onclick -
onclear同理,v5.0.x 不支持,必须用done中判断value === ""来模拟 - 手动绑定时注意:清空后要同步调用
picker.close()关闭面板,否则日历还悬着 - 获取实例要用
laydate.getInst('#elem'),不是laydate.render()的返回值(后者只首次有效)
choose 回调已废弃,别再用
choose 是 laydate v1.x 的老写法,从 v5.0 开始就被标记为废弃,文档里不再提及。它和 done 行为类似,但参数顺序不同、缺少 endDate,且新版中可能不触发或行为异常:
- 新项目一律用
done或change - 如果看到旧代码里还有
choose: function(value),优先替换成done: function(value, date, endDate) - 不要混用
choose和done,会导致重复执行
真正麻烦的不是写哪个回调,而是搞清你手里的 laydate 到底是哪个版本——laydate.v5.0.9 和 v5.1.0+ 对同一个配置项的反应完全不同,不查版本号就瞎配,八成白忙活。











