2011-11-30 13 views
5

Ben soru için bu test kodu yaptık: http://jsfiddle.net/5phqm/1/Neden jQuery's triggerHandler() satır içi olayları engellemez?

Bildiğim kadarıyla anladığım kadarıyla jQuery en triggerHandler() varsayılan tarayıcı davranışlarını önler eğer, o zaman yerli JavaScript etkinliklerini tetiklenir olmayacak ve ele (ve de addEventListener() için doğrudur benim kod), ancak onclick="" etiketinin özniteliği ile eklenen satır içi olay, yine de tetiklenecektir! Neden oluyor? Tarayıcıda tetikleyen olaylar hakkında bir şeyleri yanlış anladım mı?

+0

Buna değer bir şey varsa, bunu her zaman CSS kurallarının davranış modelini izleyerek düşünürüm: satır içi kod, 'head'de bulunan kodu geçersiz kılar ve bu da harici bir komut dosyasında bulunan kodu geçersiz kılar. Basitçe 'removeAttr' ('onclick') 'olabilir. –

+2

Bu doğrudan bir yanıt değil, jQuery web sitesinde, satır içi etkinlik işleyicileriyle ilgili sorunlarda çalışmadıklarını belirtiyorlar: http://docs.jquery.com/Won't_Fix#Inline_Event_Handlers. Kodunuzun neden böyle davrandığını bilmek isterdim, ama bunun için bir çözüm olacağını düşünmüyorum (bir hata bulursanız). – pimvdb

cevap

2

O explicitly coded çünkü satır içi işleyicileri çalıştırmak olduğunu teyit edilebilir: ontype bu durumda "onclick" içindedir

handle = ontype && cur[ ontype ]; 
if (handle && jQuery.acceptData(cur) && handle.apply(cur, data) === false) { 
    event.preventDefault(); 
} 

. Yani öğenin onclick özelliğini getiriyor ve sonra yürütüyor. Bu kod parçası, .trigger/.triggerHandler'dan bağımsız olarak her zaman çağrılır.

Yerli eylemler ancak elem.click() gibi sadece inside an if block yürütülür: onlyHandlers.trigger için triggerHandle için true ve false ve bu nedenle triggerHandler örneğin yürütmüyor

if (!onlyHandlers && !event.isDefaultPrevented()) { 
    // ... 
    elem[ type ](); 

elem.click() (.trigger yapar). Bu şekilde, yerel eylem engellenir.

Satır içi işleyiciler ve yerel eylemler ayrı şeylerdir ve ayrıca ayrı ayrı ele alınır. Yalnızca yerel eylemler .triggerHandler tarafından engellenir.

0
bence

(ama, ben jQuery kaynak kodu kısaca göz bir tahmin verdi ediyor ve bu tamamen yanlış olabilir) jQuery

$(elem).data("events"); 
gibi bir şey arayarak jQuery.trigger.event öğelere eklenmiş olayları alır,

ve daha sonra bunların ateşlenip/kesilmeyeceğine karar verir. Satır içi olaylar bu şekilde toplanamaz ve bu nedenle durdurulamazlar.