2011-01-06 22 views
6

Olası Çoğalt çıkarmadan:
Removing an anonymous event listenerJavaScript: isimsiz olay dinleyicisini

ben bir olay dinleyicisi eklemek için aşağıdaki çapraz tarayıcı fonksiyonu var: Ben

_SU3.addEventListener = function(elem, eventName, fn) { 
if(elem.addEventListener) { 
    elem.addEventListener(eventName, fn, false); 
    } else if (elem.attachEvent) { 
     elem.attachEvent('on'+eventName, fn); 
    } 
}; 

dinleyici bu şekilde eklenir:

Her şey yolunda. Ancak dinleyiciyi bir kez çağrıldıktan sonra kaldırmak istiyorum. I.e gibi bir şey:

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', ANON_FUNCTION); 

}; 

Ama tabiki dinleyici işlevi anonimdir, bu nedenle referans yapılacak bir işlev adı yoktur.

Dinleyiciyi nasıl kaldırabilirim?

Teşekkürler

+0

Referansı bir yerlerde tutmalısınız. Ya işlevinize bir başvuru geçirerek, ya da örtülü olarak işlevinizin içine girerek. –

cevap

8

İşlevin bir başvuru tutmak gerekir:

var foo = function(event) { _SU3.getChildren(_show, uri, element); }; 

_SU3.addEventListener(_show, "click", foo); 

...

_SU3.getChildren = function(_show, url, element) { 

... blah... 

_SU3.removeEventListener(_show, 'click', foo); 

}; 

değişken foo olay dinleyicisi kaldırmak nerede kapsamında olduğundan emin olun.

addOneShotListener = function(elem, eventName, fn) { 
    var triggered = false, handler = function(ev) { 
    if (triggered) return; 
    fn(ev); 
    triggered = true; 
    }; 

    if(elem.addEventListener) { 
    elem.addEventListener(eventName, handler, false); 
    } else if (elem.attachEvent) { 
    elem.attachEvent('on'+eventName, handler); 
    } 
}; 

orijinal fonksiyonu üzerine bu değişikliği sadece geçirilen orijinal işleyicisi ("fn" sarar: o denilen olmasına bakmaksızın takip etmek için

+0

Teşekkürler. Fakat bu dinleyici sayfadaki birçok öğeye ekleniyor, bu yüzden dinleyicinin diğer öğelere çağrılması durumunda bunun üzerine yazılacağı için global bir değişkene sahip olamıyorum. –

+0

@Richard: Küresel olması gerektiğini söylemedim, bunun kapsamda olması gerektiğini söyledim. – Matt

4

Yapamazsınız. Kaldırmak isterseniz, ona bir başvuru yapmanız gerekir. Onu başkalarından nasıl ayırt edebileceksiniz?

+1

Mümkünse, bir öğeye eklenen tüm tıklama dinleyicilerini temizlemek için mutluyum. –

+2

Hayır, böyle bir işlev yok. –

3

yerine düzenlemek, olay dinleyicisi çıkarmadan) yalnızca ilk kez çalıştırılanı çağırdığı bir işleve sahiptir. Bundan sonra, bir bayrak ayarlar ve orijinal işleyici işlevini bir daha asla çağırmaz.

+0

Bu ilginç bir öneri, teşekkürler –

0

Bir öğeye herhangi bir anda atanmış tek bir tıklama etkinliğiniz varsa, neden onclick özelliğini ayarlamıyorsunuz? Item.onclick = '' ile istediğiniz zaman kaldırabilirsiniz.

+0

Sayfa dinamik olarak oluşturulduğundan ve node.setAttribute ('onclick', 'function') yapmanın bazı tarayıcılarda çalışmadığını buldum. –

+0

Özellik değil, özellik belirtildi. – Neil

+0

object.onclick = işlev (e) {// etc}; –

İlgili konular