L'evento click () sta chiamando due volte in jquery


113

Ho impostato un elemento link e ho chiamato il suo evento click in jquery ma l'evento click sta chiamando due volte, vedi sotto il codice di jquery.

$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

Si prega di avvisare.

Grazie.


2
Il problema probabilmente è da qualche altra parte nel tuo script.
karim79

3
se non riesci a trovare dove hai creato le cose per chiamarlo due volte, fai un unbind ('clik') prima del clic (...).
regilero

regilero: esattamente, l'intera base del codice è molto grande. dove dovrei mettere quello sciogliere?
domlao

2
puoi rilevare quali funzioni sono vincolanti a quell'evento clic: stackoverflow.com/questions/570960/…
Anh Pham

Risposte:


229

Assicurati di non aver incluso accidentalmente due volte lo script nella tua pagina HTML.


1
Questo era il problema per il mio caso. Che il mio evento di clic si stava diffondendo. Grazie per il puntatore. :) +1
Tahir Akram

22
Ho solo guardato questa soluzione e ho riso pensando "Non sono abbastanza stupido da farlo" ... si scopre che avevo fatto esattamente questo. Molte grazie.
JazzyP

1
Grazie! Questo si è rivelato essere il problema anche per me. Aveva in un modello di lama laravel e in un modello annidato che chiamava @parent sullo stesso nome di sezione. Ops. Grazie ancora!
Phillip Harrington

1
Grazie per questo suggerimento. Ho lottato con questo per oltre 20 ore e questo suggerimento mi ha portato sulla strada giusta. Stavo usando MVC ScriptBundles ma collegavo anche direttamente ai file di script e questo ha duplicato gli eventi
Manish

lol ... ci sono stato ... stavo dando la colpa alla terza parte, ma sono stato io a collegare due volte il file .js.
Julian

76

Effettua lo sblocco prima del clic;

$("#link_button").unbind('click');
$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

1
prova $ ("# link_button"). unbind (); oppure fai un semplice test per controllare quante volte quel codice viene letto, se più di una volta ...
TheSystem

3
questo è solo correggere l'errore al volo ogni volta, non una vera soluzione. fa il trucco e mi ha aiutato, ma dovresti trovare il vero problema e fare una soluzione permanente.
Juan Ignacio

1
è davvero utile nel mio caso, perché ho bisogno di chiamare più volte i metodi con i miei eventi dopo che alcune chiamate ajax iniziano a diventare overclicked (non so se questa parola esiste). Per la mia situazione significa una soluzione.
Thiago C. S Ventura

Risolto il problema con uno script incluso solo una volta. Grazie!
K. Rhoda

49

Significa che il tuo codice ha incluso lo script jquery due volte. Ma prova questo:

$("#btn").unbind("click").click(function(){

//your code

});


18

Nel mio caso ho utilizzato lo script seguente per risolvere il problema

$('#id').off().on('click',function(){
    //...
});

off()scioglie tutti gli eventi legati a #id. Se vuoi svincolare solo l' clickevento, usa off('click').


8

Chiama semplicemente .off () subito prima di chiamare .on ().

Questo rimuoverà tutti i gestori di eventi:

$(element).off().on('click', function() {
// function body
});

Per rimuovere solo i gestori di eventi "clic" registrati:

$(element).off('click').on('click', function() {
// function body
});

7

Una soluzione piuttosto comune al problema dei due clic è mettere

e.stopPropagation()

alla fine della tua funzione (supponendo che tu lo usi function(e)). In questo modo si evita che l'evento ribolle che potrebbe portare a una seconda esecuzione della funzione.


6

Ho avuto lo stesso problema, ma puoi provare a cambiare questo codice

$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

a questa:

$("#link_button").button();
$("#link_button").unbind("click").click(function () {
   $("#attachmentForm").slideToggle("fast");
});

Per me, questo codice ha risolto il problema. Ma fai attenzione a non includere accidentalmente il tuo script due volte nella tua pagina HTML. Penso che se stai facendo queste due cose correttamente, il tuo codice funzionerà correttamente. Grazie


