2009-06-09 14 views
12
$('.ajax').click 
(  
    function() 
    { 
     // If been bound then we need to return here. 
     alert(':D'); 
    } 
) 

$('.ajax').click 
(
    function() 
    { 
     // If been bound then we need to return here. 
     alert(':D'); 
    } 
) 

W tym przypadku nazwałem duplikat kodu. Jak wykryć, czy zdarzenie zostało powiązane, aby zapobiec wyzwalaniu dwóch pól alertów?Sposób zapobiegania wielokrotnemu wiązaniu zdarzeń

Odpowiedz

22

Jest naprawdę dobry sposób na zrobienie tego w jQuery.

Oto przykład.

function alertEvent() { 
    alert(":D"); 
} 
$(".ajax").bind("click", alertEvent); 
//When you want to ensure it won't happen twice... 
$(".ajax").unbind("click", alertEvent); 
$(".ajax").bind("click", alertEvent); 

Ta metoda usunie tylko określone zdarzenie, co czyni go idealnym do tego, co chcesz zrobić.

+0

W jaki sposób można przekazać argumenty za pomocą kliknięcia? Czy mogę przejść do $ (". Ajax"). Bind ("kliknij", alertEvent (e)); ? –

+0

zdefiniować funkcję jako "function alertEvent (e)", aby uzyskać argument zdarzenia. – mcrumley

6

spróbować niewiążące go przed oprawa:

$(".ajax").unbind("click").click( 
     function() { 
    alert("Hello"); 
    }); 

czytać this na trochę więcej informacji.

+0

To będzie rozwiązać wszystkie zdarzenia kliknięcia, a nie tylko określone zdarzenia. Dodałem przykład, który rozwiąże tylko wydarzenie, którego nie chcesz duplikować, co oznacza, że ​​inne zdarzenia będą nadal uruchamiane. – Fenton

15

W przypadku używania jQuery> = 1.7 można użyć interfejsu API .on()/.off() w połączeniu z przestrzenią nazw zdarzeń. W tym przykładzie .off() nazywa się natychmiast, aby zapewnić wcześniejsze zdarzenia (jakiegokolwiek rodzaju) z nazw są związane un-:

$("form") 
    .off(".validator") 
    .on("keypress.validator", "input[type='text']", validate); 

Jest to dość elastyczne API, dzięki czemu można być bardzo specyficzne, jeśli trzeba być:

$("form") 
    .off("keypress.validator", "input[type='text']", validate) 
    .on("keypress.validator", "input[type='text']", validate); 

Docs: http://api.jquery.com/off/

0
function demo() 
{ 
// your code here which will called on click event 
} 

$(document).ready(function(){ 
$('.add').bind('click',demo); 

}); 

//After successfully ajax call response 
//Unbind the click event first 
$('.add').unbind('click',demo); 
//Then again bind the event 
$('.add').bind('click',demo); 
0

Najprostszym rozwiązaniem stąd bind event only once

Skopiowane przykładowy kod:

function someMethod() 
{ 
    $(obj).off('click').on('click', function(e) { 
     // put your logic in here 
    }); 
} 
Powiązane problemy