L'événement click () appelle deux fois dans jquery


113

J'ai configuré un élément de lien et appelé son événement de clic dans jquery mais l'événement de clic appelle deux fois, veuillez voir ci-dessous le code de jquery.

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

S'il vous plaît donnez votre avis.

Merci.


2
Le problème vient probablement d'un autre endroit de votre script.
karim79

3
si vous ne trouvez pas où vous avez fait des choses pour appeler cela deux fois, faites un détachement ('clik') avant le clic (...).
regilero

regilero: exactement, toute la base de code est très grande. où dois-je mettre ce détachement?
domlao

2
vous pouvez détecter quelles fonctions sont liées à cet événement de clic: stackoverflow.com/questions/570960/…
Anh Pham

Réponses:


229

Assurez-vous et vérifiez que vous n'avez pas accidentellement inclus deux fois votre script dans votre page HTML.


1
C'était le problème pour mon cas. Que mon événement de clic devenait bouillonnant. Merci pour le pointeur. :) +1
Tahir Akram

22
J'ai juste regardé cette solution et j'ai ri en pensant "Je ne suis pas assez stupide pour faire ça" ... il s'avère que j'avais fait exactement cela. Merci beaucoup.
JazzyP

1
Merci! Cela s'est avéré être le problème pour moi aussi. Je l'avais dans un modèle de lame laravel et dans un modèle imbriqué qui appelait @parent sur le même nom de section. Oups. Merci encore!
Phillip Harrington

1
Merci pour cette astuce. J'ai lutté avec cela pendant plus de 20 heures, et cette astuce m'a conduit sur la bonne voie. J'utilisais les ScriptBundles MVC, mais je faisais également un lien vers les fichiers de script directement et cela dupliquait les événements
Manish

lol ... J'y suis allé ... Je mettais le blâme sur le tiers, mais c'est moi qui ai lié le fichier .js deux fois.
Julian

76

Faites un détachement avant le clic;

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

1
try $ ("# link_button"). unbind (); ou faites un test simple pour vérifier combien de fois ce code est lu, si plus d'une fois ...
TheSystem

3
il s'agit simplement de corriger l'erreur à la volée à chaque fois, ce n'est pas une vraie solution. cela fait l'affaire et m'a aidé, mais vous devriez trouver le vrai problème et faire une solution permanente.
Juan Ignacio

1
c'est vraiment utile dans mon cas, car j'ai besoin d'appeler plusieurs fois les méthodes avec mes événements après quelques appels ajax, il commence à être surcliqué (je ne sais pas si ce mot existe). Pour ma situation, cela signifie une solution.
Thiago C. S Ventura

Correction de mon problème avec un script qui n'était inclus qu'une seule fois. Je vous remercie!
K. Rhoda le

49

Cela signifie que votre code a inclus deux fois le script jquery. Mais essayez ceci:

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

//your code

});


18

Dans mon cas, j'ai utilisé le script ci-dessous pour résoudre le problème

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

off()dissocie tous les événements auxquels se lie #id. Si vous souhaitez dissocier uniquement l' clickévénement, utilisez off('click').


8

Appelez simplement .off () juste avant d'appeler .on ().

Cela supprimera tous les gestionnaires d'événements:

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

Pour supprimer uniquement les gestionnaires d'événements enregistrés par «clic»:

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

7

Une solution assez courante au problème des deux clics consiste à mettre

e.stopPropagation()

à la fin de votre fonction (en supposant que vous l'utilisiez function(e)). Cela empêche l'événement de bouillonner, ce qui pourrait conduire à une seconde exécution de la fonction.


6

J'ai eu le même problème, mais vous pouvez essayer de changer ce code

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

pour ça:

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

Pour moi, ce code a résolu le problème. Mais veillez à ne pas inclure accidentellement votre script deux fois dans votre page HTML. Je pense que si vous faites ces deux choses correctement, votre code fonctionnera correctement. Merci


3

essayez ceci

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

J'ai changé "live" en "on" et cela semble fonctionner pour moi. Ainsi, l'événement se déclenche uniquement lorsque le bouton est cliqué.
Vikneshwar

C'est parfait.
LargeTuna

3

C'est certainement un bogue spécialement lorsqu'il s'agit de FireFox. J'ai cherché beaucoup d'essais toutes les réponses ci-dessus et j'ai finalement obtenu un bug par de nombreux experts sur SO. Donc, j'ai finalement eu cette idée en déclarant une variable comme

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);

    }
});

De cette façon, il vérifie d'abord plutôt que la fonction a été précédemment appelée ou non.



3

C'est une question plus ancienne, mais si vous utilisez la délégation d'événements, c'est ce qui l'a causé pour moi.

Après la suppression, .delegate-twoil a cessé de s'exécuter deux fois. Je pense que cela se produit si les deux délégués sont présents sur la même page.

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

2

cet extrait de code ne contient rien de mauvais. C'est une autre partie de votre script comme l'a dit @karim


2

Dans mon cas, cela fonctionnait bien dans Chrome et IE appelait .click()deux fois. si c'était votre problème, je l'ai résolu en retournant false, après avoir appelé l' .click()événement

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

