2010-01-24 13 views
30

Ho input HTML e elementi di pulsante. Uso i pulsanti per inviare moduli, aprire finestre secondarie, ecc. Il problema è che un singolo clic si trasforma in 2 (e talvolta in molti altri) moduli di invio o apertura di altre finestre del browser. Ho riprodotto il problema in più browser web. Ho provato a cambiare le versioni di jQuery e questo non ha cambiato nulla. Che cosa potrebbe causare questo genere di cose?jQuery: clic singolo, clic su evento sparato due o più volte

+1

Probabilmente stai sbagliando. Per favore pubblica un codice o una versione su http://www.jsbin.com in modo che possiamo aiutarti. – Kobi

+1

Sì, devi assolutamente pubblicare il tuo codice altrimenti non potremo aiutarti. –

+0

Sto riscontrando lo stesso problema, nessuna delle soluzioni ha funzionato perché nel mio caso è stata richiamata 1 finestra pop con la funzione confirm ("..") e premendo il tasto invio si avrebbe "OK" e 1 azione sul elemento selezionato in background. Qualsiasi aiuto? –

risposta

80

Il tuo problema può accadere perché si sta assegnando lo stesso gestore per il clic evento più volte. Ti suggerisco di controllare che la linea in cui assegni il gestore non venga chiamata più volte inavvertitamente. Un'altra soluzione potrebbe essere una chiamata a non associare prima in questo modo:

$("#myButton").unbind("click").click(myHandler); 

Ma senza vedere un po 'di codice che sto solo indovinare.

+0

quasi 6 anni dopo, funziona ancora perfettamente. Grazie! – Haring10

+0

Ottima risposta semplice! – Kelvin

+0

Perché usare unbind? Chiama semplicemente .off(): 'jQuery.fn.unbind.toSource()' restituisce '" (funzione (a, b) {return this.off (a, null, b)}) "' – NoBugs

12

Dato che non è stato fornito un sacco di informazioni, il meglio che posso consigliare sta guardando uno()

http://api.jquery.com/one/

8

jQuery Sparkle fornisce una soluzione elegante per questo, chiamando la funzione "una volta" è possibile associare un gestore a un evento una sola volta.

Si tratta di un importante miglioramento su suggerimento di Darko Z come utilizzare:

$("#myButton").unbind("click").click(myHandler); 

Sarebbe sciogliere qualsiasi altro "click" gestori associati alla manifestazione "click" ogni volta che viene chiamato. Quindi assicurati di essere legato solo una volta, tuttavia non ti accontenterai di tutto per errore! Ops!

Il suggerimento di jarrett separa il gestore "clic" subito dopo il suo richiamo, quindi se si desidera richiamare nuovamente il gestore (dopo il fuoco iniziale) bisognerà ricollegare il gestore.

L'uso di jQuery Sparkle consente al gestore di sparare tutte le volte che è necessario, ma di essere associato solo una volta anziché più volte. Si può usare in questo modo:

$('#myButton').once('click', function(){ 
    // my handler 
}); 

Oppure, se si desidera supportare i dati nel vostro callback proprio come jQuery incorporato nel "legare", allora è possibile utilizzare:

$('#myButton').once('click', data, function(){ 
    // my handler 
}); 

È possibile trovare la codice sorgente per la definizione della funzione una volta here.

È open source con licenza AGPL, quindi puoi sentirti libero di afferrare ciò che ti serve senza preoccuparti! :-) Inoltre è attivamente sviluppato su base giornaliera per non essere mai a corto di supporto.

Ma la cosa più importante è un DRY Plugin/Effect Framework che consente di sviluppare plugin ed estensioni molto più facilmente. Quindi spero che questo aiuti a raggiungere questo obiettivo!

+1

So che questo è vecchio, ma questa risposta mi spinge a correggere la soluzione .. nella versione jQuery di oggi ho usato. una funzione di binding e il mio problema è risolto –

6

per me è stato causato da

$(function() { 
    $('.some-element').click(function() { 
     //event that fires twice 
    }); 

    //some exception-throwing code here 
}); 

jQuery stava chiamando la funzione pronta anonima due volte (?!) per l'eccezione in modo che la funzione di scatto sarebbe stato legato due volte.

4

È possibile utilizzare $("div").one("click", function() { ... });

Fissare un gestore ad un evento per gli elementi. Il gestore viene eseguito al massimo una volta per elemento.

jquery.com

1

Calling qualcosa di simile prima ha funzionato per me da quando avevo originariamente utilizzato $ ('# myButton'). On ('click' ... per assegnare i miei ascoltatori.

$('#myButton').off(); 

Documentation for "off();"

3

Questo funziona bene. il lavoro per me.

$(".class-name").unbind().click(function() { 
    //Do the Stuff 
}); 
1

Ho avuto un problema con le finestre di dialogo modali. L'evento è stato attivato una volta ogni volta che ho aperto una finestra di dialogo nella sessione. Nessun problema nella prima finestra, sparato due volte nella seconda finestra, sparato tre volte nella terza finestra, ecc.

Ho trovato che la funzione di inizializzazione per la finestra di dialogo veniva chiamata ogni volta che aprivo una nuova finestra di dialogo nel stessa sessione. Ho aggiunto una variabile globale notInit = -1 e assegnato il valore a 1 durante l'esecuzione di init. Ho controllato il valore di notInit prima di eseguire la funzione init e ho proceduto con init solo se il valore era -1.

+0

questo suona come qualcosa che vorrei piace implementare, ma non sono sicuro della sintassi dei passaggi. Se non si scrive troppo, forniresti uno snippet di codice nella tua risposta? – Chris22

Problemi correlati