2010-11-04 53 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()做以上你的情況。