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

Fiddle tutaj: http://jsfiddle.net/y97h9/Jak wykonać tę funkcję raz?

Powyższy kod wypisze 'test' dwa razy w konsoli. Jak mogę go wydrukować tylko jeden raz. Czy to możliwe?

+0

Co ty oprócz? czy div2 nie istnieje? Testuj lub nie testuj w konsoli? –

+0

umieść boolean poza czekiem, przełącz go wewnątrz czeku. – Shark

+5

Wywołałeś funkcję na dwóch różnych elementach DOM. To normalne, że funkcja jest wywoływana dwa razy. Czego jeszcze się spodziewałeś? –

Odpowiedz

27

Oczywiście, można użyć jQuery promise rozwiązać wiele Callbacki problem:

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

Sposób .promise() zwraca dynamicznie generowane obiecują, że jest rozwiązany raz wszystkie działania pewnego rodzaju związanego gromadzenie, kolejce czy nie zakończyły

Working Demo

+0

To zręczne ... +1. – jmar777

+0

+1 dla elegancji – Ejaz

+0

Co się stanie, jeśli '# div1' lub' # div2' już będzie miało animacje oprócz 'fadeIn'? Czy to nie potrwa zbyt długo (być może)? Może nieporozumienie. – Ian

3

Połączenie zwrotne zostanie uruchomione jeden raz dla każdego dopasowanego elementu. Zawsze można ustawić flagę, aby sprawdzić, czy jest prowadzony już jednak:

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

Bardzo brzydki. To jest [dobrze rozwiązany problem] (http: //api.jquery.com/promise /) w JavaScript i jQuery, a to nie jest rozwiązanie do użycia. – meagar

+0

@meagar Nie rozumiem, jak "obietnica" może rozwiązać ten problem ... i ta odpowiedź jest daleka od "brzydkiej". Właściwie to jest na miejscu. – Ian

+3

@meagar To nie jest specjalnie sprytne, ale jest proste i nie będzie cierpieć z powodu pewnych subtelnych problemów omawianych w odpowiedzi user1479606. Ja jednak wolę swoją odpowiedź od mojej, jeśli nie masz w tym samym czasie innych animacji. Ian, dzięki :) – jmar777

-1

Użyj logiczną flagę aby zapobiec console.log („test”); od wezwania dwa razy.

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