2011-02-08 17 views
6

Her zaman böyle bir yaklaşımın ne kadar temiz olduğunu merak ettim - bir olay dinleyicisini bu dinleyicinin içinden çıkarmak.JavaScript: Bu dinleyici içinden bir etkinlik dinleyicisini kaldırın?

GÜNCELLEME:

Dahili olarak ben nesneleri ve dinleyici karmasını tutmak, bu yüzden potansiyel olarak herhangi bir yerden olay dinleyicisi kaldırabilirsiniz. Sadece onu kendi içinden kaldırmakla ilgileniyorum. Böyle bir eylem aslında bir iş yapacak mı?

GÜNCELLEME

Ben addEventListener, removeEventListener şeylerden soruyorum. Eğer ilgilendiğinizden

some_div.onclick = function() { 
    ... 
    this.onclick = null; 
    // or: some_div.onclick = null; 
}; 

Yoksa olay dinleyicileri geçerli:

+0

'addEventListener' veya' .onxxx = 'hakkında mı konuşuyoruz? –

cevap

1

Sen denir biçimine bağlı olarak, böyle bir şey deneyebilir? Çünkü bunlar biraz daha karmaşık.

+0

Yep dinleyicileri ... İşleyicilerin ve dinleyicilerin aynı olduğunu sanıyordum, değil mi? – jayarjo

+0

Güncel soru. – jayarjo

+1

@jayarjo Bir öğenin etkinlik başına yalnızca bir işleyicisi olabilir, ancak herhangi bir miktarda dinleyici olabilir.Bu benim anlayışım, her neyse. – sdleihssirhc

0

jQuery'yi kullanırsanız, büyük olasılıkla, olay işleyicileriyle etkileşim için bazı kolaylık yöntemlerine sahip olacaksınız - bkz. Bind()/unbind(), delegate()/undelegate(), one() ve similar methods.

Diğer çerçevelerle çok fazla deneyimim yok, ancak benzer işlevler sunduğunu hayal ediyorum. Hiç bir çerçeve kullanmıyorsanız, @sdleihssirhc'nin kabul edilebilir bir cevabı vardır.

DÜZENLEME: Ah, belki de addEventListener() ve removeEventListener() gibi bir şey daha arıyorsunuz. Yine, bir çerçeve etkileşimlerinize biraz kolaylık sunacak ve bazı durumlarda tekerleği yeniden icat etme zahmetinden kurtulacaktır.

6

Bunu gördüm, çünkü aynı soruyu tam olarak merak ettim!

arguments.callee

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee

yüzden bu Titanyum Appcelerator çalışır

blah.addEventListener('click',function(e){ 
    e.source.removeEventListener('click', arguments.callee); 
    blee bloo bleep 
}); 

olurdu ... arkadaşın, bu nedenle javascript o gerektiği eser de (Çünkü aynı şeydir (Kinda)

NB () Bu örnekteki arguments.callee sonu, görmeyi istemediğiniz sürece ... bah dum tish!. Eğer arguments.callee kullanmak istemiyorsanız

Aslında, bu da (denenmemiş) işe yarayabilecek:

blah.addEventListener('click', anyThingYouWantHere : function(e){ 
    e.source.removeEventListener('click', anyThingYouWantHere); 
    blee bloo bleep 
}); 

Nerede "anythingYouWantHere" istediğiniz herhangi değişken adıdır ~ sen işlevi eklediğinizde etkin bir şekilde "adlandırma".

+0

Bu, ES5 katı modda kullanılamaz, değil mi? –

+0

Hah! Hiç bir şey bile bilmiyordum * böyle bir şey var. ANYhoo, etrafında bir poke vardı ve bu hala çevresinde olduğunu belirten bu http://stackoverflow.com/a/1335595/1061426 bulundu. Ayrıca, arguments.callee için başvurduğum bağlantı da, kullanımdan kaldırıldığından da bahsetmiyor. Bağlantı *, *() 'varyantının çalışmayacağını belirtiyor, ancak burada kullanmıyoruz ... stackoverflow nedeniyle – bharal

İlgili konular