2013-11-26 4 views
5

Ich habe versucht, etwas in dieser Richtung zu tun:Möglichkeit, jQuery-Member-Funktionen innerhalb von setTimeout ohne Abschluss auszuführen?

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

das scheint einfach genug, aber es wird von dem "this" problem gelähmt ist. Ich möchte einen Weg finden, die eigentliche Funktion einfach als Parameter zu übergeben, ohne sie in eine andere Funktion, z. Ich will nicht, dies zu tun:

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

Was ich habe versucht:

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 */ 

Ich bin für den Weg suchen, um dieses Problem zu beheben, aber ich will es nicht umwickeln eine andere Funktion. Je weniger Codezeilen, desto besser. Ich weiß, WARUM das nicht wie erwartet funktioniert, aber WIE kann ich es reparieren, ohne es in einen Verschluss zu wickeln?

+0

SetTimeout nur einen Funktionsnamen nehmen, oder anonyme Funktion als Parameter, so dass ich glaube nicht, das getan werden kann, wie Sie wollen. Aus welchem ​​Grund möchten Sie keine anonyme Funktion verwenden? –

+0

In dem Artikel, den Sie uns gaben, geben sie eine mögliche Lösung. Warum versuchst du es nicht? –

+1

@epascarello Das habe ich ausprobiert. Sieben verschiedene Versuche an einer einzigen Codezeile. –

Antwort

5

Sie können dies tun, indem Sie den Kontext der Methode mit dem Element selbst verknüpfen, so dass in der Methode jquery hide this auf jquery-Objekt und nicht auf globalen Kontext zeigt. Sie können gebundene Funktionen erstellen mit:

Function.bind

Cross-Browser-Alternative für diese:

$.proxy

Ex:

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

oder

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

oder

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

Fiddle

+3

nett. Wenn Sie sowieso wieder binden, können Sie $ .fn.hide anstelle von $ elem.hide – benjaminbenben

+1

'setTimeout ($ .proxy ($ .fn.hide, $ ('# element'))) verwenden, ist kürzer. – haim770

+0

@benjaminbenben Oh ja Wahr ... aktualisiert ... Danke. – PSL

Verwandte Themen