jQuery's .bind () ve .on () karşılaştırması


207

Yeni fonksiyondan bahseden iki harika makale buldum .on(): jquery4u.com , elijahmanor.com .

.bind()Hala kullanımın daha iyi olduğu herhangi bir yol var mı .on()?

Örneğin, şöyle bir örnek kod var:

$("#container").click( function( e ) {} )

Seçici tarafından yalnızca bir öğe aldığımı ve benim durumumda, sayfam yüklendiğinde <div>adlandırılmış olanın var olduğunu not edebilirsiniz #container; dinamik olarak eklenmedi. JQuery'nin en son sürümünü kullandığımdan bahsetmek önemlidir: 1.7.2.

Bu örnek için, işlev tarafından sağlanan diğer özellikleri kullanmasam bile .on()yerine kullanılmalıdır ?.bind().on()


5
bu ikinci makale saçma. .bind()Birden çok öğeyi bağlamak için ne kadar kötü olduğunu söyler , ancak .on()bağlama modunda kullanıldığında aynı şeyi nasıl yaptığını belirtmez .
Alnitak

Yanıtlar:


316

Dahili olarak, jQuery'nin geçerli sürümünde .binddoğrudan eşler .on. (Aynı şey geçerli .live.) Bunun .bindyerine , küçük ama pratik olarak önemsiz bir performans isabeti var .

Ancak, .bindgelecekteki sürümlerden herhangi bir zamanda kaldırılabilir. Kullanmaya devam etmek için bir neden yoktur .bindve .onbunun yerine tercih etmek için her neden yoktur .


5
Muhtemelen - sadece mevcut bir işleve eşlendikleri için bunları kaldırmak için çok az neden var. Öte yandan, büyük bir sürüm numarasıyla yükseltme, API için hemen hemen her şeyi yapabileceğiniz anlamına gelir, çünkü geriye dönük uyumluluk o noktada garanti edilmez. Sadece söylüyorum'.
Blazemonger

6
@Esailija bu işlevlerin tümü, belirli eşzamansız istek türleriyle başa çıkmak için yararlı kısayollar sunar. .bindve .onyetkisi verilmeyen etkinlikler için aynıdır; .bindgibi kısayol her türlü sağlamaz $.getJSONyapar
jackwanders

7
@jbabey, teknik olarak herhangi bir işlevi kaldırmadıkları doğru olsa da, yine de bunları kullanımdan kaldırıyor ve kullanmamanızı tavsiye ediyorlar. Gelecekte her zaman onları tamamen kaldırmaya karar verebilirler (sürüm 2.x itibariyle belirli IE desteğini nasıl kaldırdıklarını). Kullanımdan kaldırılmış işlevler kullanılmamalıdır.
Hanna

8
"jQuery.fn.bind.toString ()" çıkışlar "işlevini yazdırma (a, b, c) {this.on döndür (a, null, b, c)}"
Jowen

5
bağlama ve çözme jQuery 3 itibariyle kullanımdan kaldırılmıştır.
Joe Mabel

58

Bu snippet'lerin hepsi aynı şeyi yapar:

element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });

Bununla birlikte, hepsi aynı şeyi yapan bunlardan çok farklıdır:

element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });

Olay işleyicileri ikinci seti kullanmak olay heyet ve dinamik olarak eklenen elemanlar için çalışacaktır. Delegasyon kullanan olay işleyicileri de çok daha performanslıdır. İlk set, dinamik olarak eklenen öğeler için çalışmaz ve performans için çok daha kötüdür.

jQuery'nin on()işlevi henüz mevcut olmayan yeni bir işlevsellik sunmaz, yalnızca jQuery'deki olay işlemeyi standart hale getirme girişimidir (artık canlı, bağlama veya temsilci arasında karar vermek zorunda değilsiniz).


1
Bence demek $('selector').live('click', function () { ... });istediğin sonucu mümkün olduğu kadar aynı tutuyorsun.
andlrc

11

Doğrudan yöntemler ve .delegateüstün API'lardır .onve bunları kullanımdan kaldırmaya niyeti yoktur.

Doğrudan yöntemler tercih edilir, çünkü kodunuz daha az dize olarak yazılır. Sessiz bir hata yerine bir olay adını yanlış yazdığınızda hemen hata alırsınız. Bence, o yazıp okumak için de daha kolay olacaktır clickdahaon("click"

.delegateDaha üstündür .onçünkü Tartışmanın düzenin:

$(elem).delegate( ".selector", {
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
});

Hemen delege edildiğini biliyorsunuz, çünkü delege diyor. Ayrıca seçiciyi anında görürsünüz.

İle .onkendisine hemen bile delege eğer açık değil ve seçici için sonunda bakmak zorunda:

$(elem).on({
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
}, "selector" );

Şimdi, isimlendirmesi .bindgerçekten korkunç ve yüz değeri daha kötü .on. Fakat.delegate yetki verilmemiş olaylar gerçekleştirilemez ve doğrudan bir yöntemi olmayan olaylar vardır, bu nedenle bu gibi nadir bir durumda kullanılabilir, ancak yalnızca yetki verilen ve yetki verilmeyen olaylar arasında temiz bir ayırma yapmak istediğiniz için.


8
JQuery 3.0 itibariyle .delegate () kullanımdan kaldırılmıştır.
loş


6

JQuery belgelerinden:

JQuery 1.7'den itibaren .on () yöntemi, olay işleyicilerini bir belgeye iliştirmek için tercih edilen yöntemdir. Önceki sürümlerde, bir olay işleyicisini doğrudan öğelere eklemek için .bind () yöntemi kullanılır. İşleyiciler jQuery nesnesindeki seçili öğelere eklenir, bu nedenle bu öğelerin .bind () çağrısının gerçekleştiği noktada olması gerekir. Daha esnek olay bağlama için, .on () veya .delegate () içindeki olay yetkisi tartışmasına bakın.

http://api.jquery.com/bind/


1
Unutmayın, belgelerin tavsiyesi sizi bağlayan, tıklayan, yaşayan, delege eden ve aynı zamanda ortaya çıkan tüm karışıklığı getiren ekipten geliyor. Bu konuda birden fazla siteyi okuduktan sonra, benim düşüncem, en iyi ve en doğru sitelerin 'üzerinde' "şeker kaplama" olarak tanımlanan, şeker böcekleri çeken ve delege gitmek için yol olmasıdır.
DaveWalley

4

Jquery 3.0 ve sonraki sürümlerde .bind kullanımdan kaldırılmıştır ve bunun yerine .on kullanmayı tercih ederler. @Blazemonger daha önce yanıt olarak kaldırılabilir ve kaldırılacağı için kesin. Daha eski sürümler için .bind ayrıca .on'u dahili olarak çağırır ve aralarında fark yoktur. Daha fazla ayrıntı için lütfen api'ye bakın.

.bind () için jQuery API belgeleri

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.