2013-04-08 15 views
8
$("#div1, #div2").fadeIn('500',function(){ 
    { 
     console.log('Test'); 
    } 
}); 

Fiddle qui: http://jsfiddle.net/y97h9/Come eseguire la funzione una volta?

Il codice di cui sopra stamperà 'test' due volte nella console. Come posso farlo stampare solo una volta. È possibile?

+0

Che cosa eccetto? se div2 non esiste? Test o no Test in console? –

+0

metti un booleano fuori dall'assegno, inseriscilo nell'assegno. – Shark

+5

Hai chiamato la funzione su 2 diversi elementi DOM. È normale che la funzione venga chiamata due volte. Cos'altro ti aspettavi che accadesse? –

risposta

27

Certo, è possibile utilizzare jQuery promise per risolvere molteplici problemi callback:

$("#div1, #div2").fadeIn('500').promise().done(function() 
{ 
    console.log('Test'); 
}); 

Il metodo .promise() restituisce una promessa generato dinamicamente cioè risolto una volta che tutte le azioni di un certo tipo destinato ad la raccolta, in coda o no, hanno finito

Working Demo

+0

That's slick ... +1. – jmar777

+0

+1 per l'eleganza – Ejaz

+0

Cosa succede se '# div1' o' # div2' hanno già delle animazioni in corso in aggiunta a 'fadeIn'? Non aspetterà troppo a lungo (forse)? Forse sto fraintendendo – Ian

3

Il callback verrà eseguito una volta per ogni elemento corrispondente. È sempre possibile impostare una bandiera per vedere se è stato eseguito già però:

var hasRun = false; 
$("#div1, #div2").fadeIn('500', function() { 
    if (hasRun) return; 
    console.log('Test'); 
    hasRun = true; 
}); 
+0

Molto brutto. Questo è un [problema ben risolto] (http: //api.jquery.com/promise /) in JavaScript e jQuery, e questa non è la soluzione da usare. – meagar

+0

@meagar Non vedo come 'promise' possa risolvere questo ... e questa risposta è tutt'altro che" brutta ". È azzeccato, in realtà. – Ian

+3

@meagar Non è particolarmente intelligente, ma è semplice e non risentirà di alcuni dei sottili problemi discussi nella risposta di user1479606. Preferisco comunque la sua risposta al mio se non hai altre animazioni in gioco allo stesso tempo. Ian, grazie :) – jmar777

-1

Utilizzare un flag booleano per evitare console.log ('Test'); dall'essere chiamato due volte.

var isCalled = false; 
$("#div1, #div2").fadeIn('500',function(){ 
    if(!isCalled) { 
     isCalled = true; 
     console.log('Test'); 
    } 
}); 
Problemi correlati