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

Bootstrap Datepicker过早打开出现重复问题求助

问题描述

使用Bootstrap Datepicker时遇到异常:若在页面所有请求完成前打开日期选择器,待请求结束后,下拉框内会额外生成一个inline-datepicker。相关代码如下:

HTML 代码

<div class="hand-date-picker mr-3">
@Html.TextBox("InHandDate", "", new { @class = "datepicker", @group = "inhanddate", @data_date_format = HelperMethods.GetDateFormat(), @data_test_selector = "txtInHandDate" })                                                                   <span class="icon-calendar" data-time-icon="icon-time" data-date-icon="icon-calendar"></span>
</div>

初始化代码

$("#InHandDate").datepicker({
    //@ts-ignore
    daysOfWeekDisabled: '0,6'
});
$("#InHandDate").datepicker('setDaysOfWeekDisabled', [0, 6])

脚本代码

$(document).ready(function () {
    let minDate;
    if ($("input[class='PickUpShipping']").is(":checked")){
        $(".CashOnPickup").show();
        $("#warehouses-select").css("display", "block");
        minDate = '@(HelperMethods.GetDateTime())';
    } else {
        $(".CashOnPickup").hide();
        $("#warehouses-select").css("display", "none");
        minDate = '@(HelperMethods.GetDateTime().AddDays(1))';
    }
    $("#InHandDate").datepicker('setStartDate', new Date(minDate))
});

$("input[name='ShippingOptions']").on("click", function (ev) {
    let minDate;
    if ($(this).data('shippingcode') === 'Pickup') {
        $(".CashOnPickup").show();
        $("#warehouses-select").css("display", "block");
        minDate = '@(HelperMethods.GetDateTime())';
    } else {
        $(".CashOnPickup").hide();
        $(".CashOnPickup input").prop('checked', false);
        $("#warehouses-select").css("display", "none");
        minDate = '@(HelperMethods.GetDateTime().AddDays(1))';
    }
    $("#InHandDate").datepicker('setStartDate', new Date(minDate))
});

$("input[name='ShippingOptions']").on("change", function (ev) {
    $("#InHandDate").datepicker('setDate', "");
});
解决方案

1. 操作前关闭日期选择器

在调用setStartDate、setDate等修改配置的方法前,先关闭已打开的选择器,避免重复渲染面板:

// 先关闭选择器
$("#InHandDate").datepicker('hide');
// 再执行配置修改
$("#InHandDate").datepicker('setStartDate', new Date(minDate));

将上述逻辑替换所有修改日期选择器配置的代码块。

2. 合并重复的初始化配置

原代码中先初始化daysOfWeekDisabled: '0,6',又调用setDaysOfWeekDisabled([0,6])属于重复操作,合并成一次初始化即可:

$("#InHandDate").datepicker({
    //@ts-ignore
    daysOfWeekDisabled: [0, 6]
});

3. 等待所有异步请求完成后再处理

如果页面存在未完成的异步请求,可通过$.ajaxStop()监听请求完成事件,再执行日期选择器的配置修改:

$(document).ajaxStop(function() {
    let minDate;
    if ($("input[class='PickUpShipping']").is(":checked")){
        $(".CashOnPickup").show();
        $("#warehouses-select").css("display", "block");
        minDate = '@(HelperMethods.GetDateTime())';
    } else {
        $(".CashOnPickup").hide();
        $("#warehouses-select").css("display", "none");
        minDate = '@(HelperMethods.GetDateTime().AddDays(1))';
    }
    $("#InHandDate").datepicker('hide').datepicker('setStartDate', new Date(minDate));
});

4. 兜底:清理重复面板

若仍出现重复面板,可在修改配置前手动移除多余的inline-datepicker元素:

// 移除额外生成的inline面板
$('.datepicker-inline').remove();
// 再执行配置操作
$("#InHandDate").datepicker('setStartDate', new Date(minDate));

内容的提问来源于stack exchange,提问作者Asl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:21:03