2009-09-18 1 views
1

Вот мой код jQuery. Он должен разобрать json, возвращенный скриптом php this. Известно, что php работает. Он также должен преобразовать литералы даты в объект даты javascript. Однако ошибка возникает при dates.length. Может ли кто-нибудь увидеть, что не так с кодом?Почему этот код jscript/jQuery JSON не работает?

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); 
     } 
    }); 
} 

ответ

1

Ваш код DatePicker будет (потенциально) будет получать выполняться до завершения вызова 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"); 

} 

Edit: Как и в сторону, и если бы это было мне, я бы, вероятно, разделить его на какой-то вызывающей функции, чтобы получить данные даты и передать ее обратный вызов. Например: -

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); 
      } 
     }); 
    }); 
1

Проблема заключается в том, что ваш код даты карандаша выполняется до завершения обработки AJAX.

Ваш код Datepicker должен пойти внутри функции обратного вызова $ .POST, под цикл, а под линией dates = data;

Смежные вопросы