为什么这个javascript / jQuery JSON解析代码不起作用?

时间:2009-09-18 16:11:15

标签: php javascript jquery json datepicker

这是我的jQuery代码。它应解析this php脚本返回的json。知道php工作。它还应该将日期文字转换为javascript日期对象。但是,dates.length发生错误。任何人都可以看到代码有什么问题吗?

if($("#calendar").length)
{
    var dates;
    $.post("/dates/jsondates.php",function(data)
    {
        for(var i=0; i<data.length; i++)
        {
            data[i].start = new Date(data[i].start);
            data[i].end = new Date(data[i].end);
        }
        dates = data;
    }, "json");

    $("#calendar").datepicker(
    {
        beforeShowDay: function(date)
        {
            for(var i=0; i<dates.length; i++)
            {
                if(dates[i].start<date<dates[i].end)
                {
                    return new Array(0, "booked", dates[i].comment);
                }
            }
            return new Array(1);
        }
    });
}

2 个答案:

答案 0 :(得分:1)

问题是您的日历日期选择器代码在AJAX处理完毕之前正在执行。

你的datePicker代码需要进入$ .post回调函数,在for循环下面,并在dates = data;

行下面

答案 1 :(得分:1)

你的日期选择代码将(可能)在ajax调用完成之前执行。至少,尝试将代码的datepicker部分移动到$ .post回调中: -

if ($("#calendar").length)
{
    var dates;
    $.post("/dates/jsondates.php",function(data)
    {
        for(var i=0; i<data.length; i++)
        {
                data[i].start = new Date(data[i].start);
                data[i].end = new Date(data[i].end);
        }
        dates = data;

        $("#calendar").datepicker(
        {
            beforeShowDay: function(date)
            {
                    for(var i=0; i<dates.length; i++)
                    {
                            if(dates[i].start<date<dates[i].end)
                            {
                                    return new Array(0, "booked", dates[i].comment);
                            }
                    }
                    return new Array(1);
            }
        });
    }, "json");

}

编辑:顺便说一下,如果是我,我可能会把它分成某种调用函数来获取日期数据并给它一个回调。 E.g: -

function __callDateController(callback)
{
    $.post("/dates/jsondates.php",function(data)
    {
        for(var i=0; i<data.length; i++)
        {
            data[i].start = new Date(data[i].start);
            data[i].end = new Date(data[i].end);
        }

        if (callback !== undefined) {
            callback(data);
        }
    }, "json");
}

然后为您的日期选择器提供回调以处理: -

__callDateController(function(dates)
{
    $("#calendar").datepicker(
        {
            beforeShowDay: function(date)
            {
                for(var i=0; i<dates.length; i++)
                {
                    if(dates[i].start<date<dates[i].end)
                    {
                        return new Array(0, "booked", dates[i].comment);
                    }
                }
                return new Array(1);
            }
        });
    });