2013-11-26 3 views
5

Stavo cercando di fare qualcosa in questo senso:Modo per eseguire le funzioni membro jQuery all'interno di setTimeout senza chiusura?

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

che sembra abbastanza semplice, ma è paralizzato dal "this" problem. Voglio trovare un modo per passare semplicemente la funzione effettiva come parametro, senza averla racchiusa in un'altra funzione, ad es. Io non voglio fare questo:

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

Quello che ho provato:

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

sto cercando il modo per ovviare a questo problema, ma io non voglio avvolgerla in un'altra funzione. Meno linee di codice, meglio è. So PERCHÉ questo non funziona come previsto, ma COME posso ripararlo senza doverlo chiudere in una chiusura?

+0

setTimeout vorrà solo un nome di funzione o funzione anonima come parametro, quindi non credo che questo può essere fatto come si desidera. Qual è la tua ragione per non voler usare una funzione anonima? –

+0

Nell'articolo che ci hai dato, danno una possibile soluzione. Perché non lo provi? –

+1

@epascarello Sono quelli che ho provato. Sette diversi tentativi su un'unica riga di codice. –

risposta

5

Si può fare in questo modo legando il contesto del metodo con l'elemento stesso in modo che nel metodo jquery hide this si punti all'oggetto jQuery e non al contesto globale. È possibile creare funzioni rilegati utilizzando:

Function.bind

Croce alternativa Browser per questo:

$.proxy

Es:

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

o

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

o

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

Fiddle

+3

nice. in caso contrario, è possibile utilizzare $ .fn.hide anziché $ elem.hide – benjaminbenben

+1

'setTimeout ($. proxy ($. fn.hide, $ ('# elemento')))' è più corto. – haim770

+0

@benjaminbenben Oh sì, vero ... aggiornato ... Grazie. – PSL

Problemi correlati