开发者问题收集

将数组元素传递给 settimeout 函数

2011-09-27
891

我不明白为什么 fadeOut 有效而 remove 无效。我发现这是数组的问题。我尝试了一些组合,但无法使其工作。

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

谢谢。

3个回答

看起来您只需要在 fadeOut 完成后运行 remove 。如果是这种情况,您无需使用 setTimeout 。您可以改用回调:

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

只要动画完成,就会执行回调,因此这样做意味着如果您还想更改淡入淡出的持续时间,则不必更改 setTimeout 持续时间。

James Allardice
2011-09-27

虽然我认为在这种情况下使用 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 参数,然后返回另一个实际删除元素的函数。

在这种情况下,使用回调肯定更好,但在其他时候,当有人可能循环某些东西时,这将非常有用。

btleffler
2011-09-27

您已围绕 i 变量创建了一个闭包。闭包捕获变量本身,而不是变量的值。因此,一旦触发这些超时,对于所有超时,i 将等于 fieldsblock.length ,这并不是您想要的。

在这个特定情况下,James Allardice 的答案很好,如果您希望移除不会在淡出后立即发生,您可能还需要添加 delay() 调用。

Matt Greer
2011-09-27