JQuery ile bir öğeye bağlı olayları bulabilir miyim?


355

Bu olayda iki olay işleyiciyi bağlarım:

<a href='#' id='elm'>Show Alert</a>

JavaScript:

$(function()
{
  $('#elm').click(_f);
  $('#elm').mouseover(_m);
});

function _f(){alert('clicked');}
function _m(){alert('mouse over');}

Bir öğeye bağlı tüm olayların bir listesini almanın herhangi bir yolu var mı id="elm"?

Yanıtlar:


517

JQuery'nin modern sürümlerinde, $._datasöz konusu öğeye jQuery tarafından eklenen olayları bulmak için yöntemi kullanırsınız. Not , bu bir iç kullanım tek yöntemdir:

// Bind up a couple of event handlers
$("#foo").on({
    click: function(){ alert("Hello") },
    mouseout: function(){ alert("World") }
});

// Lookup events for this particular Element
$._data( $("#foo")[0], "events" );

Sonuç, $._dataayarladığımız her iki etkinliği de içeren bir nesne olacaktır ( mouseoutözellik genişletilerek aşağıda resmedilmiştir ):

$ ._ için konsol çıkışı

Ardından, Chrome'da, işleyici işlevini sağ tıklayıp kodunuzda tam olarak tanımlandığı noktayı göstermek için "işlev tanımını görüntüle" yi tıklayabilirsiniz.


59
Bu yalnızca jQuery yardımcıları aracılığıyla bağlı öğeler için çalışır.
Alex Ciminian

3
@jammypeach Çözümünüzü deniyorum, ancak seçiciye hala tanımsız dönüyorum. $ ('# Elem') kullandım. Bind ('click', function () {}); bu bir fark yaratırsa.
Marcus

6
@marcus ahhh, woops Bir şey kaçırdım, özür dilerim :)$._data(element[0], ‘events’);
totallyNotLizards

16
Bu günlerde şunu kullanmalıyız: $ ._ data ($ ('# foo') [0]) .events
Donald Taylor

5
$._data()dahili JQuery tarafından kullanılır. $.data()kullanıcıya açık yöntemdir. Ve iyi $.data(element, 'events')çalışıyor.
Slideshowp2

73

Genel dava:

  • Hit F12açık Dev Araçlarına
  • Click Sourcessekmesini
  • Sağ tarafta, Event Listener Breakpointsağacı aşağı kaydırın ve ağacı genişletin
  • Dinlemek istediğiniz olayları tıklayın.
  • Hedef elemanla etkileşime geçin, ateş ederse hata ayıklayıcıda bir kırılma noktası elde edersiniz

Benzer şekilde şunları yapabilirsiniz:

  • hedef öğeye sağ tıklayın -> " Inspect element" seçin
  • Geliştirme çerçevesinin sağ tarafında aşağı kaydırın, alt kısımda ' event listeners'.
  • Öğeye hangi olayların eklendiğini görmek için ağacı genişletin. Bu, köpürme yoluyla işlenen etkinlikler için işe yarayıp yaramadığından emin değilim (tahmin etmiyorum)

3
Bunun tercih edilen yöntem olduğunu ve mevcut ya da bulunmayabilecek jQuery'e karşı evrensel bir çözüm olduğunu kabul ediyorum.
deadbabykitten

3
@dead umm ... soru özellikle jQuery'ye atıfta bulunur ve örnek ekte jQuery kullanır - yanıt yalnızca jQuery (?) bağlamında geçerli olmalıdır
Kod Jokey

3
Diğer bağlamlarda da cevapları anlamak faydalıdır. Birisinin belirli bir soru sorması, alacağı kısıtlı cevabın mevcut en iyi cevap olduğu anlamına gelmez. Özellikle jQuery ile insanlar bir koltuk değneği olarak ona güvenme eğilimindedir. Temel mimariyi anlamak önemlidir. Bu cevap, jQuery'nin bile gerekli olmadığını göstermektedir. Soru ve örnek, kullanımı bilmek için çok belirsizdir ve bu nedenle, geçerli bir cevap olarak kabul edilebilecek yorumu yorumlamaya açık bırakır.
deadbabykitten

