我不明白为什么fadeOut可以工作但是删除不行。我发现这是阵列的一个问题。我尝试了一些组合,但我无法使其发挥作用。
for (var i=0;i<fieldsblock.length;i++){
$("#"+fieldsblock[i]+"_tr"+nid).fadeOut();
t=setTimeout(function(){$("#"+fieldsblock[i]+"_tr"+nid).remove();},400);
}
感谢。
答案 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()
来电。