【问题标题】:setTimeout not delayed with an anonymous functionsetTimeout 没有被匿名函数延迟
【发布时间】:2010-11-04 22:45:56
【问题描述】:

我正在为使用 jQuery 编写的项目构建自定义幻灯片。每个幻灯片都绑定了 4 个事件(播放、停止、下一个、上一个)。控件出现在 mouseover 和 mouseout 上。在 mouseout 上,我想要控件消失的延迟。为此,我使用了 setTimeout。

$(this).attr('timeout', setTimeout((function(obj){obj.fadeOut(250);})($(this)), 1000));

然而,这会导致“无用的 setTimeout 调用(参数周围缺少引号?)”错误

我删除了($(this)) 看看是否可以简化操作。

$(this).attr('timeout', setTimeout((function(foo){alert(foo);})('bar'), 1000));

这导致鼠标移出时警报消息框中会立即显示“bar”,或者在 firebug 中报告任何错误。我只能通过这个逻辑假设匿名函数正在立即运行,这没有给 setTimeout 稍后调用。

如果我忽略了将 $(this) 传递给匿名函数并尝试的需要

$(this).attr('timeout', setTimeout(function(){alert('foo');}, 1000));

一切都按预期工作,我一定是匿名函数的语法有问题,但我不知道它可能是什么。

谢谢

【问题讨论】:

    标签: jquery parameter-passing settimeout anonymous-function


    【解决方案1】:

    由于您使用的是jQuery,只需使用$.proxy() 设置调用内容,如下所示:

    $(this).attr('timeout', 
      setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));
    

    请注意,虽然这不是一个有效的属性,但最好将类似的内容存储在 .data() 中,如下所示:

    $(this).data('timeout', 
      setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));
    

    或者这个:

    $.data(this, setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));
    

    您当前方法的问题在于这是自调用的:

    (function(foo){alert(foo);})('bar')
    

    您想在哪里返回具有正确上下文的函数...在您的情况下使用上面的$.proxy() 更简洁地完成。

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2011-01-11
      相关资源
      最近更新 更多