2010-07-11 26 views
20

Bir öğenin tüm olay dinleyicilerini ve çocuklarını silmek mümkün mü? Bir şey gibi: Ben olaylar karmaşık bir eleman olduğu içinBir öğenin ve onun çocukların tüm JavaScript olay dinleyicilerini kaldırın.

myElem.removeEventListeners(); 

Bunu ihtiyacım var ve bunun bir kopyasını oluşturmak gerekir - Herhangi olaylara tepki vermez statik bir resim gibi.

+1

Olaylar ilk sırada nasıl bağlanır (ör. 'Onclick = ...', 'addEventListener', kitaplık, vb.)? –

+0

addEventListener() kullanılır. Kullanıcı tarafından tetiklenen koşullu mantığa bağlı olarak myElem için ve bazı keyfi çocuklar için kullanılır. – Tower

+5

Onu almamaya çalıştığınız IE (o zaman 'attachEvent' kullanır)? Bu durumda, "cloneNode (true)" ile öğenizi "kopyalayın" ve magic-boom-presto, addEventListener olayları kopyalanmayacak. Bu özellikte: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener –

cevap

22

cloneNode kullanırsanız, olay dinleyicileri kopyalanmayacaktır.

Eğer sağlam bir çözüm istiyorsanız, en iyi ihtimalle muhtemelen attach/detach dinleyicilere bir sarıcı yazmanız ve bunları kendiniz izlemeniz gerekir. Dean Edwards' addEvent gibi bir şey.

+0

İpuçları için teşekkürler.W3C olay dinleyicileri kullanıyorum, bu yüzden muhtemelen bir sarıcı yazmak zorundayım, ki bunu önlemek istiyorum ... – Tower

+0

ama "cloneNode" işlevini kullanırsanız, dinleyicileriniz kopyalanmayacaktır. Güncellememe bakın, – galambalazs

+0

hala tüm olay işleyicisini kaldırmanın basit bir yolu varsa, bu harika olurdu –

-7

Ben bir tane bilmiyorum ve Google'da yapılan bir arama herhangi bir belirgin sonuç vermedi. aşağıdaki gibi bir kolay, kludgy çözüm

function removeEvents(obj) 
{ 
    obj.onblur = null; 
    obj.onchange = null; 
    obj.onclick = null; 
    // ... 
} 

Çağrısı gibi, bu işlev her olayın üzerinden bir işlevi döngüleri oluşturmaktır ve null bunu ayarlar: removeEvents(myElem). JavaScript olay işleyicilerinin tam bir listesi http://www.elated.com/articles/events-and-event-handlers/ adresinde bulunabilir.

Şüphesiz, bu işlevi yazmanın daha zarif bir yolu var, ancak bu sorunu çözmenin daha zarif bir yolu olup olmadığını bilmiyorum. Birisi bilseydi hoş olurdu. JQuery gibi bir JavaScript kitaplığı aracılığıyla olayları bağlıyorsanız, başka, daha iyi seçenekler olabilir.

+3

Boş bir işleve ('function() {}') bunun yerine hala çağrılırsa. –

+1

Tarayıcıya bağlı olarak, olay işleyicisi olmayan öğeler tanımlanmamış veya boş olarak ayarlanmış olmalıdır. Null olarak ayarlamanın herhangi bir problemi ortaya çıkardığını düşünmüyorum, ama eğer öneride bulunmanız gerekiyorsa. – TNi

+1

Neden bu, cehenneme indirildi? Eski bir kodda sıkışmış ve bir etkinlik kütüphanesinde civatalamazsa, bu kötü bir fikir mi? –

İlgili konular