Jfriend00'ün cevabına bazı açıklamalar ve karşı-değişkenler eklemek istiyorum. (çoğunlukla sadece bağırsak hislerime dayanan görüşlerim)
Hayır - yetki verilen tüm olay işleyicilerini belge nesnesine BAĞLAMAMALISINIZ. Bu muhtemelen oluşturabileceğiniz en kötü performans senaryosudur.
Öncelikle, etkinlik devri kodunuzu her zaman daha hızlı hale getirmez. Bazı durumlarda, avantajlıdır ve bazı durumlarda değildir. Etkinlik yetkilendirmesine gerçekten ihtiyaç duyduğunuzda ve bundan yararlanabiliyorsanız etkinlik yetkisi kullanmalısınız. Aksi takdirde, genellikle daha verimli olacağından, olay işleyicilerini doğrudan olayın gerçekleştiği nesnelere bağlamalısınız.
Tek bir öğe için kayıt ve etkinlik yapacaksanız performansın biraz daha iyi olabileceği doğru olsa da, delegasyonun getirdiği ölçeklenebilirlik avantajlarına karşı ağırlık vermediğine inanıyorum. Ayrıca, bunun bir kanıtı olmamasına rağmen, tarayıcıların bunu daha verimli bir şekilde ele alacağına inanıyorum. Benim görüşüme göre, etkinlik heyeti gidilecek yoldur!
İkinci olarak, temsil edilen tüm olayları belge düzeyinde BAĞLAMAMALISINIZ. İşte tam da bu nedenle .live () kullanımdan kaldırılmıştır, çünkü bu şekilde çok sayıda olayınız olduğunda bu çok verimsizdir. Yetki verilen olay işleme için, bunları dinamik olmayan en yakın ebeveyne bağlamak çok daha verimlidir.
Buna katılıyorum. Bir etkinliğin yalnızca bir kap içinde olacağından% 100 eminseniz, olayı bu kapsayıcıya bağlamak mantıklıdır, ancak yine de olayları doğrudan tetikleyici öğeye bağlamaya karşı çıkacağım.
Üçüncü olarak, tüm olaylar işe yaramaz veya tüm sorunlar yetki devri ile çözülemez. Örneğin, bir giriş denetimindeki önemli olayları durdurmak ve geçersiz anahtarların giriş denetimine girmesini engellemek istiyorsanız, yetki verilen olay işlemeyle bunu yapamazsınız çünkü olay yetki verilen işleyiciye ulaştığında, zaten giriş kontrolü tarafından işlendi ve bu davranışı etkilemek için çok geç.
Bu doğru değil. Lütfen bu kodu inceleyinPen: https://codepen.io/pwkip/pen/jObGmjq
document.addEventListener('keypress', (e) => {
e.preventDefault();
});
Dokümanda keypress olayını kaydederek kullanıcının yazmasını nasıl önleyebileceğinizi gösterir.
Etkinlik temsilcisinin gerekli veya avantajlı olduğu zamanlar:
Olayları yakaladığınız nesneler dinamik olarak oluşturulduğunda / kaldırıldığında ve her seferinde yeni bir tane oluşturduğunuzda olay işleyicilerini açıkça yeniden bağlamak zorunda kalmadan yine de olayları yakalamak istediğinizde. Hepsi aynı olay işleyiciyi isteyen çok sayıda nesneniz olduğunda (lotların en az yüzlerce olduğu). Bu durumda, kurulum zamanında yüzlerce veya daha fazla doğrudan olay işleyicisinden ziyade bir temsilci olay işleyiciyi bağlamak daha verimli olabilir. Yetkilendirilmiş olay işlemenin çalışma zamanında doğrudan olay işleyicilerinden her zaman daha az verimli olduğunu unutmayın.
Bu alıntıya https://ehsangazar.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c adresinden yanıt vermek istiyorum.
Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.
Ayrıca, googling performance cost of event delegation google
, etkinlik delegasyonu lehine daha fazla sonuç döndürür.
Belgenizdeki herhangi bir öğede gerçekleşen olayları (belgenizde daha yüksek bir düzeyde) yakalamaya çalıştığınızda. Tasarımınız, sayfanızdaki bir sorunu veya özelliği çözmek için açıkça etkinlik köpürme ve stopPropagation () kullanıyorsa. Bunu biraz daha anlamak için, jQuery yetkilendirilmiş olay işleyicilerinin nasıl çalıştığını anlamak gerekir. Böyle bir şey çağırdığınızda:
$ ("# myParent"). üzerinde ('tıklayın', 'button.actionButton', myFn); #MyParent nesnesine genel bir jQuery olay işleyicisi yükler. Bir tıklama olayı bu yetki verilen olay işleyiciye kadar kabarcıklar oluşturduğunda, jQuery'nin bu nesneye eklenmiş yetki verilen olay işleyicileri listesini gözden geçirmesi ve olayın kaynak öğesinin devredilen olay işleyicilerinden herhangi biriyle eşleşip eşleşmediğini görmesi gerekir.
Seçiciler oldukça dahil olabileceğinden, bu, jQuery'nin her bir seçiciyi ayrıştırması ve ardından her seçiciyle eşleşip eşleşmediğini görmek için orijinal olay hedefinin özellikleriyle karşılaştırması gerektiği anlamına gelir. Bu ucuz bir operasyon değil. Bunlardan yalnızca biri varsa önemli değil, ancak tüm seçicilerinizi belge nesnesine koyarsanız ve her kabarmış olayla karşılaştırmak için yüzlerce seçici varsa, bu olay işleme performansını ciddi şekilde engellemeye başlayabilir.
Bu nedenle, yetki verilen olay işleyicilerini, yetki verilen bir olay işleyicisinin hedef nesneye pratik kadar yakın olacak şekilde ayarlamak istersiniz. Bu, devredilen her olay işleyicisinden daha az olayın patlayacağı ve böylece performansı artıracağı anlamına gelir. Devredilen tüm olayları belge nesnesine koymak mümkün olan en kötü performanstır, çünkü tüm kabarcıklı olaylar tüm devredilen olay işleyicilerinden geçmeli ve olası tüm devredilen olay seçicilerine göre değerlendirilmelidir. İşte tam olarak bu nedenle .live () kullanımdan kaldırılmıştır çünkü .live () bunu yaptı ve çok verimsiz olduğunu kanıtladı.
Bu nerede belgeleniyor? Bu doğruysa, o zaman jQuery yetkiyi çok verimsiz bir şekilde ele alıyor gibi görünüyor, ve sonra karşı argümanlarım sadece vanilya JS'ye uygulanmalı.
Yine de: Bu iddiayı destekleyen resmi bir kaynak bulmak istiyorum.
:: DÜZENLE ::
JQuery gerçekten olay verimsiz bir şekilde köpürme yapıyor gibi görünüyor (IE8'i destekledikleri için)
https://api.jquery.com/on/#event-performance
Buradaki argümanlarımın çoğu sadece vanilya JS ve modern tarayıcılar için geçerli.