日期选择控件onchange函数失效问题咨询(附Moment.js代码)
问题排查与修复
你的代码里有两个核心问题导致change事件逻辑失效:
- 错误的日期值获取方式:在初始代码和change事件中,你用
$ctrl_DateRequested.val(moment().format('YYYY-MM-DD'))给moment传值,但val()传参数时是设置输入框的值,返回的是jQuery对象而非日期字符串,moment解析对象会得到无效日期,后续计算自然出错。 - change事件强制覆盖用户输入:事件里的
$ctrl_DateRequested.val(moment().format('YYYY-MM-DD'))会把用户刚修改的日期强行改回当前日期,既不符合需求,也让用户的修改操作失去意义。
修复后的代码如下:
// 初始化:设置当前日期,并计算加10天的日期 var currentDate = moment().format('YYYY-MM-DD'); $ctrl_DateRequested.val(currentDate); var plusDate = moment(currentDate).add(10, 'days').format('DD/MM/YYYY'); $ctrl_ValidityDate.val(plusDate); $ctrl_ReturnDate.val(plusDate); // 日期变更事件处理 $ctrl_DateRequested.change(function (){ // 获取用户修改后的日期值 var selectedDate = $(this).val(); // 校验日期有效性,避免非法输入导致错误 if (moment(selectedDate, 'YYYY-MM-DD').isValid()) { var newPlusDate = moment(selectedDate).add(10, 'days').format('DD/MM/YYYY'); $ctrl_ValidityDate.val(newPlusDate); $ctrl_ReturnDate.val(newPlusDate); } });
关键修正说明:
- 初始化时拆分操作,先获取当前日期字符串,再分别设置输入框和计算目标日期,避免链式调用导致的对象混淆。
- change事件中通过
$(this).val()获取用户实际修改的日期,不再覆盖用户输入。 - 增加日期有效性校验,防止非法输入引发计算错误。
内容的提问来源于stack exchange,提问作者tafreets
相关产品推荐
相关产品推荐

