HTML& CSS:
<a href="#">link</a>
<img src="http://2.bp.blogspot.com/_OIHTbzY7a8I/TOaiTKLqszI/AAAAAAAAAHM/eb3iiOqxzKg/s640/Auto_Audi_Audi_concept_car_005130_.jpg" />
<div></div>
img { display: none; }
a { display: block; }
JS:
$("a").click(function(){
$.ajax({
url: "test.php",
contentType: "html",
beforeSend: function(){
$("img").fadeIn(600, function(){
$("div").append(" | beforeSend finished | ");
});
},
error: function(){
$("div").append(" | error | ");
}
});
return false
});
问题是,error
函数在beforeSend
函数中的动画完成之前开始。
以下是工作示例http://jsfiddle.net/H4Jtk/2/
error
只有在beforeSend
完成后才能开始工作。 怎么做?
我使用beforeSend
函数在ajax启动时启动块的动画。我无法删除它。
感谢。
答案 0 :(得分:10)
您可以使用自定义事件等待动画完成,如下所示:
$("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
});
答案 1 :(得分:1)
你可以这样做
//在链接点击时运行动画,当动画完成时, //然后开始你的ajax请求。
$("a").click(function () {
$("img").fadeIn(600, function () {
$("div").append(" | beforeSend finished | ");
$.ajax({
url: "test.php",
contentType: "html",
error: function () {
$("div").append(" | error | ");
}
});
return false
});
});
});
答案 2 :(得分:-1)
事情是“beforeSend” 完成 - 它将在“fadeIn”结束之前很久退出。我不知道你想要完成什么,所以很难提供解决方案。你必须等到启动ajax操作,直到在之后动画序列(“fadeIn”)完成,如果你想保证首先发生。