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

技术需求:选择日期后不关闭Datepicker,仅允许通过按钮关闭并添加提示

实现Datepicker选择日期后不自动关闭并添加关闭确认提示

要满足你的需求,需要对现有代码做两处核心修改:阻止日期选择后自动关闭对话框,以及给关闭按钮添加确认提示逻辑。以下是修改后的完整代码:

var arrDay = "";
var departDay = "";
var inserted_date2 = false; // 确保变量已定义
halfDates = [
    @foreach ($shifts as $shift)
        (new Date('{{ $shift }}')).toDateString(),
    @endforeach
];
fullDays = [
    @foreach ($fullDays as $day)
        (new Date('{{$day}}')).toDateString(),
    @endforeach
];

// 覆盖默认的Datepicker隐藏方法,仅允许通过自定义按钮关闭
var originalHide = $.datepicker._hideDatepicker;
$.datepicker._hideDatepicker = function(input) {
    if (window.allowDatepickerClose) {
        originalHide(input);
        window.allowDatepickerClose = false;
    }
};

$(".js-ui-datepicker").focus(function(){
    $(".js-ui-datepicker")
    .datepicker({
        minDate: 0,
        showButtonPanel: true,
        beforeShowDay: function(day){
            if (halfDates.includes(day.toDateString())) {
                return [true, 'halfDay', '你可以选择半天,其余时段已被预订'];
            }else if(fullDays.includes(day.toDateString())){
                return [false,'fullDay', "该日期已被完全预订,无法选择"];
            }else{
                return [true, ''];
            }
        },
        onSelect: function(day, inst){
            departDay = new Date(day);
            // 强制保持对话框显示,阻止默认关闭行为
            setTimeout(function() {
                inst.dpDiv.show();
            }, 10);
        },
        beforeShow: function(input, inst) {
            setTimeout(function() {
                // 自定义关闭按钮的文本和点击事件
                var doneBtn = inst.dpDiv.find(".ui-datepicker-buttonpane button.ui-datepicker-close");
                doneBtn.text("关闭对话框");
                doneBtn.off("click").on("click", function() {
                    // 弹出确认提示框
                    var confirmClose = confirm("确定要关闭对话框吗?如需重新选择日期请点击取消。");
                    if (confirmClose) {
                        window.allowDatepickerClose = true;
                        $.datepicker._hideDatepicker(input);
                    }
                });

                // 自定义Today按钮行为:选择今天但不关闭对话框
                var todayBtn = inst.dpDiv.find(".ui-datepicker-buttonpane button.ui-datepicker-current");
                todayBtn.off("click").on("click", function() {
                    $.datepicker._selectDate(input, new Date());
                    inst.dpDiv.show();
                });
            }, 10);
        }
    })
    .datepicker("show");
    
    if(!inserted_date2){
        $('.ui-datepicker-header').after('<div class="text-center p-2 calendar-note" style="font-size:15px">'+'红色半块表示该日期部分时段已被预订'+'</div>');
        inserted_date2 = true;
    }
});

修改说明:

  • 阻止自动关闭:

    1. 在onSelect事件中通过setTimeout强制重新显示对话框,抵消Datepicker默认的隐藏行为。
    2. 覆盖$.datepicker._hideDatepicker方法,添加开关标记allowDatepickerClose,只有当用户点击自定义关闭按钮并确认后,才允许关闭对话框,彻底阻止点击外部区域关闭的行为。
  • 关闭前确认提示:
    在beforeShow事件中修改默认的"Done"按钮文本为"关闭对话框",并绑定自定义点击事件,弹出确认提示框。用户确认关闭后,设置允许关闭的标记并调用隐藏方法;取消则保持对话框打开。

  • 兼容Today按钮:
    修改Today按钮的行为,选择今天后不关闭对话框,保持用户可以继续操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:19:47