Вы можете использовать пользовательское событие для ожидания завершения анимации, например:
$("a").click(function(){
var img = $("img"),
div = $("div");
$.ajax({
url: "test.php",
contentType: "html",
beforeSend: function(){
img.fadeIn(600, function(){
div.append(" | beforeSend finished | ");
div.trigger("animationComplete");
});
},
error: function(){
if(img.is(':animated')) {
div.one("animationComplete", function() {
div.append(" | error | ");
});
} else {
div.append(" | error | ");
}
}
});
return false
});
Примечания:
jQuery.one()
присоединяет обработчик событий, который запускается один раз, а затем удаляется.
jQuery.is(':animated')
- это пользовательский селектор, предоставляемый jQuery для определения, анимируется ли элемент с помощью встроенных в jQuery методов анимации (например, fadeIn
).
Новый jsFiddle: http://jsfiddle.net/pgjHx/
В комментариях Happy спросил, как обрабатывать несколько анимаций. Один из способов - добавить условие в обработчик события animationComplete
, чтобы увидеть, продолжается ли анимация. Например:
$("a").click(function(){
var img = $("img"),
div = $("div");
$.ajax({
url: "test.php",
contentType: "html",
beforeSend: function(){
img.fadeIn(600, function(){
div.append(" | beforeSend finished | ");
div.trigger("animationComplete");
});
// Add another animation just to demonstrate waiting for more than one animation
img.animate({
marginTop: '-=5',
opacity: '-=.5'
}, 700, function() {
div.trigger("animationComplete");
});
},
error: function(){
if(img.is(":animated")) {
// Note I've switched to bind, because it shouldn't be unbound
// until all animations complete
div.bind("animationComplete", function() {
if(img.is(":animated")) {
return;
}
div.append(" | error | ");
div.unbind("animationComplete");
});
} else {
div.append(" | error | ");
}
}
});
return false
});