Swal警告弹窗触发后jQuery无响应 无法为输入框赋值问题
问题原因
代码存在几个直接导致异常的逻辑错误:
- 业务函数内错误调用
jQuery.noConflict():该方法会释放$对jQuery的引用,只要触发过一次Swal警告分支,后续全局$就不再指向jQuery,合法日期分支下的$('#xxx').val()赋值语句完全无法执行,控制台会抛出$ is not a function错误。 - Swal弹窗后同步执行页面刷新:SweetAlert为异步非阻塞组件,调用
swal()后代码会立刻往下执行,弹窗还未完成渲染、用户还没看到提示时window.location.reload()就已经触发,所有DOM操作都会被页面重载清空。 - 日期取值使用
getUTCDate()获取UTC时区日期,和本地时区存在时差偏移,极易出现合法日期被误判为非法、走入错误分支的情况。 - 额外冗余问题:代码中定义了
LastDate、LastDay、date等从未使用的变量,分支判断没有中断逻辑,错误分支执行完后还会继续往下走合法日期的计算逻辑。
修复后代码
function ChangeDate() { const startDateVal = document.getElementById("lease_stattdate").value; if (!startDateVal) return; const thisDate = new Date(startDateVal); const month = thisDate.getMonth(); const year = thisDate.getFullYear(); // 替换UTC日期方法为本地日期方法,避免时差导致判断错误 const dateSelected = thisDate.getDate(); const firstDay = 1; const today = new Date(); const currentMonth = today.getMonth(); // 错误分支1:所选月份不大于当前月份 if (month <= currentMonth) { swal("Error!", "Please select upcoming month!", "warning") .then(() => { // 弹窗关闭后再执行清空、刷新逻辑 $('#lease_stattdate, #renewal_notice, #end_date, #termination_notice').val(''); window.location.reload(); }); return; } // 错误分支2:所选日期不是当月第一天 if (dateSelected > firstDay) { swal("Error!", "Please select first day of the month!", "warning") .then(() => { $('#lease_stattdate, #renewal_notice, #end_date, #termination_notice').val(''); window.location.reload(); }); return; } // 合法日期分支:计算关联日期并赋值 const tempDay = 15; const nextDate = new Date(year, month + 23, tempDay); const targetMonth = nextDate.getMonth(); const targetYear = nextDate.getFullYear(); const lastDayOfTargetMonth = new Date(targetYear, targetMonth + 1, 0).getDate(); const exitDate = new Date(targetYear, targetMonth, lastDayOfTargetMonth).toLocaleDateString('en-ZA'); const renewalNoticeDate = new Date(targetYear, targetMonth - 2, 1).toLocaleDateString('en-ZA'); const terminationNoticeDate = new Date(targetYear, targetMonth, 1).toLocaleDateString('en-ZA'); $('#renewal_notice').val(renewalNoticeDate); $('#end_date').val(exitDate); $('#termination_notice').val(terminationNoticeDate); }
注意事项
jQuery.noConflict()仅适合在页面初始化阶段、多库共存场景下调用一次,禁止在业务交互函数中反复调用,会直接破坏jQuery的引用关系。- 所有异步弹窗、提示类组件,依赖弹窗关闭状态的后续逻辑必须放在组件的回调/Promise then方法中执行,不要同步写在弹窗调用语句后,避免逻辑提前执行、和UI状态不同步。
- 做本地日期相关的判断时,优先使用
getFullYear()/getMonth()/getDate()等本地时区方法,不要混用getUTC*系列方法,避免时差导致判断逻辑异常。
内容的提问来源于stack exchange,提问作者Siyanda Ngxongo
相关产品推荐
相关产品推荐

