change回调在每次日期切换时实时触发,非仅确认后执行;done仅在明确确认时调用,适合收尾操作;change适用于实时预览与校验,done用于提交前最终处理。
laydate 的 change 回调不是“选完才触发”
很多人误以为 change 只在用户点击确定按钮后执行,实际它会在**每次面板内日期被切换时就触发**——比如点年份左/右箭头、切月份、点日历格子、甚至手动输入并失焦,都会进这个回调。它不等“确认”,也不管你有没有点底部按钮。
这意味着:change 适合做实时预览、联动更新、校验格式;但不适合做“提交前最终确认”逻辑——那该用 done。
-
change的value是格式化后的字符串(如"2026-07"),date是对象(含year/month/date等字段) - 如果
type: 'month',date.date恒为 1,别拿它算具体哪天 - 频繁触发时注意性能:避免在
change里发请求或重绘大列表
为什么 done 不能替代 change 做实时响应
done 确实只在用户明确“确认”后调用(点确定、点今天、点空白关闭、或回车),但它**无法区分操作来源**:点日历格子、输文字、点“今天”按钮,触发的 done 完全一样。如果你需要“用户点了‘今天’才刷新图表”,光靠 done + 比对日期字符串会出错——手动输入“2026-07-02”也会触发。
- 正确做法是结合
extrabtns+ready回调监听按钮 DOM 点击(如data-id="today") -
done更适合收尾动作:同步表单值、触发表单验证、关闭关联弹窗 - 若同时用了
showBottom: false,done实际变成“面板关闭即触发”,行为更不可控
change 里手动清空面板容易漏掉 DOM
常见需求:选完月份立刻关闭面板,避免用户继续点其他项。直接 $(".layui-laydate").remove() 看似简单,但有坑:
- 面板可能还没渲染完就执行 remove → 找不到元素,静默失败
- 多个日期控件共存时,
$(".layui-laydate")会删掉所有,不只是当前实例 - 没等 laydate 内部状态清理完,可能导致下次打开异常(比如年份切换失效)
稳妥写法是用 laydate.getEndDate() 获取当前实例句柄,或在 change 里加延时:setTimeout(() => { $(".layui-laydate").remove(); }, 10);更推荐用 showBottom: false 配合 closeNow: true(需 Layui 2.9+)。
监听 select 切换后动态初始化日期控件
下拉框(select)选“月统计”再渲染 laydate,必须注意两个关键点:
- 确保
form.on('select(xxx)')的lay-filter值与 HTML 中一致,且该事件绑定在layui.use('form')内 - 每次重新
laydate.render()前,先销毁旧实例:laydateInstance && laydateInstance.destroy(),否则内存泄漏+事件重复绑定 - 动态生成的 input 元素(如
id="date-month")要确保已插入 DOM,再传给elem,否则报错"elem is null"
复杂点在于:不同 type('date'/'month'/'year')对应不同的最大日期限制逻辑,max 参数必须在每次 render 前重算,不能复用上一次配置。











