Kendo DatePicker使用前后切换按钮时日期文本消失问题求助
问题根因
- 日期更新逻辑错误:代码中仅通过
setDate()修改Date实例的日部分,未同步更新月份、年份字段,当选中的日期跨月/跨年时,会生成超出min/max限制的非法日期,Kendo DatePicker遇到非法值时会自动清空输入框内容。 - 边界判断逻辑缺陷:仅对比
getDate()返回的日数值,未校验月份、年份,会出现不同月的相同日期误判的问题,导致按钮禁用逻辑失效,进一步触发非法日期赋值。
修复方案
调整日期赋值、边界判断逻辑为基于完整Date实例操作即可,修正后的完整代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>Kendo UI Snippet</title> <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2021.2.616/styles/kendo.default-v2.min.css"/> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <script src="https://kendo.cdn.telerik.com/2021.2.616/js/kendo.all.min.js"></script> </head> <body> <button id="btnPrevDate" type="button">prev</button> <div class="demo-section k-content d-inline-block"> <input id="scheduleDatePicker" title="datepicker" class="w-100" /> </div> <button id="btnNextDate" type="button">next</button> <script> $(document).ready(function(){ var currentDate = new Date(); var selectedDate = new Date(currentDate); var startDate = new Date(currentDate); var endDate = new Date(currentDate); startDate.setDate(currentDate.getDate() - 7); endDate.setDate(currentDate.getDate() + 7); $("#scheduleDatePicker").kendoDatePicker({ value: selectedDate, min: startDate, max: endDate, change: function (e) { var datepicker = $('#scheduleDatePicker').data('kendoDatePicker'); // 直接替换完整Date实例,不要仅修改日部分 selectedDate = new Date(datepicker.value()); // 用时间戳判断完整日期是否相等 $('#btnNextDate').prop('disabled', selectedDate.getTime() === endDate.getTime()); $('#btnPrevDate').prop('disabled', selectedDate.getTime() === startDate.getTime()); } }); $('#btnPrevDate').on('click', function () { var datepicker = $('#scheduleDatePicker').data('kendoDatePicker'); // 基于当前选中日期生成新的日期实例 var newDate = new Date(selectedDate); newDate.setDate(newDate.getDate() - 1); selectedDate = newDate; datepicker.value(selectedDate); $('#btnNextDate').prop('disabled', false); $(this).prop('disabled', selectedDate.getTime() === startDate.getTime()); }); $('#btnNextDate').on('click', function () { var datepicker = $('#scheduleDatePicker').data('kendoDatePicker'); // 基于当前选中日期生成新的日期实例 var newDate = new Date(selectedDate); newDate.setDate(newDate.getDate() + 1); selectedDate = newDate; datepicker.value(selectedDate); $('#btnPrevDate').prop('disabled', false); $(this).prop('disabled', selectedDate.getTime() === endDate.getTime()); }); }); </script> </body> </html>
核心修改点
- 所有日期更新逻辑均替换为生成新的Date实例,避免修改原有实例导致的字段不同步问题
- 边界判断改用
getTime()获取时间戳对比,确保是同一天才触发按钮禁用逻辑 - 简化了重复的判断代码,降低逻辑出错概率
内容的提问来源于stack exchange,提问作者Anna Kegley
相关产品推荐
相关产品推荐

