You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:24:34