2009-10-13 13 views

Odpowiedz

34

można rozpiąć zdarzenia click przed wiążą go ponownie, w ten sposób będziesz miał tylko jedno zdarzenie załączony do niego:

//assuming this is a jquery object. 
this.unbind("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

Jak jQuery 1.7, kliknij teraz używa .Na (http://api.jquery.com/click/) tak poprawny kod jest teraz

//assuming this is a jquery object. 
this.off("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

Pozwoli to rozwiązać wszystkie zdarzenia kliknięcia (w tym utworzonych za pomocą dowolnych wtyczek być może używasz). Aby się upewnić, że rozpakujesz tylko swoje przestrzenie nazw, użyj ich. (http://api.jquery.com/off/)

//assuming this is a jquery object. 
this.off("click.myApp"); 
this.on("click.myApp", function(){ 
    alert("clicked once"); 
}); 

Tutaj myApp to przestrzeń nazw.

+0

Perfect, robi dokładnie to, co chcę . Dzięki! – Roger

9

Chciałbym dodać Marius za answer--

w unikaniu zduplikowanych wiązań nie chcą przypadkowo rozwiązać coś, jeśli nie ma być więcej niż jedna funkcja związana ze zdarzeniem. Jest to szczególnie ważne, gdy pracujesz nad czymś z wieloma programistami. Aby temu zapobiec można używać przestrzeni nazw zdarzeń:

//assuming this is a jquery object. 
var alertEvent = 'click.alert' 
this.unbind(alertEvent).bind(alertEvent,function(){ 
    alert('clicked once'); 
}); 

Tutaj „alert” to nazwa przestrzeni nazw dla zdarzenia click i wyłącznie dla swoich funkcji, które były związane z tym nazw będzie nieograniczony.

15

z jQuery .on() można zrobić coś takiego:

//removes all binding to click for the namespace "myNamespace" 
$(document).off('click.myNamespace'); 

$(document).on('click.myNamespace', '.selector', function(event) {...}); 

//this will be also removed (same namespace) 
$(document).on('click.myNamespace', '.anotherSelector', function(event) {...}); 
+1

Dziękuję za tę odpowiedź, sieppl. Właśnie sprawdziłem dokumentację jQuery i stwierdza: 'Od jQuery 1.7, metoda .on() jest preferowaną metodą dołączania programów obsługi zdarzeń do dokumentu. W przypadku starszych wersji metoda .bind() służy do dołączania modułu obsługi zdarzeń bezpośrednio do elementów. Handlery są dołączane do aktualnie wybranych elementów w obiekcie jQuery, więc te elementy muszą istnieć w punkcie wywołania metody .bind(). Aby uzyskać bardziej elastyczne wiązanie zdarzeń, zobacz dyskusję na temat delegowania zdarzeń w .on() lub .delegate(). ' Mój wniosek: w większości przypadków jest lepszy niż .bind() –

+0

@esco_: Tak, przełączyłem na on () całkowicie. Nigdy nie użyłem bind(), ale przestałem używać live() i delegate(). – sieppl

0

zakładając, że elementy są dodawane do html i chcesz dodać wydarzenie tylko dla elementy dodane:

function addEvents2Elements()//prevent Duplicate 
{ 
    //this will add the event to all elements of class="ele2addevent" 
    $('.ele2addevent').not('.clickbind').on('click',function(){alert('once');}) 

    //this will add a class an then the class="ele2addevent clickbind" 
    $('.ele2addevent').not('.clickbind').addClass('.clickbind'); 
    //all elements of class="... clickbind" will not be catched anymore in the first line because of .not() every time you call this function 
} 
addEvents2Elements(); 

być shure, które dodajesz tylko z klasą = "ele2addevent", ponieważ po związaniu będzie to class = "ele2addevent clickbind" i nie catched ponownie ...

Powiązane problemy