我在这里有两个函数,例如animation1和load1,它们的工作原理如下:
function animation1() {
element.animate({width(size)});
}
和
function load1() {
element.find('img').after(newImg)
}
有一个点击事件同时触发这两个事件,但是如何告诉load1等到动画1完成动画然后添加newImg元素?我知道我可以将load1回调到animation1的animate()中,但是我将它们分开,因为我在很多地方重用了animation1。现在发生的事情是,两者都是一起发射的,对眼睛来说并不好看。
谢谢
d
答案 0 :(得分:1)
两个选项:
我知道你说过
我知道我可以将load1回调到animation1的animate()中,但是我将它们分开,因为我在很多地方重用了animation1。
...但回调确实是最好的方法。在您不需要回调的地方,只需不要将其传递给animation1
。
修改animation1
以接受回调,该回调传递给animate
函数,该函数接受动画完成后触发的“完成”回调:
function animation1(callback) {
// See also my comment on the question regarding `{width(size)}`
element.animate({width: size}, callback);
}
...然后您的点击会将对load1
的引用传递给animation1
,而不是直接调用它,如下所示:
function clickHandler() {
animation1(load1);
}
有关完成功能的详细信息,请参阅animate
docs。
如果您告诉animation1
确切需要多长时间,可以使用setTimeout
来延迟拨打load1
:
function animation1(duration) {
// See also my comment on the question regarding `{width(size)}`
element.animate({width: size}, duration);
}
...然后您的点击会在一段时间内传递到animation1
并使用setTimeout
延迟拨打load
的费用相同:
function clickHandler() {
animation1(400);
setTimeout(load1, 400);
}
在这两个中,我肯定会去回调,而不是setTimeout
禁止其他一些设计约束。
答案 1 :(得分:0)
你是“在很多地方使用animation1”但是你希望它在功能流方面表现不同? Souds就像你需要一个单独的函数animation2,它可以包含回调。一般来说,重用是一个很好的想法,但你实际上在这里做了一些不同的事情,因为你是动画,然后是一些东西。
答案 2 :(得分:0)
jQuery的animate函数有一个callback
函数可供您使用。您可以通过各种不同的方式使用它。您给出的示例最简单的可能是使用全局变量:
var isAnimating = false;
function animation1(){
isAnimating = true;
element.animate({width(size)}, function(){ isAnimating=false; });
}
function load1(){
if(isAnimating){
load1(); // call again
}
else {
element.find('img').after(newImg);
}
}
然而,这不是非常有效 - load {()将继续在永久循环中运行,直到isAnimating
为假。因此,更好的选择是使用回调实际调用load1 ...
function animate1(){
element.animate({width(size)}, function() { load1(); });
}
function load1(){
element.find('img').after(newImg);
}
这可以扩展,因为你需要为每个函数调用不同的函数...
function animate1(callback){
element.animate({width(size)}, function() {
var fn = window[callback];
if(typeof fn === 'function') {
fn();
}
});
}