将数组元素传递给settimeout函数

时间:2011-09-27 16:23:22

标签: javascript settimeout

我不明白为什么fadeOut可以工作但是删除不行。我发现这是阵列的一个问题。我尝试了一些组合,但我无法使其发挥作用。

for (var i=0;i<fieldsblock.length;i++){
     $("#"+fieldsblock[i]+"_tr"+nid).fadeOut();
     t=setTimeout(function(){$("#"+fieldsblock[i]+"_tr"+nid).remove();},400); 
    }

感谢。

3 个答案:

答案 0 :(得分:4)

fadeOut完成后,您似乎只需要remove即可运行。如果是这种情况,则无需使用setTimeout。您可以改为使用回调:

for (var i=0;i<fieldsblock.length;i++){
    $("#"+fieldsblock[i]+"_tr"+nid).fadeOut(function() {
        $(this).remove();
    });
}

每当动画完成时都会执行回调,所以这样做就意味着如果你想改变淡入淡出的持续时间,你也不必更改setTimeout持续时间。

答案 1 :(得分:2)

虽然我认为在这种情况下使用jquery的fadeOut()方法的回调是正确的,但你仍然可以删除没有它的元素。

var block;

for (var i = 0; i < fieldsblock.length; i++) {
    // Get the element
    block = $("#" + fieldsblock[i] + "_tr" + nid);

    // Fade it out without using the callback for whatever reason
    block.fadeOut();

    // Wait 400ms to remove it
    setTimeout((function (blockToRemove) {
        return function () { blockToRemove.remove(); };
    })(block), 400);
}

基本上,(function (args...) { ... })(args...)允许您将参数传递给函数的本地范围,这将“保存您正在使用的参数的状态”。在上面的示例中,我们将block传递给函数的blockToRemove参数,该参数然后返回另一个实际删除元素的函数。

在这种情况下,使用回调肯定会更好,但有时候有人可能会循环使用这个非常有用的东西。

答案 2 :(得分:1)

你在i变量周围创建了一个闭包。闭包捕获变量本身,而不是变量的值。所以一旦这些超时触发,我将等于所有这些超时fieldsblock.length,这不是你想要的。

在这种特殊情况下,James Allardice的回答非常好,如果您希望在淡出后立即发生删除,您可能还需要添加delay()来电。