12

Bunu gelecek nesiller için ekliyorum; Daha fazla JS yazmayı gerektirmeyen daha kolay bir yol var. Firefox için şaşırtıcı firebug eklentisini kullanarak ,

  1. Öğeyi sağ tıklayın ve 'Öğeyi Firebug ile incele'yi seçin
  2. Kenar çubuğu panellerinde (ekran görüntüsünde gösterilir), minik> oku kullanarak etkinlikler sekmesine gidin
  3. Olaylar sekmesi, her olay için olayları ve karşılık gelen işlevleri gösterir
  4. Yanındaki metin fonksiyonun yerini gösterir

resim açıklamasını buraya girin


1
Bu, IE geliştirici araçlarında da mevcuttur.
devlin carnate

9

Artık getEventListeners () javascript işlevini kullanarak bir nesneye bağlı olay dinleyicilerinin listesini alabilirsiniz.

Örneğin, dev araçlar konsoluna aşağıdakileri yazın:

// Get all event listners bound to the document object
getEventListeners(document);

4
Bu yerel bir işlev değildir ve aşağıdaki komut dosyası / bağımlılık ihtiyacı olduğunu düşünüyorum: github.com/colxi/getEventListeners Aksi takdirde yanıltıcı olduğu için bu cevaba eklenmelidir. Ama beni bu 'eklentiye' getirdiğiniz için teşekkürler; güzel gözüküyor. :)
Dennis98

6

JQuery Denetim eklentisi eklentisi normal Chrome Dev Araçları üzerinden bunu yapmasına izin gerekir. Mükemmel değil, ancak gerçek işleyiciyi yalnızca genel jQuery işleyicisine değil, öğeye / olaya bağlı görmenize izin vermelidir.


3

Bu, jQuery seçicileri / nesnelerine tam olarak özgü olmasa da, FireFox Quantum 58.x'te, Dev araçlarını kullanarak bir öğedeki olay işleyicilerini bulabilirsiniz:

  1. Öğeyi sağ tıklayın
  2. Bağlam menüsünde 'Öğeyi Denetle'yi tıklayın
  3. Öğenin yanında (ev kutusu) bir 'ev' simgesi varsa, 'ev' simgesini tıklayın
  4. Bu öğe ve olay işleyici için tüm olayları görüntüler

FF Quantum Dev Araçları


1
harika cevap, özellikle ekran görüntüsü çok daha kolay hale getirir. Çaba için teşekkürler!
bizi

2

($ ._ data ($ ("a.wine-item-link") [0]). Events == null) {... bir şey yapın, olay işleyicilerini hemen tekrar bağlayın} öğem herhangi bir etkinliğe bağlıysa. Tüm olay işleyicilerinizi bu öğeden atamamışsanız yine de undefined (null) diyecektir. Bunu bir if ifadesinde değerlendirmemizin nedeni budur.


2

Olayların söz konusu öğeden ziyade belgenin kendisine eklenebileceğini unutmayın. Bu durumda şunları kullanmak isteyeceksiniz:

$._data( $(document)[0], "events" );

Ve olayı doğru seçiciyle bulun :

resim açıklamasını buraya girin

Ve sonra işleyiciye bakın > [[FunctionLocation]]

resim açıklamasını buraya girin


0

Biraz karmaşık DOM sorgusu gibi $ ._ veri geçirdiğimde: $._data($('#outerWrap .innerWrap ul li:last a'), 'events')tarayıcı konsolunda tanımsız atar.

Bu yüzden $._data($('#outerWrap')[0], 'events')bir etiket için olayları görmek için üst div: $ ._ verileri kullanmak zorunda kaldı . İşte aynısı için bir JSFiddle: http://jsfiddle.net/giri_jeedigunta/MLcpT/4/


3
Bunun nedeni, etkinliği temsilci seçmenizdir $('#outerWrap'). Olaylar aslında tek tek sabitleyiciler yerine bu öğeye bağlıdır.
Scottux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.