2010-11-04 74 views
2

我正在为使用jQuery编写的项目构建自定义幻灯片。每个幻灯片有4个绑定到它的事件(play,stop,next,prev)。控件显示在鼠标悬停和鼠标悬停上。在鼠标移出时,我想让控件延迟消失。为了达到这个目的,我使用了setTimeout。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上的警报消息框中,不会延迟或在萤火虫中报告任何错误。我只能通过这个逻辑来假设匿名函数正在马上运行,这对setTimeout稍后调用没有任何影响。

如果我忽视了要通过$(本)到匿名函数,并尝试

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

一切正常,我必须做一些错误的匿名函数的语法,但我不知道它可能是什么。

感谢

回答

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()做以上你的情况。