2012-02-12 11 views
109

bir düğme var ve ben bunun için bazı eventlistners eklendi: Ben hepsini birden dinleyicileri kaldırabilir ya İstiyorum istersem neBir elemandaki tüm dinleyiciler nasıl kaldırılır?

document.getElementById("btn").removeEventListener("click",funcA); 

:

document.getElementById("btn").addEventListener("click", funcA, false); 
document.getElementById("btn").addEventListener("click", funcB, false); 
document.getElementById("btn").addEventListener("click", funcC, false); 
document.getElementById("btn").addEventListener("blur" , funcD, false); 
document.getElementById("btn").addEventListener("focus", funcE, false); 

<button id="btn">button</button> 

ben onları kaldırabilirsiniz İşlev referansı (funcA) yok mu? Bunu yapmanın bir yolu var mı yoksa bunları birer birer mi çıkarmalıyım?

+0

http://stackoverflow.com/questions/3222486/remove-all-javascript-event-listeners-of-an-element-and-its-children – Misiur

+28

Yetkilendirilmemiş kod çerçevelerini kullanarak DEĞİL kütüphaneler. :-) – John

+1

@user Etkileyici, buradaki soruların hala jQuery 1.7'den söz ettiği eski sorudan daha yaşlı bir soru bulmuşsunuzdur. Bu soruyu sorduğumdan beri ne kadar zaman geçtiğine inanamıyorum. –

cevap

107

Bunu yapmanın en hızlı yolu sadece tüm olay dinleyicileri kaldırır düğümü, klonlamak olduğunu düşünüyorum:,

var old_element = document.getElementById("btn"); 
var new_element = old_element.cloneNode(true); 
old_element.parentNode.replaceChild(new_element, old_element); 

Sadece dikkatli olun her alt öğeleri bu de temizlenir olay dinleyicileri olarak Söz konusu düğüm, bu nedenle korumak istiyorsanız, dinleyicileri her seferinde açık bir şekilde çıkarmak için başvurmanız gerekir. İşte

jQuery 1.7+

$("#myEl").off() 

jQuery < 1,7

$('#myEl').replaceWith($('#myEl').clone()); 

: Eğer jquery karşı değilsin Eğer

+0

Teşekkürler! Ve ben kodunuzu bu işlevi kullandım (uns) {ele.parentNode.replaceChild (ele.cloneNode (true), ele);} –

+18

@ Derek: Bir düğümü klonlamak ve tüm alt ağaç kötü bir fikirdir. Node.removeEventListener ile tüm EventListener'leri düğümden kaldırmaktan ** çok daha yavaştır. Ek olarak bir bellek sızıntısı (düğüm + alt ağaç) alırsınız ve tabiki tüm EventListener alt ağaçtan kaldırılır.Eğer fonksiyonunuzu 'document.body' üzerinde kullanırsanız, her şeyi havaya uçuracaksınız. – Saxoier

+1

@Saxoier, Hatırlatıcı için teşekkürler, ancak bu sayfanın 'body'ında test ettim ve bir çekicilik gibi çalıştı. Belki hızlı bir tarayıcı (Google Chrome) kullanıyorum. –

22

, bu bir çizgide yapılabilir bir örnek:

İşte

http://jsfiddle.net/LkfLezgd/3/

+0

çok uzun, bunun yerine jQuery'de, tüm dinleyicileri kaldırmak için bu $ ("# myEl") 'ı (unbind(); 'veya' .off() '(1.7+) yapmalısınız. –

+11

'off()' veya 'unbind()' işlevlerini yalnızca jQuery ile bağlanmış olan dinleyicileri kaldırır mısınız? – davide

+0

Sadece .off() üzerindeki dokümanları tekrar okuyun ve tüm olayları kaldırmak için tüm parametreleri çıkarmanıza izin vermez. Bununla birlikte, .unbind() ile, eventType zorunludur ve bu nedenle bu amaç için kullanılamaz. – Duke

5
da cloneNode dayanan bir fonksiyon, ama bir seçenek Üst düğüm klonlamak ve taşımak için bütün çocuklar (kendi olay dinleyicilerini korumak için):

function recreateNode(el, withChildren) { 
    if (withChildren) { 
    el.parentNode.replaceChild(el.cloneNode(true), el); 
    } 
    else { 
    var newEl = el.cloneNode(false); 
    while (el.hasChildNodes()) newEl.appendChild(el.firstChild); 
    el.parentNode.replaceChild(newEl, el); 
    } 
} 

Kaldır olay dinleyicileri bir öğeyi

recreateNode(document.getElementById("btn")); 

Kaldır olay dinleyicileri ve tüm alt öğelerinin:

bir elemana Eğer nesnenin kendisini tutmak ve bu nedenle cloneNode kullanamaz gerekiyorsa 210
recreateNode(document.getElementById("list"), true); 

, o zaman addEventListener fonksiyonunu sarın ve this answer olduğu gibi başınıza dinleyici Parça listesine sahiptir.

+1

@Max: Düzenleme önerilerinizi takdir ediyorum, ancak bu kodun ES2015'e yeniden yüklenmesinin bu durum için haklı olmadığını düşünüyorum, kod o zaman yaygın olarak desteklenmeyecektir. – user

+0

tüm çocukları silmek için sizi dinler: element.innerHTML + = ''; –