Ajax-вызовы (по умолчанию) асинхронные . Это означает, что этот код:
$("#li_"+I).toggleClass("off on");
element.toggleClass("off on");
return false;
может быть выполнено до завершения вызова ajax, предшествующего ему. Это общая проблема для программистов, которые плохо знакомы с AJAX и асинхронным выполнением кода. Все, что вы хотите выполнить после выполнения вызова ajax, должно быть помещено в обратный вызов , такой как ваш обработчик success
:
$.ajax({
type: "POST",
url: "_js/changetag.php",
data: info,
success: function(){
$("#li_"+I).toggleClass("off on");
element.toggleClass("off on");
}
});
Аналогично, вы могли бы также выполнить второй вызов ajax:
$.ajax({
type: "POST",
url: "_js/changetag.php",
data: info,
success: function(){
$("#li_"+I).toggleClass("off on");
element.toggleClass("off on");
$.ajax({
url: "_js/loaddeals_v2.php",
success: function(results){
$('#listresults').empty();
$('#listresults').append(results);
}
});
}
});
С jQuery 1.5 Deferred Object вы можете сделать это более привлекательным.
function firstAjax() {
return $.ajax({
type: "POST",
url: "_js/changetag.php",
data: info,
success: function(){
$("#li_"+I).toggleClass("off on");
element.toggleClass("off on");
}
});
}
// you can simplify this second call and just use $.get()
function secondAjax() {
return $.get("_js/loaddata.php", function(results){
$('#listresults').html(results);
});
}
// do the actual ajax calls
firstAjax().success(secondAjax);
Это хорошо, потому что он позволяет откатывать обратные вызовы - вы можете написать код, который выполняется асинхронно, но написан как синхронно исполняемый код.