我正在为使用jQuery编写的项目构建自定义幻灯片。每个幻灯片都有4个事件绑定(播放,停止,下一个,上一个)。控件出现在鼠标悬停和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'在mouseout上的警告消息框中显示,没有延迟,或者在firebug中报告任何错误。我只能通过这个逻辑假设匿名函数正在立即运行,这为setTimeout稍后调用没有任何东西。
如果我忽略了将$(this)传递给匿名函数并尝试
的需要$(this).attr('timeout', setTimeout(function(){alert('foo');}, 1000));
一切都按预期工作,我必须对匿名函数的语法做错了,但我不知道它可能是什么。
由于
答案 0 :(得分:2)
由于您使用的是jQuery,只需使用$.proxy()
设置调用contenxt,如下所示:
$(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()
更简洁地完成。