2012-10-21 14 views
12
var counter = 0; 
jQuery("#div1, #div2").fadeIn('300',function(){ 
{ 
    counter++; 
    console.log(counter); 
} 

Il codice sopra verrà stampato "1" e "2" poiché jQuery fadeIn è implicito su due diversi oggetti DOM. Esiste comunque la possibilità di eseguirlo una sola volta senza rompere questo codice?jQuery fadeIn viene eseguito due volte nella sua richiamata

+0

Vuoi avere un contatore per elemento? Cosa stai cercando di fare ? –

+0

@dystroy, ho bisogno di fare alcune cose solo una volta nella funzione di callback – Alon

risposta

4

Si tratta di una soluzione rapida, ma non il migliore

var myFlag = true; 
jQuery("#div1, #div2").fadeIn('300',function(){ 
{ 
    if(myFlag == true) 
    { 
     // write the code here 
     myFlag = false; 
    } 
} 

Spero che questo aiuti ... Muhammad.

+0

Questa soluzione potrebbe essere la migliore per me da quando sto usando jQuery v1.4.2 e non è possibile aggiornarlo – Alon

4

Si dice esplicitamente di eseguire due volte perché è stato definito un selettore di due elementi. Se si desidera che venga eseguito una volta, le chiede di correre su un elemento:

jQuery("#div1") 
+0

grazie flem questa è la risposta corretta, per questa domanda: basta dividerle in due frasi: jQuery ("# ​​div1"). FadeIn ('300'); . jQuery ("# div2") fadeIn ('300', function() {{ contatore ++; console.log (contatore); }) – Anas

17

Una soluzione semplice:

$("#div1").fadeIn(300); 
$("#div2").fadeIn(300,function(){ 
    // do something only once 
}); 

la soluzione più pulita è quella di utilizzare jQuery's promise system:

$.when($("#div1, #div2").fadeIn('300')).done(function(){ 
    // do something only once 
}); 

demonstration

+0

Non funziona quando jQueery v1.4.2 è installato. – Alon

+0

Aggiorna jQuery. Siamo ora alla versione 1.8. –

+0

Se potessi fare l'aggiornamento l'avrei fatto :) – Alon

2

In termini di sequenziamento tuo codice:

jQuery("#div1, #div2").fadeIn('300',function(){ 
    counter++; 
    console.log(counteR); 
}); 

è lo stesso di

jQuery("#div1, #div2").each(function(){ 
    jQuery(this).fadeIn('300',function(){ 
     counter++; 
     console.log(counteR); 
    }); 
}) 

SO il callback sparerà per ogni elemento

2

Utilizzare la nuova .promise() in jQuery 1.6, è stato fatto per risolvere il più callback problema, utilizzare in questo modo:

var counter = 0; 
jQuery("#div1, #div2").fadeIn('300').promise().done(function() 
{ 
    counter++; 
    console.log(counter); 
}); 
Problemi correlati