为DevExpress ASPxDateEdit添加JS快捷键遇跨年异常求解决
问题分析与解决方案
核心问题原因
你的代码中所有日期修改操作都错误地基于当前系统时间(new Date())而非控件中的目标日期(currdate),导致跨年时日期被重置到当前年份。此外还存在以下问题:
- Y键逻辑未处理控件已有日期的情况,且直接加365天会忽略闰年问题
- 事件阻止方法的参数错误,未传入正确的
e.htmlEvent - 日期修改的API使用方式不符合JavaScript Date对象的正确用法
修正后的完整代码
function DateHotKey(s, e) { var c = e.htmlEvent.code; var k = e.htmlEvent.key; if (isNaN(parseFloat(k))) { switch (c) { case "KeyT": // 设置今日日期 var today = new Date(); s.SetDate(today); ASPxClientUtils.PreventEventAndBubble(e.htmlEvent); break; case "KeyM": // 空值时设为今日+1个月,否则当前日期+1个月 var currdate = s.GetDate(); if (currdate === null) { currdate = new Date(); } var newDate = new Date(currdate); newDate.setMonth(newDate.getMonth() + 1); s.SetDate(newDate); ASPxClientUtils.PreventEventAndBubble(e.htmlEvent); break; case "KeyQ": // 空值时设为今日+3个月,否则当前日期+3个月 var currdate = s.GetDate(); if (currdate === null) { currdate = new Date(); } var newDate = new Date(currdate); newDate.setMonth(newDate.getMonth() + 3); s.SetDate(newDate); ASPxClientUtils.PreventEventAndBubble(e.htmlEvent); break; case "KeyY": // 空值时设为今日+1年,否则当前日期+1年 var currdate = s.GetDate(); if (currdate === null) { currdate = new Date(); } var newDate = new Date(currdate); newDate.setFullYear(newDate.getFullYear() + 1); s.SetDate(newDate); ASPxClientUtils.PreventEventAndBubble(e.htmlEvent); break; default: switch (k) { case "+": // 空值时设为今日,否则当前日期+1天 var currdate = s.GetDate(); if (currdate === null) { currdate = new Date(); } var newDate = new Date(currdate); newDate.setDate(newDate.getDate() + 1); s.SetDate(newDate); ASPxClientUtils.PreventEventAndBubble(e.htmlEvent); break; case "-": // 空值时设为今日,否则当前日期-1天 var currdate = s.GetDate(); if (currdate === null) { currdate = new Date(); } var newDate = new Date(currdate); newDate.setDate(newDate.getDate() - 1); s.SetDate(newDate); ASPxClientUtils.PreventEventAndBubble(e.htmlEvent); break; } break; } } }
关键修正点说明
基于目标日期创建副本:
所有日期修改操作都先通过new Date(currdate)创建目标日期的副本,再对副本进行月份/年份/天数调整,确保修改基于控件中的日期而非当前系统时间。修复Y键逻辑:
- 新增对控件已有日期的判断,符合需求中“已有日期则增加1年”的规则
- 使用
setFullYear方法替代加365天,自动处理闰年问题
修正事件阻止参数:
将ASPxClientUtils.PreventEventAndBubble(htmlEvent)改为ASPxClientUtils.PreventEventAndBubble(e.htmlEvent),确保正确阻止事件冒泡和默认行为统一使用SetDate方法:
对DevExpress ASPxDateEdit控件统一使用SetDate方法设置日期,与控件API保持一致
内容的提问来源于stack exchange,提问作者Gary Jorgenson
相关产品推荐
相关产品推荐