3

per favore prova questo

$('#ddlSupervisor').live('change', function (e) {
    if (e.handled !== true) { //this makes event to fire only once
    getEmployeesbySupervisor();
    e.handled = true;
   }
});

Ho cambiato "live" in "on" e sembra funzionare per me. Quindi l'evento si attiva solo per il tempo quando si fa clic sul pulsante.
Vikneshwar

Questo è perfetto.
LargeTuna

3

Questo è sicuramente un bug specialmente mentre è FireFox. Ho cercato un sacco di provare tutte le risposte di cui sopra e alla fine l'ho ottenuto come bug da molti esperti su SO. Quindi, finalmente ho avuto questa idea dichiarando la variabile come

var called = false;
$("#ColorPalete li").click(function() {
    if(!called)
    {
             called = true;
             setTimeout(function(){ //<-----This can be an ajax request but keep in mind to set called=false when you get response or when the function has successfully executed.
                 alert('I am called');
                 called = false;
             },3000);

    }
});

In questo modo verifica prima piuttosto che la funzione è stata chiamata in precedenza o meno.


3

L'aggiunta e.preventDefault();all'inizio della mia funzione ha funzionato per me.


3

Questa è una domanda più vecchia, ma se stai usando la delega degli eventi questo è ciò che ha causato per me.

Dopo .delegate-twoaverlo rimosso ha interrotto l'esecuzione due volte. Credo che ciò accada se entrambi i delegati sono presenti sulla stessa pagina.

$('.delegate-one, .delegate-two').on('click', '.button', function() {
    /* CODE */
});

2

questo frammento di codice non contiene niente di male. È un'altra parte della tua sceneggiatura, come ha detto @karim


2

Nel mio caso, funzionava bene in Chrome e IE chiamava .click()due volte. se questo era il tuo problema, l'ho risolto restituendo false, dopo aver chiamato l' .click()evento

   $("#txtChat").keypress(function(event) {
        if (event.which == 13) {
            $('#btnChat').click();
            $('#txtChat').val('');
            return false;
        }
    });

2

La chiamata ha unbindrisolto il mio problema:

$("#btn").unbind("click").click(function() {
    // your code
});

2

Non sono sicuro del perché, ma ho avuto questo problema con

$(document).on("click", ".my-element", function (e) { });

Quando l'ho cambiato in

$(".my-element").click(function () { });

Il problema è stato risolto. Ma sicuramente qualcosa non va nel mio codice.


questo ha funzionato per me in laravel, non so quale sia la causa di questo problema
khan Farman

1

Sono stato ingannato da una selezione che corrisponde a più elementi, quindi ognuno è stato cliccato. :firstaiutato:

$('.someClass[data-foo="'+notAlwaysUniqueID+'"]:first').click();

1

Anch'io ho avuto questo problema su FF. Il mio tag era tuttavia associato a un <a>tag. Sebbene il <a>tag non andasse da nessuna parte, faceva comunque il doppio clic. Ho sostituito il <a>tag con un <span>tag e il problema del doppio clic è scomparso.

Un'altra alternativa è rimuovere completamente l'attributo href se il collegamento non va da nessuna parte.


Questo non risponde davvero alla domanda. Se hai una domanda diversa, puoi farla facendo clic su Fai domanda . Puoi anche aggiungere una taglia per attirare più attenzione su questa domanda una volta che hai abbastanza reputazione .
Sean Patrick Floyd

@ SeanPatrickFloyd: In realtà, è una risposta. Anche se formulato per alzare bandiere rosse.
Deduplicator

1

Ho riscontrato questo problema perché il mio $(elem).click(function(){});script è stato inserito in linea in un div impostato su style="display:none;".

Quando la visualizzazione CSS è stata impostata su blocco, lo script aggiungeva il listener di eventi una seconda volta. Ho spostato lo script in un file .js separato e il listener di eventi duplicato non è stato più avviato.


1

