2012-07-23 11 views
20

Mam stronę, do której chciałbym powiązać zdarzenia przeciągania/upuszczania. Chciałbym, aby cała strona w przeglądarce była celem upuszczania, więc ograniczyłem moje zdarzenia do obiektu document. Zawartość mojej aplikacji jest jednak ładowana do głównego obszaru zawartości za pośrednictwem AJAX i chciałbym, aby te programy do obsługi zdarzeń były aktywne, gdy strona przesyłania jest obecnie widoczna.Jak powiązać obsługę zdarzeń tylko wtedy, gdy jeszcze nie istnieje?

W tej chwili wiążę procedury obsługi zdarzeń po pobraniu strony pobierania; jednak za każdym razem, gdy strona przesyłania staje się aktywna, wiąże nową funkcję obsługi zdarzeń, co powoduje wielokrotne uruchamianie programu obsługi, gdy użytkownik przechodzi do strony przesyłania, opuszcza, a następnie wraca. Pomyślałem, że mógłbym rozwiązać ten problem, gdybym mógł sprawić, żeby przewodnik był związany tylko wtedy, gdy nie jest jeszcze związany. Czy to możliwe, czy też przeoczyłem lepszą alternatywę?

odpowiedniego kodu, jeśli pomaga: ty

$(document).bind('dragenter', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
}).bind('dragover', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
}).bind('drop', function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
    self._handleFileSelections(e.originalEvent.dataTransfer.files); 
}); 
+0

możliwe duplikat [jQuery sprawdzić, czy zdarzenie istnieje na elemencie] (http://stackoverflow.com/questions/1515069/jquery-check-if-event-exists-on- element) – dgw

Odpowiedz

27

Unbind istniejące przed obsługi zdarzeń wiążą nowe. To jest naprawdę proste z namespaced events [docs]:

$(document) 
    .off('.upload') // remove all events in namespace upload 
    .on({ 
     'dragenter.upload': function(e) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     }, 
     'dragover.upload': function(e) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     }, 
     // ... 
    }); 
+2

Musiałem użyć 'bind()' i 'unbind()' zamiast 'on()' i 'off()', ale ta metoda działała dobrze. Dzięki! – FtDRbwLXw6

+0

Tak, jeśli utknąłeś ze starszą wersją jQuery (przekazanie obiektu do 'bind' również powinno działać). W jQuery 1.2 wprowadzono zdarzenia typu Namespaced, które zdecydowanie powinny zadziałać :) Dobre kodowanie! –

Powiązane problemy