将数组元素传递给 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