2010-04-07 15 views
13

Ho un tag di ancoraggio <a class="next">next</a> trasformato in un "pulsante". A volte, questo tag deve essere nascosto se non c'è nulla di nuovo da mostrare. Funziona tutto bene se semplicemente nascondo il pulsante con .hide() e lo ri-lo mostro con .show(). Ma volevo usare .fadeIn() e .fadeOut() invece.Come faccio a "rebind" l'evento click dopo unbind ('clic')?

Il problema che sto avendo è che se l'utente fa clic sul pulsante durante l'animazione fadeOut, può causare problemi con la logica che ho in esecuzione lo spettacolo. La soluzione che ho trovato è stata quella di separare l'evento click dal pulsante dopo l'inizio della funzione di clic originale, quindi ricollegarlo dopo che l'animazione è stata completata.

$('a.next').click(function() { 
    $(this).unbind('click'); 
    ... 
    // calls some functions, one of which fades out the a.next if needed 
    ... 
    $(this).bind('click'); 
} 

l'ultima parte dell'esempio precedente non funziona. L'evento click non viene effettivamente re-legato all'ancora. qualcuno sa il modo corretto per realizzare questo?

Sono un jquery autodidatta, quindi alcune delle cose di livello più elevato come unbind() e bind() sono sopra la mia testa, e la documentazione di jquery non è abbastanza semplice da capire per me.

risposta

15

vorrei solo aggiungere un controllo per vedere se è l'animazione prima:

$('a.next').click(function() { 
    if (!$(this).is(":animated")) { 
     // do stuff 
    } 
}); 
+0

Grazie nickf, Che ha funzionato perfettamente. Ma sono ancora curioso di sapere come "rebind" l'evento click se qualcuno lo sa. – Ben

6

Quando si associare nuovamente l'evento click, si sta iniziando tutto. È necessario fornire la funzione che si intende gestire gli eventi. jQuery non li ricorda per te dopo aver chiamato "unbind".

In questo caso particolare, è un po 'più complicato. Il problema è che quando avvii quelle animazioni stai mettendo in moto una serie di azioni guidate da un timer. Pertanto, l'assegnazione e il rebinding del gestore "click" all'interno dello stesso gestore di clic non aiuta in alcun modo. Che cosa sarebbe aiuto (supponendo che non si vuole risolvere il problema con il trucco is(":animated")) sarebbe quello di separare il gestore e quindi ricollegare il callback "fine" dalla tua animazione.

Quando si imposta il "click" del gestore, in primo luogo, è possibile separare la dichiarazione della funzione dalla chiamata al "click()":

var handler = function() { 
    $(this).whatever(); 
}; 
$('a.next').click(handler); 

Poi, si dovrebbe finire per volere per separare/riassociare, puoi ripetere quella chiamata per "fare clic" e fare riferimento alla funzione "gestore" allo stesso modo.

+0

Capisco cosa stai dicendo, ma non so come tradurlo in codice. La funzione che voglio che accada è esattamente ciò che era un clic(). Come lo codifico? – Ben

+0

Beh, in che modo "click" viene vincolato in primo luogo (prima di chiamare "unbind")? Oh aspetta vedo - che * è * il gestore di clic. OK aspetta e modificherai la mia risposta. – Pointy

+0

Penso di avere quello che stai dicendo.Nel tuo esempio sopra "handler" è una funzione, e io però che quando chiami una funzione hai bisogno delle parentesi di apertura e chiusura(). – Ben

2

Una soluzione più semplice e breve

(senza l'utilizzo/metodo unbind bind)

è quello di aggiungere una classe per l'oggetto se si vuole separare poi rimuovere questa classe per associare nuovamente ex;

$('#button').click(function(){ 
    if($(this).hasClass('unbinded')) return; 
    //Do somthing 
}); 

$('#toggle').click(function(){ 
    $('#button').toggleClass('unbinded'); 
}); 
Problemi correlati