datePicker需要单击两次才能显示不可用的日期

时间:2013-08-09 21:07:51

标签: php javascript jquery datepicker

我创建了一个禁用从数据库中检索的某些日期的代码。

在getDates脚本中,我只是从数据库中检索日期,返回它们并将它们分配给数组unavailableDates。

<script>
var unavailableDates;

function unavailable(date) {
    dmy = date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getFullYear();
    if ($.inArray(dmy, unavailableDates) == -1) {
        return [true, ""];
    } else {
        return [false, "", "Unavailable"];
    }
}

$(document).ready(function()
{
    $("#datepicker").datepicker({
        dateFormat: 'yy-mm-dd',  
        beforeShowDay: unavailable, 
        minDate: 0,
        firstDay: 1, // rows starts on Monday
        changeMonth: true,
        changeYear: true,
        showOtherMonths: true,
        selectOtherMonths: true,
        altField: '#date_due',
        altFormat: 'yy-mm-dd'
        });

    $('#datepicker').focus(function(){
        //alert($('#name').html());
         $.ajax({                                      
        url: 'getDates.php',                  
        data: "artist_id="+$('#name').html(),                       
        dataType: 'json',                     
        success: function(data)          
        {
                   unavailableDates = data;
        } 
        });
    })

});
</script>

它工作正常,但只有当我点击两次datepicker时。当我第一次点击它时显示所有日期(无论它们是否可用)。当我再次点击时,它会显示不可用的日期。

有谁知道为什么?感谢

3 个答案:

答案 0 :(得分:1)

因为您在显示日期选择器时启动了获取不可用日期的请求。你必须提前做到这一点。在后端请求的回调中,您可以显示日期选择器。

答案 1 :(得分:1)

在您的ajax调用中添加async:false,以便应用程序在继续之前等待响应,如此

$('#datepicker').focus(function(){
    //alert($('#name').html());
     $.ajax({                                      
    url: 'getDates.php',                  
    data: "artist_id="+$('#name').html(),                       
    dataType: 'json', 
    async: false,            
    success: function(data)          
    {
               unavailableDates = data;
    } 
    });

另一个想法,你可以将这个ajax调用直接添加到不可用的函数中,而不是先运行两个东西,onFocus和beforeShowDay(尽管我对beforeShowDay函数并不十分熟悉)

这可能会减慢日期选择器的开放速度,因为它必须等待服务,因此取决于您的服务速度以及您的性能要求。其他选项,如果这可能会减慢将弹出一个“获取日期”消息或每隔X秒拉一次服务器页面(虽然这可能会增加很多额外的服务调用......)

编辑:发表评论后......

"basically when user selects an option (here they want to book artists so \
when user selects an artist), the unavailable dates of datepicker are 
updated   automatically." 

在选择艺术家时加载列表似乎更有意义,除非您在页面打开时关注更改。在那种情况下,我会做类似......

On Artist Changed
    -Disable date picker, possibly add a small note next to it / under it / 
       over it that it is loading
    -Start ajax call with async true
    -In ajax success function, re-enable the picker and remove the message.

这将允许UI保持活动状态,允许用户在加载日期时输入其他信息,如果服务足够快,甚至几乎不知道它已被禁用一秒钟。你的日期不会像其他方式那样“活跃”,但听起来并不像他们需要那样活着。无论如何,您需要重新检查表单的提交日期。

答案 2 :(得分:0)

var data = $.getJSON($url, function (data) {
         //your logic

}).success(function (data) {
        //Trigger the first click
        $('.datepicker').trigger('click');
});

$(".div_fader").on('click','.datepicker', function () {

        $(this).datepicker();

});