【问题标题】:JQuery datetimepicker change min/maxDate results in infinite loopJQuery datetimepicker 更改 min/maxDate 导致无限循环
【发布时间】:2013-04-21 14:41:17
【问题描述】:

我正在使用来自http://trentrichardson.com/examples/timepicker/ 的日期时间选择器

问题是我有一个开始和结束输入字段。我不希望用户可以选择晚于开始日期字段的结束日期时间。

输入字段如下所示:

<input type="text" name="dateStart" id="dateStart" value="<?php echo $pageInfo['page_date_start'];?>" onChange="dateStartChange();" />
<input type="text" name="dateEnd" id="dateEnd" value="<?php echo $pageInfo['page_date_end'];?>" onChange="dateEndChange();" />
// Default date value = 0000-00-00 00:00:00

设置日期时间选择器的 JScript:

$('#dateStart').datetimepicker({
    showSecond: false,
    timeFormat: 'HH:mm:ss',
    dateFormat: "yy-mm-dd",
});

$('#dateEnd').datetimepicker({
    showSecond: false,
    timeFormat: 'HH:mm:ss',
    dateFormat: "yy-mm-dd",
});

还有 onchange 函数:

function dateStartChange(){
    console.log("dateStartChange: " + $("#dateStart").val());
    $("#dateEnd").datepicker('option', 'minDate', $("#dateStart").val()); 
}

function dateEndChange(){
    console.log("dateEndChange: " + $("#dateEnd").val());
    $("#dateStart").datepicker('option', 'maxDate', $("#dateEnd").val()); 
}

这很好用,除了一件事。如果我更改日期,然后在同一天单击另一个输入字段并选择,如果我检查控制台日志,则会导致无限循环:

页面(chrome)更改为:

是日期时间选择器有问题还是我做错了什么?没看懂。

【问题讨论】:

    标签: jquery datetime onchange datetimepicker on-the-fly


    【解决方案1】:

    大概是递归……

    When dateStart changes, you are modifying dateEnd.
    When dateEnd changes, you are modifying dateStart.
    When dateStart changes, you are modifying dateEnd.
    When dateEnd changes, you are modifying dateStart.
    When dateStart changes, you are modifying dateEnd.
    When dateEnd changes, you are modifying dateStart.
    When dateStart changes, you are modifying dateEnd.
    When dateEnd changes, you are modifying dateStart.
    

    等等等等等等

    [编辑建议的解决方法,适用于两个事件处理程序]

    var bCodeChange = false;
    
    function dateStartChange()
    {
        if (bCodeChange == true)
            return;
        else
            bCodeChange = true;
    
        console.log("dateStartChange: " + $("#dateStart").val());
        $("#dateEnd").datepicker('option', 'minDate', $("#dateStart").val());
    
        bCodeChange = false;
    }
    

    【讨论】:

    • 现在你说清楚了:D 1 那么,你认为我可以如何防止递归呢?
    • 我之前使用布尔标志解决了这样的问题。像 bCodeChange 之类的东西。当您要修改另一个控件时,将其设置为 true,完成后,将其设置为 false。然后在控件中,如果bCodeChange为真,就退出,什么都不做。但是,我觉得这种笨拙。
    • 听起来确实很难看,但我认为这行不通。因为如果我只是在某个日期单击 1 次,控制台会返回 3 倍的函数控制台日志(i.imgur.com/0ydySEx.jpg
    • 没关系,没有看到您的编辑。这成功了,我非常感谢你的帮助:P
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2021-05-07
    • 2012-08-24
    相关资源
    最近更新 更多