10

jQuery performansı hakkında başka bir SO sorusu okudum, ayrı ayrı elemanlara bağlanmaktan ziyade olay temsilcisini kullanarak değer kazanmaya başladığım noktayı düşünmeye başladım. Esas olarak jQuery hakkında düşünüyordum, ama muhtemelen genel olarak Javascript için geçerli olduğunu varsayalım. işleyicileri DOM takılan henüz oluşturulmamış elemanlar/üzerinde çalışmak için izinEtkinlik delegasyonunun değerli hale gelmesi için kaç öğe var?

  1. :

    Olay heyeti iki ana amacı vardır.

Benim soruya ortak bir atası elemana ziyade çoklu kardeş elemanlarına bir işlevi bağlama bu ikincisinin hakkındadır. Genel cevap muhtemelen "kesin duruma bağlıdır", ancak bunu test etmek için bir başparmak veya bir kıyaslama kuralı varsa merak ediyorum.

Yani, soru şu: Olay temsilcisinin performans avantajları, performans maliyetlerinden daha ağır basmadan önce kaç tane öğeye ihtiyacınız var? Bu, jQuery docs (http://api.jquery.com/delegate/) göre ....

<ul id="navUL"> <li><a href="one.html">One</a></li> <li><a href="two.html">Two</a></li> <li><a href="three.html">Three</a></li> </ul> 

Sadece (benim için) şeyleri temizlemek için:

+0

Bilmiyorum Olay heyetinin performans maliyetlerini bilir… Bunlar nedir? Olaylar yine de kabarcıklanır ve etkinlik hedefi, olay nesnesinin ilgili özelliğinde her zaman depolanır. –

+1

@Sime Düşündüğüm ana olay, bir olay her tetiklendiğinde, temsilci aramasındaki seçicinin, olay hedefiyle eşleşip eşleşmediğini kontrol etmek için çalıştırılması gerektiğiydi. Başkaları olabilir ... – lonesomeday

+2

Delegasyonu kullandığınızda, sayfa ömür boyu bağlama işleyicilerinin maliyetini etkin bir şekilde yaydığınızı düşünün. Önce öğeleri bularak bağladığınızda, kullanıcılar gecikmelere karşı en duyarlı oldukları zaman sayfa yükleme süresine daha fazla iş eklersiniz. – Pointy

cevap

3

bu HTML yapısını varsayarsak

$("#navUL").delegate("a", "click", function(){ 
    // anchor clicked 
}); 

... Bu eşdeğerdir:

$("#navUL").each(function(){ 
    $("a", this).live("click", function(){ 
     // anchor clicked 
    }); 
}); 

Ancak olay heyeti (biliyorum gibi) şudur:

$("#navUL").click(function(e) { 
    if (e.target.nodeName !== "A") { return false; } 
    // anchor clicked 
    // anchor is referenced by e.target 
}); 

Yani UL elemanı tıklama olayını yakalamak ve sonra aslında event.target mülkiyet yoluyla tıklandığı çapa anlamaya.

ben temsilci() yöntemi hakkında bilmiyorum, ama bu son tekniği her zaman çok gibi #navUL elemanı her çapa kadar olay işleyicileri takılarak daha hızlı olması gerekir:

$("#navUL a").click(function() { 
    // anchor clicked 
    // anchor is referenced by the this value 
}); 
+0

Örnek olarak bildiğiniz gibi temsilcinizdeki bir “e.stopPropagation();” gerekmez mi? –

+0

Hm, neden? Kullanıcı #navUL öğesinin içinde bir yere tıklar. Tıklama olayı #navUL öğesine yayılır (A veya LI öğelerine bağlı hiçbir tıklama işleyicisi olmadığından). #navUL tıklama işleyicisinin içinde, bir bağlantı noktasının tıklatılıp tıklanmadığını kontrol ederim. Değilse, sadece olayı öldürürüm (false yoluyla;). Eğer evet ise, istediğimi yapıyorum (çapa ile). Bağlantının varsayılan davranışını engellemek isteyebilirim, ancak neden tıklama olayının DOM ağacının köprüsünü almasını engellemek istediğimi anlamıyorum (zaten herhangi bir tıklama işleyicisi yok; –

+0

Evet, haklısın. –