Bunu okumadan önce, bu etkinlik listesini başka bir sayfada kaldırın, API'nın kendisi son derece yararlıdır ve aşağıda tartıştığım şeylerin tümü doğrudan bu sayfadan bağlantılıdır .
İlk olarak, .click(function)kelimenin tam anlamıyla bir kısayol .bind('click', function), eşdeğerdir. Bir işleyiciyi doğrudan bir öğeye bağlarken bunları kullanın , örneğin:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Bu eleman değiştirilir veya atılırsa, bu işleyici artık orada olmayacaktır. Ayrıca , işleyici eklemek için bu kod çalıştırıldığında orada olmayan elemanlar (örneğin, seçici onu buldu) işleyiciyi alamaz.
.live()ve .delegate()benzer şekilde ilişkilidir, .delegate()aslında .live()dahili olarak kullanır , her ikisi de olayları kabarcık haline getirir. Bu yeni ve eski unsurlar için çalışır , olayları aynı şekilde kabarcıklar. Bunları öğeleriniz değiştiğinde, örneğin yeni satırlar, liste öğeleri vb. Eklediğinizde kullanırsınız. Sayfada kalacak ve hiçbir noktada değiştirilmeyecek bir üst / ortak ataya sahip değilseniz, aşağıdakini kullanın .live():
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Bununla birlikte, değiştirilmeyen bir yerde bir üst öğeniz varsa (böylece olay işleyicileri güle güle gitmez) .delegate(), bununla başa çıkmalısınız :
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Bu neredeyse aynı şekilde çalışır .live(), ancak olay yakalanmadan ve işleyicilerin idam edilmesinden önce daha az kez kabarcıklar. Her ikisinin de bir diğer yaygın kullanımı, sınıfınızın bir öğe üzerinde değiştiğini, artık kullandığınız seçiciyle eşleşmediğini ... bu yöntemlerle seçicinin olay sırasında değerlendirildiği , eğer eşleşmesi durumunda , işleyicinin çalıştığı .. böylece öğe artık seçici konularla eşleşmiyor, artık yürütülmeyecek. Bununla .click()birlikte, olay işleyicisi doğrudan DOM öğesine bağlanır, ilgisiz olduğunu bulmak için kullanılan herhangi bir seçiciyle eşleşmemesi gerçeği ... olay bağlanır ve bu öğe gidene veya işleyici kalıncaya kadar kalır , üzerinden kaldırıldı .unbind().
Yine bir başka yaygın kullanımı .live()ve .delegate()bir performans . Çok sayıda öğe ile uğraşıyorsanız , her bir öğeye doğrudan bir tıklama işleyicisi eklemek pahalı ve zaman alıcıdır. Bu durumlarda, tek bir işleyici kurmak ve köpürmenin işi yapmasına izin vermek, büyük bir fark yarattığı bu soruya bir göz atmak daha ekonomiktir , uygulamanın iyi bir örneğidir.
Tetikleme - güncellenmiş soru için
Kullanılabilir 2 ana olay işleyici tetikleme işlevi vardır, bunlar API'da aynı "Olay İşleyici Eki" kategorisine girer , bunlar .trigger()ve .triggerHandler(). .trigger('eventName')ortak etkinlikler için yerleşik bazı kısayollara sahiptir, örneğin:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Bu kısayolları içeren bir girişi burada görüntüleyebilirsiniz .
Fark gelince .trigger(), olay işleyiciyi tetikler (ancak çoğu zaman varsayılan eylemi değil, örneğin imleci tıklatılan doğru noktaya yerleştirme <textarea>). Olay işleyicilerinin bağlı oldukları sırada (yerel etkinliğin yaptığı gibi) gerçekleşmesine neden olur, yerel olay eylemlerini tetikler ve DOM'u havaya uçurur.
.triggerHandler()genellikle farklı bir amaç içindir, burada yalnızca bağlı işleyiciyi / işleyicileri kovmaya çalışıyorsunuz, yerel etkinliğin tetiklenmesine neden olmaz, örneğin bir form gönderme. DOM'u patlatmaz ve zincirlenebilir değildir (o olay için son bağlı olay işleyiciyi döndürürse döndürür). Örneğin, bir focusolayı tetiklemek istiyor ancak nesneyi gerçekten odaklamak istemiyorsanız, yalnızca bağlı olduğunuz kodun .focus(fn)çalışmasını istiyorsunuz, .trigger()bunu yaparsınız, bunu yaparken öğeye odaklanıp kabarırsınız.
İşte gerçek bir dünya örneği:
$("form").submit(); //actually calling `.trigger('submit');`
Bu, herhangi bir gönderme işleyicisini, örneğin jQuery doğrulama eklentisini çalıştırır ve ardından göndermeyi dener <form>. Ancak, yalnızca bir submitolay işleyici aracılığıyla bağlandığından , ancak <form>daha sonra göndermediğinden doğrulamak istiyorsanız, şöyle kullanabilirsiniz .triggerHandler('submit'):
$("form").triggerHandler('submit');
Eklenti, doğrulama denetiminin geçememesi durumunda işleyicinin formu bombalayarak göndermesini önler, ancak bu yöntemle ne yaptığını umursamıyoruz. O iptal veya olmasın biz değiliz İster çalışırken formu göndermek için, sadece yeniden doğrula bunu tetikleyebilir ve başka bir şey yapmak istedim. ( Feragatname: Bu, .validate()eklentide bir yöntem olduğu için gereksiz bir örnektir , ancak niyeti iyi bir şekilde göstermektedir)