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?
jQuery: Klicken Sie auf eine einzelne Schaltfläche, klicken Sie auf das Ereignis, das zwei- oder mehrmals ausgelöst wird
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 ()
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.
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.
Riad Ul Islam
Das wird gut funktionieren. Es funktioniert für mich.
$(".class-name").unbind().click(function() {
//Do the Stuff
});
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();
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