仅在堆栈的最后一次执行回调

时间:2012-07-18 07:52:21

标签: javascript jquery

目前我已将其设置为这样,

var elements = $('#one, $two, #three, #four, #six');

var _temp = 0;
elements.hide(0, function(){
    /* by default, the callback will be performed to
       every single element in stack */

    _temp++; // increment temporary cache

    // perform actual callback only on last in list
    if (_temp == elements.length) {
        // do stuff
    }
});

但感觉不对,因为如果我想为下面的另一回调241行做同样的事情,我必须重置_temp,好吧,全局变量只是凌乱。

我怎样才能简化这个?

3 个答案:

答案 0 :(得分:3)

一种可能的方法是使用闭包:

var elements = $('#one, $two, #three, #four, #six');

elements.hide(0, (function(){
    var _temp = 0;
    return function(){
        _temp++; // increment temporary cache

        // perform actual callback only on last in list
        if (_temp == elements.length) {
            // do stuff
        }
    };
})());

如果您想更频繁地使用此模式,您可以创建一个返回回调的函数。

另请注意,.hide()的持续时间为第一个参数。

答案 1 :(得分:1)

尝试在函数中使用静态变量。

答案 2 :(得分:0)

还有另一种没有临时变量的方法,它可能对某些人来说可读性稍差,并迫使你将你的选择存储在一个变量中,但是:

elements.hide(0, function(){
    // if last callback (compare raw DOMElements, because jQuery object aren't somehow similar)
    if ($(this)[0] === elements.last()[0]) {
        // do stuff
    }
});

缩小一些线条,并做到这一点。