Quando utilizzo questo metodo per caricare la pagina con jquery, scrivo $('#obj').off('click');prima di impostare la funzione di clic, quindi la bolla non si verifica. Per me va bene.


1

La mia semplice risposta è stata trasformare il collegamento a clic in una funzione e chiamarlo dal clic dell'elemento: ha funzionato a meraviglia! mentre nessuno dei precedenti lo ha fatto


0

Se il tuo evento chiama due o tre volte o più, questo potrebbe essere d'aiuto.

Se stai usando qualcosa di simile per attivare eventi ...

$('.js-someclass').click();

... quindi .js-someclassfai attenzione al numero di elementi che hai sulla pagina, perché attiverà l'evento clic per tutti gli elementi - e non solo una volta!

Una semplice soluzione è quindi assicurarsi di attivare il clic una sola volta, selezionando solo il primo elemento , ad esempio:

$('.js-someclass:first').click();

0

Sicuramente da qualche altra parte nei tuoi script l'evento "click" viene nuovamente associato allo stesso elemento, come suggeriscono molte altre risposte / commenti.

Ho avuto un problema simile e per verificarlo, ho semplicemente aggiunto un console.logcomando al mio script, come nel seguente frammento:

$("#link_button")
    .button()
    .click(function () {
        console.log("DEBUG: sliding toggle...");
        $("#attachmentForm").slideToggle("fast");
    });

Se, facendo clic sul pulsante, ottieni qualcosa di simile all'immagine sottostante dalla console per sviluppatori del tuo browser (come ho fatto io), allora sai per certo che l' click()evento è stato associato due volte allo stesso pulsante.

la console dello sviluppatore

Se hai bisogno di una patch veloce, la soluzione proposta da altri commentatori di utilizzare il offmetodo (btw unbindè deprecato da jQuery 3.0) per svincolare l'evento prima di (ri) associare funziona bene, e lo consiglio anche io:

$("#link_button")
    .button()
    .off("click")
    .click(function () {
        $("#attachmentForm").slideToggle("fast");
    });

Sfortunatamente, questa è solo una patch temporanea! Una volta risolto il problema di rendere felice il tuo capo, dovresti davvero scavare un po 'di più nel tuo codice e risolvere il problema del "binding duplicato".

La soluzione effettiva dipende ovviamente dal tuo caso d'uso specifico. Nel mio caso, ad esempio, c'era un problema di "contesto". La mia funzione veniva invocata come risultato di una chiamata Ajax applicata a una parte specifica del documento: ricaricare l'intero documento in realtà stava ricaricando entrambi i contesti "pagina" e "elemento", risultando associato all'elemento due volte .

La mia soluzione a questo problema è stata quella di sfruttare la funzione jQuery one , che è la stessa di on con l'eccezione che l'evento viene automaticamente scollegato dopo la sua prima chiamata. Era l'ideale per il mio caso d'uso ma, ancora una volta, potrebbe non essere la soluzione per altri casi d'uso.


-1

Ho avuto lo stesso problema. Questo ha funzionato per me -

$('selector').once().click(function() {});

Spero che questo aiuti qualcuno.


Genera un errore per me ... Inoltre è una soluzione sporca: la funzione viene eseguita più di una volta, la soluzione è posizionarla da qualche altra parte e utilizzare console.log () per monitorare le cose.
tylerl

-1

Nel mio caso, l'HTML era strutturato in questo modo:

<div class="share">
  <div class="wrapper">
    <div class="share">
    </div>
  </div>
</div>

E il mio jQuery era così:

jQuery('.share').toggle();

Mi ha confuso perché sembrava che non stesse accadendo nulla. Il problema è che gli interni .shares toggle avrebbero annullare gli esterni .shares toggle.


-1

Ho risolto questo problema cambiando il tipo di elemento. invece del pulsante inserisco l'input e questo problema non si verifica più.

invece di:

<button onclick="doSomthing()">click me</button>

sostituirlo con:

<input onclick="doSomthing()" value="click me">
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.