2013-11-26 7 views
5

我試圖沿着這些線路做一些事情:在setTimeout裏面執行jquery成員函數而不關閉的方法?

setTimeout($('#element').hide,3000); 

這似乎很簡單,但它是由"this" problem削弱。我想找到一種方法,只是將實際功能作爲參數傳遞給,而不將其包裝在另一個功能中,例如,我不想這樣做:

setTimeout(function(){$('#element').hide();},3000); 

我已經試過:

setTimeout($('#element').hide,3000); 
setTimeout($('#element').hide.apply(document),3000); /* jQuery docs say that document is the default context */ 
setTimeout($('#element',document).hide,3000); 
setTimeout($(document).find('#element').hide,3000); 
setTimeout($(window).find('#element').hide,3000); 
setTimeout($.proxy($('#element').hide,document),3000); /* I know this returns a function, which I don't want, but I have tried it */ 
setTimeout(($('#element').hide()),3000);    /* functional expression */ 

我在尋找到解決這一問題的方式,但我不想把它包在另一個功能。代碼行越少越好。我知道爲什麼這不像預期的那樣工作,但是我怎樣才能修復它,而不用將它封裝在封閉中?

+0

的setTimeout只需要一個函數名或匿名函數作爲參數,所以我不認爲這可以根據需要來完成。你不想使用匿名函數的原因是什麼? –

+0

在你給我們的文章中,他們給出了一個可能的解決方案。你爲什麼不嘗試它? –

+1

@epascarello這些都是我試過的。在一行代碼中進行七次不同的嘗試。 –

回答

5

您可以通過使元件本身結合的方法的情況下做到這一點的方式,使在jQuery的隱藏方法this將指向jQuery對象,而不是全球背景。此

Function.bind

跨瀏覽器的替代:您可以通過創建一個綁定功能

$.proxy

例:

var $elem = $('#element'); 
setTimeout($elem.hide.bind($elem),3000); 

setTimeout($.proxy($elem.hide, $elem),3000); 

setTimeout($.fn.hide.bind($elem),3000); //setTimeout($.proxy($.fn.hide, $elem),3000); 

Fiddle

+3

不錯。如果你重新綁定 - 你可以使用$ .fn.hide而不是$ elem.hide – benjaminbenben

+1

'setTimeout($。proxy($ .fn.hide,$('#element')))'更短。 – haim770

+0

@benjaminbenben哦是啊真的...更新...謝謝。 – PSL