2009-09-18 4 views
1

Voici mon code jQuery. Il devrait analyser le json retourné par le script PHP this. Le php est connu pour fonctionner. Il doit également convertir les littéraux de date en un objet de date javascript. Toutefois, une erreur se produit au dates.length. Quelqu'un peut-il voir ce qui ne va pas avec le code?Pourquoi ce code d'analyse JSON javascript/jQuery ne fonctionne-t-il pas?

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

Répondre

1

Votre code datepicker sera (potentiellement) être CHAISE avant l'appel ajax complète. Au minimum, essayez de déplacer la partie datepicker du code dans le rappel .post de $: -

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: En aparté, et si elle était moi, je serais probablement le diviser en une sorte de fonction d'appelant pour obtenir les données de date et l'alimenter un rappel. Par exemple: -

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

puis vous alimentez un rappel pour votre sélecteur de date pour traiter: -

__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

Le problème est que votre code datepicker du calendrier est en cours d'exécution avant que le traitement AJAX soit terminé.

Votre code DatePicker doit entrer dans la fonction de rappel .post $, sous la boucle, et au-dessous de la ligne dates = data;

Questions connexes