【问题标题】:Pass array elements to settimeout function将数组元素传递给 settimeout 函数
【发布时间】:2011-09-27 16:23:21
【问题描述】:

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

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

谢谢。

【问题讨论】:

标签: javascript settimeout


【解决方案1】:

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

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

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

【讨论】:

  • 哇!!有用!我不知道这是可能的。我用这个 settimeout 函数控制了我的大脑。
  • 很高兴我能帮上忙 :) 所有(我认为)jQuery 动画方法都可以将回调函数作为参数。
  • 我还有其他功能可以隐藏受此解决方案影响的克隆字段。在触发此代码之前,字段被正确隐藏,但之后失败。
【解决方案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 参数,然后返回另一个实际删除元素的函数。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2023-03-14
      • 2020-11-24
      相关资源
      最近更新 更多