2011-07-29 40 views
6

To zdarzenie delegowane jest uruchamiane dwa razy (nie zawsze, czasami).Deleguj wydarzenie dwukrotnie, wydarzenie

client.bindButtonClickFunction = function(){ 

    $("#client-plugin").delegate(".client-button", "click", function() 
    { 
     var id = this.id.split('-')[2]; 
     client.retrieveMessageByID(id); 
    }); 
}; 

Wywołuję funkcję po włożeniu wszystkich przycisków ".client".

Jakieś myśli, jak to zatrzymać? Próbowałem event.stopPropagation(), a także cofałem i przekierowuję bezskutecznie.

To jest w Chrome, jako część wtyczki do Chrome.

+1

trudno powiedzieć bez dalszych informacji. Najprawdopodobniej dwa razy wywołasz 'bindButtonClickFunction' ... btw. nie trzeba czekać na wstawienie przycisku ".client", "delegate" działa podobnie jak "live". –

+3

Czy próbowałeś zatrzymać stopImmediatePropagation? http://api.jquery.com/event.stopImmediatePropagation/ – exoboy

+0

Właśnie naprawiłem dwukrotnie problem z wystrzeleniem, który miałem. Tak jak powiedział @FelixKling, miałem deklarację delegata() wewnątrz niektórych funkcji $ (document) .ready(), zasadniczo wywołując funkcję wiele razy. –

Odpowiedz

20

zależności od sposobu zarejestrowania delegata, może chcesz zrobić:

$("#client-plugin").undelegate('event').delegate('event', ...) 

Spróbuj też dodać return false z obsługi.

+1

Odpowiedziałbym tak samo. Sugeruję wykonanie tego, a następnie ponowne testowanie, aby sprawdzić, czy nadal jest wywoływane dwa razy - jeśli tak, to wiesz, że problem leży w tym, co wywołuje metodę uruchamianą dwukrotnie, a nie samą metodę. – jammypeach

+0

@mrchief: Mam ten sam problem, tj. Mam wyzwalacz funkcji, a klasa, która jest wyzwalana, jest zadeklarowana dwukrotnie w moim kodzie, więc kiedy kliknę tę klasę, uruchomiłam wyzwalacz dwukrotnie, a jeśli użyję zwrotu false, więc moje pole wyboru nie jest zaznaczone. Czy mógłbyś podać jakieś inne rozwiązanie? – Suleman

+0

@Suleman: "UnDelegate" powinno również działać w twoim przypadku. Druga instancja powinna wyrejestrować się, a następnie zarejestrować swojego handler'a raz. Jeśli masz więcej pytań, otwórz nowe pytanie i dodaj kod. – Mrchief

7

Musisz przestać natychmiastową propagację

$("#client-plugin").on(".client-button", "click", function (e) { 
    e.stopImmediatePropagation(); 
    var id = this.id.split('-')[2]; 
    client.retrieveMessageByID(id); 
}); 
+0

, takich jak http://stackoverflow.com/a/14813418/3786343 – Kamlesh