2012-07-23 8 views
20

Ho una pagina che mi piacerebbe associare gli eventi di trascinamento/rilascio a. Mi piacerebbe che l'intera pagina del browser fosse l'obiettivo di rilascio, quindi ho associato i miei eventi all'oggetto document. I contenuti della mia applicazione vengono caricati nell'area di contenuto principale tramite AJAX, tuttavia, e mi piacerebbe che questi gestori di eventi fossero attivi solo quando la pagina di caricamento è attualmente visibile.Come si può associare un gestore di eventi solo se non esiste già?

Al momento, collego i gestori di eventi quando viene recuperata la pagina di caricamento; tuttavia, ogni volta che la pagina di caricamento diventa attiva, associa un nuovo gestore di eventi, il che fa sì che il gestore si attivi più volte quando l'utente accede alla pagina di caricamento, esce e quindi torna indietro. Stavo pensando che potrei risolvere questo se potessi fare legare il conduttore solo quando non è già legato. È possibile o sto trascurando un'alternativa migliore?

relativo codice, se aiuta:

$(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

possibile duplicato del [jQuery verifica se l'evento esiste elemento] (http://stackoverflow.com/questions/1515069/jquery-check-if-event-exists-on- element) – dgw

risposta

27

UNBIND gestori di eventi esistenti prima di associare i nuovi. Questo è veramente semplice, con 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

Ho dovuto usare 'bind()' e 'unbind()' invece di 'on()' e 'off()', ma questo metodo ha funzionato bene. Grazie! – FtDRbwLXw6

+0

Sì, se sei bloccato con una versione precedente di jQuery (passare un oggetto a 'bind' dovrebbe funzionare anche se). Gli eventi con nomi introdotti sono stati introdotti in jQuery 1.2, quindi dovrebbe funzionare sicuramente :) Buona programmazione! –