2

L'appel a unbindrésolu mon problème:

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

2

Je ne sais pas pourquoi mais j'ai eu ce problème avec

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

Quand je l'ai changé en

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

Le problème a été résolu. Mais certainement quelque chose ne va pas dans mon code.


cela a fonctionné pour moi dans laravel, je ne sais pas ce qui cause ce problème
khan Farman

1

J'ai été trompé par une sélection correspondant à plusieurs éléments, donc chacun a été cliqué. :firstaidé:

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

1

J'ai aussi eu ce problème sur FF. Mon tag était cependant lié à un <a>tag. Bien que la <a>balise n'aille nulle part, elle a quand même fait un double clic. J'ai remplacé le <a>tag par un <span>tag et le problème du double clic a disparu.

Une autre alternative consiste à supprimer complètement l'attribut href si le lien ne mène nulle part.


Cela ne répond pas vraiment à la question. Si vous avez une autre question, vous pouvez la poser en cliquant sur Poser une question . Vous pouvez également ajouter une prime pour attirer davantage l'attention sur cette question une fois que vous avez suffisamment de réputation .
Sean Patrick Floyd

@SeanPatrickFloyd: En fait, c'est une réponse. Même s'il est formulé pour soulever des drapeaux rouges.
Deduplicator

1

J'ai rencontré ce problème car mon $(elem).click(function(){});script a été placé en ligne dans un div défini sur style="display:none;".

Lorsque l'affichage css passait en mode blocage, le script ajoutait l'écouteur d'événement une seconde fois. J'ai déplacé le script vers un fichier .js séparé et l'écouteur d'événements en double n'était plus lancé.


1

Lorsque j'utilise cette méthode sur la page de chargement avec jquery, j'écris $('#obj').off('click');avant de définir la fonction de clic, de sorte que la bulle ne se produit pas. Travaille pour moi.


1

Ma réponse simple a été de transformer le lien de clic en fonction et d'appeler cela d'un seul clic de l'élément - a fonctionné un régal! alors qu'aucune de ces réponses


0

Si votre événement appelle deux ou trois fois, ou plus, cela peut vous aider.

Si vous utilisez quelque chose comme celui-ci pour déclencher des événements…

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

… Alors faites attention au nombre d' .js-someclasséléments que vous avez sur la page, car cela déclenchera l'événement de clic pour tous les éléments - et pas une seule fois!

Une solution simple consiste alors à vous assurer de déclencher le clic une seule fois, en sélectionnant uniquement le premier élément , par exemple:

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

0

Bien sûr, quelque part ailleurs dans votre (vos) script (s), l'événement "click" est à nouveau lié au même élément, comme le suggèrent plusieurs autres réponses / commentaires.

J'ai eu un problème similaire et pour vérifier cela, j'ai simplement ajouté une console.logcommande à mon script, comme dans l'extrait de code suivant:

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

Si, en cliquant sur le bouton, vous obtenez quelque chose de similaire à l'image ci-dessous à partir de la console de développement de votre navigateur (comme je l'ai fait), vous savez avec certitude que l' click()événement a été lié deux fois au même bouton.

la console du développeur

Si vous avez besoin d'un patch rapide, la solution proposée par d'autres commentateurs d'utiliser la offméthode (btw unbindest obsolète depuis jQuery 3.0) pour dissocier l'événement avant de le (re) lier fonctionne bien, et je le recommande aussi:

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

Malheureusement, ce n'est qu'un patch temporaire! Une fois que le problème de rendre votre patron heureux est résolu, vous devriez vraiment creuser un peu plus votre code et résoudre le problème de "liaison dupliquée".

La solution réelle dépend bien sûr de votre cas d'utilisation spécifique. Dans mon cas, par exemple, il y avait un problème de «contexte». Ma fonction était invoquée à la suite d'un appel Ajax appliqué à une partie spécifique du document: recharger l'ensemble du document rechargeait en fait à la fois les contextes «page» et «élément», ce qui entraînait la liaison deux fois de l'événement à l'élément .

Ma solution à ce problème consistait à tirer parti de la fonction jQuery one , qui est la même que sur, à l'exception du fait que l'événement est automatiquement dissocié après son premier appel. C'était idéal pour mon cas d'utilisation, mais encore une fois, ce n'est peut-être pas la solution pour d'autres cas d'utilisation.


-1

Avait le même problème. Cela a fonctionné pour moi -

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

J'espère que cela aide quelqu'un.


Jette une erreur pour moi ... De plus, c'est une solution sale - la fonction est exécutée plus d'une fois, la solution est de la placer ailleurs et d'utiliser console.log () pour surveiller les choses.
tylerl

-1

Dans mon cas, le HTML était présenté comme ceci:

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

Et mon jQuery était comme ceci:

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

Cela m'a dérouté parce que rien ne semblait se passer. Le problème était que les .shares internes toggle annuleraient les .shares externes toggle.


-1

J'ai résolu ce problème en modifiant le type d'élément. au lieu du bouton, je place une entrée, et ce problème ne se produit plus.

instesd de:

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

remplacer par:

<input onclick="doSomthing()" value="click me">
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.