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

Fiddle: http://jsfiddle.net/y97h9/Fonksiyon bir kez nasıl çalıştırılır? Burada

Yukarıdaki kod konsolunda 'Test' da iki kez yazdırılır. Bunu sadece bir kez yazdırabilirim. Mümkün mü?

+0

Neler var? div2 yoksa var mı? Konsolda test mi yoksa test mi? –

+0

kontrolün dışına bir boole yerleştirin, kontrolün içine getirin. – Shark

+5

İşlevi 2 farklı DOM öğesinde aradınız. Fonksiyonun iki kez çağrılması normaldir. Başka ne olmasını bekliyordun? –

cevap

27

Tabii, birden geri aramaları sorunu çözmek için jQuery promise kullanabilirsiniz:

$("#div1, #div2").fadeIn('500').promise().done(function() 
{ 
    console.log('Test'); 
}); 
.promise() yöntemi kez bağlı belirli bir türdeki tüm eylemleri çözülmüş bir dinamik olarak Promise döndüren

toplanması, sıraya ya da değil, sona ermiş

Working Demo

+0

Bu kaygan ... +1. – jmar777

+0

+1 zarafet için – Ejaz

+0

'# div1' veya' # div2' zaten 'fadeIn' öğesine ek olarak animasyonlar oluyorsa ne olur? Çok uzun süre beklemez mi (muhtemelen)? Belki de yanlış anlayabiliyorum – Ian

3

Geri arama, her eşleşen öğe için bir kez çalışacaktır. Her zaman zaten olsa çalıştırılmış olup olmadığını görmek için bir bayrak ayarlayabilirsiniz:

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

Çok çirkin. Bu [iyi çözülmüş bir problem] (http: //api.jquery).com/promise /) JavaScript ve jQuery'de, ve bu çözüm kullanılacak bir çözüm değildir. – meagar

+0

@meagar Bu sözü nasıl çözebileceğimi bilmiyorum ... ve bu cevap "çirkin" olmaktan çok uzak. Aslında üzerinde nokta var. – Ian

+3

@meagar Özellikle zekice değil, ancak ileriye doğru ve kullanıcı1479606'nın cevabında tartışılan bazı ince sorunlardan muzdarip değil. Ancak, aynı anda başka animasyonlarınız yoksa, cevabını benimkinden daha çok tercih ederim. Ian, teşekkürler :) – jmar777

-1

console.log ('Test') engellemek için bir boolean bayrak kullanın; iki kere çağırılmaktan.

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