jQuery: Klicken Sie auf eine einzelne Schaltfläche, klicken Sie auf das Ereignis, das zwei- oder mehrmals ausgelöst wird

Lesezeit: 4 Minuten

Ich habe HTML-Eingabe- und Schaltflächenelemente. Ich verwende die Schaltflächen, um Formulare zu senden, sekundäre Fenster zu öffnen usw. Das Problem ist, dass ein einzelner Klick zu 2 (und manchmal viel mehr) Formularübermittlungen führt oder zwei zusätzliche Browserfenster öffnet. Ich habe das Problem in mehreren Webbrowsern reproduziert. Ich habe versucht, die jQuery-Versionen zu wechseln, und das hat nichts geändert. Was könnte dazu führen, dass so etwas passiert?

  • Du machst es wahrscheinlich falsch. Bitte posten Sie einen Code oder eine Version auf jsbin.com damit wir Ihnen helfen können.

    – Köbi

    24. Januar 2010 um 18:26 Uhr


  • Ja, Sie müssen auf jeden Fall Ihren Code posten, sonst haben wir keine Chance zu helfen.

    – Markus Glocke

    24. Januar 2010 um 18:37 Uhr

  • Ich habe das gleiche Problem, keine der Lösungen hat funktioniert, da in meinem Fall 1 Pop-Fenster per Bestätigungsfunktion (“..”) aufgerufen wird und das Drücken der Eingabetaste zu diesem Zeitpunkt “OK” und 1 Aktion für die Auswahl bewirken würde Artikel im Hintergrund. Irgendeine Hilfe?

    – arvind.mohan

    21. Januar 2013 um 19:03 Uhr

  • Mögliches Duplikat von jQuery-Klickereignissen, die mehrmals ausgelöst werden

    – Ketzeraffe

    1. März 2017 um 15:48 Uhr

Benutzer-Avatar
Darko Z

Ihr Problem tritt möglicherweise auf, weil Sie dem Klickereignis mehrmals denselben Handler zuweisen. Ich schlage vor, dass Sie überprüfen, ob die Leitung, in der Sie den Handler zuweisen, nicht versehentlich mehrmals aufgerufen wird. Eine andere Lösung könnte ein Anruf bei sein unbind (veraltet 3.0) oder off (ersetzt) ​​zuerst:

$("#myButton").unbind("click").click(myHandler); // deprecated
$("#myButton").off("click").click(myHandler); // superseeded

Aber ohne einen Code zu sehen, vermute ich nur.

  • Tolle einfache Antwort!

    – CY_

    21. Mai 2016 um 12:33 Uhr

  • Warum Unbind verwenden? Es ruft nur .off() auf: jQuery.fn.unbind.toSource() gibt "(function (a,b){return this.off(a,null,b)})"

    – NoBugs

    5. Oktober 2016 um 5:18 Uhr


  • @NoBugs, weil die Antwort vor fast 7 Jahren geschrieben wurde 🙂

    – Darko Z

    6. Oktober 2016 um 5:40 Uhr

Da Sie nicht viele Informationen geliefert haben, kann ich Ihnen am besten empfehlen, sich eine anzuschauen ()

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

Benutzer-Avatar
Balupton

jQuery Sparkle bietet dafür eine saubere elegante Lösung, indem Sie die Funktion “einmal” aufrufen, können Sie einen Handler nur einmal an ein Ereignis binden.

Es ist eine wichtige Verbesserung gegenüber dem Vorschlag von Darko Z, Folgendes zu verwenden:

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

Würde alle anderen “Klick”-Handler, die dem “Klick”-Ereignis zugeordnet sind, bei jedem Aufruf aufheben. Sie stellen also sicher, dass es nur einmal gebunden ist, aber Sie binden alles andere versehentlich ab! Hoppla!

Der Vorschlag von jarrett entbindet den “click”-Handler direkt nach dem Aufruf. Wenn Sie also den Handler erneut aufrufen möchten (nach seinem anfänglichen Feuer), müssten Sie den Handler erneut binden.

Die einmalige Verwendung von jQuery Sparkle ermöglicht es dem Handler, so oft wie nötig zu feuern, aber nur einmal statt mehrmals gebunden zu werden. Sie können es wie folgt verwenden:

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

Oder wenn Sie Daten in Ihrem Rückruf unterstützen möchten, genau wie das in jQuery integrierte “Bind”, dann können Sie Folgendes verwenden:

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

Sie finden den Quellcode zum Definieren der Once-Funktion hier.

Es ist Open Source unter der AGPL-Lizenz, sodass Sie sich sorgenfrei das herausholen können, was Sie brauchen! 🙂 Es wird auch täglich aktiv weiterentwickelt, so dass es Ihnen nie an Unterstützung mangeln wird.

Aber am wichtigsten ist, dass es ein DRY Plugin/Effect Framework ist, mit dem Sie Plugins und Erweiterungen viel einfacher entwickeln können. Ich hoffe also, dass dies hilft, dieses Ziel zu erreichen!

  • Ich weiß, das ist alt, aber diese Antwort bringt mich zur richtigen Lösung. In der heutigen jQuery-Version habe ich .one-Bindungsfunktion verwendet und mein Problem ist gelöst

    – Ademir Mazer Jr. – Nuno

    5. Dezember 2013 um 18:37 Uhr

bei mir lag es daran

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

    //some exception-throwing code here
});

jQuery hat die anonyme Bereitschaftsfunktion aufgrund der Ausnahme zweimal (?!) aufgerufen, sodass die Klickfunktion zweimal gebunden wäre.

Benutzer-Avatar
gkiko

Sie können verwenden one():

$("div").one("click", function(e) { ... });

Hängen Sie einen Handler an ein Ereignis für die Elemente an. Der Handler wird höchstens einmal pro Element ausgeführt.

Benutzer-Avatar
Riad Ul Islam

Das wird gut funktionieren. Es funktioniert für mich.

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

Benutzer-Avatar
Tessa

So etwas aufzurufen, bevor es für mich funktionierte, da ich ursprünglich $(‘#myButton’).on(‘click’… verwendet hatte, um meine Listener zuzuweisen.

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

Dokumentation für “off();”

1180250cookie-checkjQuery: Klicken Sie auf eine einzelne Schaltfläche, klicken Sie auf das Ereignis, das zwei- oder mehrmals ausgelöst wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy