2013-06-15 16 views
6

jquery için acemiyim. Farz edelim ki, bir olay işleyicisinin fareyle üzerine eklenen 10 "a" etiketinin bir listesi var, sırasıyla, mouseout'u tıklayın.
Yapmak istediğim, "a" öğelerinin tümünü yinelemek ve jquery tetikleyiciyi kullanarak bu olayları tetiklemek.
Karşılaştığım sorun şu ki, bu olaylar tetiklenecek bir süre alıyor, dolayısıyla kodu çalıştırdığımda, sonuçta yalnızca son öğede değişikliği görüyorum. Arabulucular değil. Jquery Trigger Olayları programlı olarak ve bir sonraki olayın eylemi tamamlanana kadar bekleyiniz. Bir sonraki

$.each($("#styles a"), function(){ 
    console.log("picked up " + $(this)); 
    setTimeout(qwe($(this)), 2000); 
}); 

function qwe(obj) { 
    console.log(obj.attr("id")); 
    $.when(obj.trigger("mouseover").trigger("click").trigger("mouseout")) 
     .then(function() { 
      console.log("Changing Result Value" + $("#textTag").text()); 
     }); 
} 

orada zincir yolu bu olaylar mi sırayla, yani
ikinci elemanın, olayların önce elemanların tetikleme işlemi tamamlandığında sadece trigged edilmelidir. SO üzerinde arama yapmayı denedim, ancak çoğunlukla makaleler yalnızca tek bir olayı tetikleme etrafında dönüyor. Teşekkür

+0

Sanırım jQuery'nin '.trigger()' bir söz vermez, ve eğer yapmış olsa bile, olay işleyicileri ne zaman bitirdiğini bilmenin bir yolu yok, çünkü oraya bir şey koyabilirdiniz. geri arama yok mu? – adeneo

+0

Henüz herhangi bir geri arama yapmadım. googling'de, bu tür bir işlevsellik otomatik test durumlarını çalıştırmaya daha yakın bulundu. kısıtlama nedeniyle jquery ile çalıştırmak zorunda kalacağım. Bunun üçüncü taraf sitelerinde çalışması gerekecek, bu yüzden olayların sonucundaki geri bildirimleri garanti edemem. – jaipster

cevap

0

sonra, zincirin her bölümü için $ .Deferred nesneleri oluşturma onları bağlayan olaylar aslında tetiklendiğinde çözülecek:

callbacks = [$.Deferred(), $.Deferred(), $.Deferred()]; 
obj.on('mouseover', callbacks[0].resolve); 
obj.on('click', callbacks[1].resolve); 
obj.on('mouseout', callbacks[2].resolve); 
$.when(callbacks).done(function() { console.log('all three have fired'); }); 

Siparişin olmasını sağlamak için ek mantık gerekiyordu korunur - tıklatma mouseouttan önce tetiklenmezse belki de 'reddet' özelliğini kullanarak.

İlgili konular