2012-02-07 14 views
5

Şu anda üniversitem için bir proje üzerinde çalışıyorum. Yapmam gereken bir şey, kayıtlı tüm javascript-olay listelerini sunucuyla senkronize etmektir. Yani Hangi elemanların belirli bir olay işleyicisine sahip olduğunu bilmem gerekiyor.JavaScript/jQuery: Yeni kaydolan olay sorumlularını dinliyorum

VisualEvent'u zaten kullanıyorum, hangi öğelerin olay işleyicileri olduğunu ve gerçekten harika çalıştığını öğrenmek için kullanıyorum.

Ancak ihtiyacım olan şey bir DOM öğesi için bir olay işleyicisi kaydedildiğinde her zaman çağrılan bir olay dinleyicisine sahip olmak.

Temel olarak her zaman $("#foo").click(...) veya $("#foo").bind(...) gibi bir şey çağrılır, bu öğe için yeni bir olay işleyicisinin kaydedilmiş olduğu bilgileri almam gerekir.

Tersine bir işleyici bir DOM öğesinden kaldırıldığında bir dinleyiciye ihtiyacım var, ancak bu ilk prototip için zorunlu değildir.

Tüm olay işleyici kayıtlarına global olarak bir işleyici ekleyebileceğim bir yol var mı?

Daha fazla bilgiye ihtiyacınız varsa, yorum yapmaktan çekinmeyin. Herhangi bir yardım için şimdiden

teşekkürler!

Saygılarımızla, Robert

+1

neden sunucu gerek yok geçersiz kılmak zorunda kalacak biliyor musunuz? – zzzzBov

+0

Bu, bir web sitesini uzaktan kontrol etmek için bir araştırma projesinin bir parçasıdır. Böylece sunucunun hangi öğelerin tıklanabilir olduğunu bilmesi gerekiyor. –

+0

Soruna yaklaşmanın daha iyi bir yolu olduğundan eminim, ama size iyi bir tavsiyede bulunmak için sorun hakkında yeterince bilgim yok. – zzzzBov

cevap

8

jQuery 1.7+ kullanıyorsanız, tüm yöntemler olayları jQuery.fn.on geçmesi takmak için, bu yüzden bu işlevi sürme aşırı ve vahşi gidiyor basit bir dava; Eğer jQuery < 1.7 kullanıyorsanız ve yükseltemiyorsanız

(function() { 

    var old = jQuery.fn.on; 

    jQuery.fn.on = function (events, selector, data, handler) { 
     // Ensure you still attach the events 
     var result = old.apply(this, arguments); 

     // Now do your own thing 

     // Inside here, `this` refers to the jQuery object on which `on` was invoked; 
     // it's not a specific element like it normally is within jQuery. You then 
     // therefore use something like `this.each(function() { /* this */ }); to 
     // target each element in the set. 

     // You might want to normalize the variables, as selector and data are optional, 
     // and events can be an object or string 
     jQuery.post('/spy.php', { 
      events: events, 
      selector: selector, 
      data: data 
     }, jQuery.noop); 

     return result; // keep the signature of `on`, and return the value `on()` *would* have done. 
    }; 

}()); 

, yukarıdaki benzer bir şey yapabiliriz, ama bind(), live(), delegate() vb

+2

Yine de olayın eklendiği öğeleri tanımlamak için bazı yöntemlere gereksiniminiz olsa da. Her öğenin işaretlemede benzersiz bir kimliği olmadığı sürece bunun nasıl çalışabileceğinden emin değil. Eğer durum buysa, elemanlar gibi bir şey kullanabilirsiniz: this.map (function() {return this.id;}) get(). Postda (",") 'ye katılın. –

+0

Bu mükemmel çalışıyor, çok teşekkürler Matt ve Dave! :) –