Ich habe drei div-Felder auf meiner Seite. In jedem div-Feld gibt es eine delete-Schaltfläche, die ich drücke, die das div-Feld aus dem Code entfernt. Eine Ajax-Anfrage in demselben Ereignis sendet eine eindeutige Nummer basierend darauf, welche div-Box an den Server gedrückt wurde. Um zu verhindern, dass mehrere Klickereignisse auf der Schaltfläche Löschen aufgerufen werden, habe ich das Ereignis one () verwendet. Aber in seltenen Fällen, bei denen ich schnell auf die Schaltfläche klicke, wird das Ereignis zweimal ausgelöst und ich sehe, dass die Datenbank doppelte Zahlen erhalten hat. Ich dachte, ein () verhindert dies. Was könnte mit meinem jQuery-Code falsch sein, damit er zweimal ausgelöst wird? Mein Code ist unten.
Beispielschaltfläche aus HTML
%Vor%jQuery-Code
%Vor%Update: Pro Anfrage gebe ich eine kurze Erklärung zu meinem Code für die gesamte Seite.
%Vor% Ich kann nicht sagen, ob dieses Problem geklärt ist oder nicht, aber angesichts des Feedbacks in den Kommentaren scheint es, dass Sie one
zweimal binden und es scheint auch auf den Kommentaren zu beruhen, die Sie in user23875
's answer hinterlassen haben dass du dir dessen bewusst bist.
Wenn Sie das Ereignis zweimal binden, wird es zweimal ausgeführt, einfach so.
Wenn Sie sich der Tatsache bewusst sind, dass Sie das Ereignis zweimal binden, versuchen Sie nicht, zuvor angefügte Ereignisse zu lösen.
%Vor%Wenn Sie Ihren vollständigen HTML-Code nicht zweimal neu rendern, wird sichergestellt, dass Sie nur ein einzelnes Klickereignis anhängen.
Wie% code_% darauf hingewiesen hat, machst du in deinen Skripten sicherlich etwas Unkonventionelles.
Sie sollten Ihren Code so weit wie möglich trennen, um sicherzustellen, dass Code, den Sie nur ausführen möchten, nur als solcher bezeichnet wird.
Hoffentlich wird das Problem dadurch behoben.
Wie wäre es, wenn Sie der Schaltfläche beim Klicken eine '.disabled'
-Klasse hinzufügen und dem Ereignis click ein :not(.disabled)
für die Ereignisauswahl zuweisen?
BEISPIEL:
$('#delete_post_1:not(.disabled)').one('click', function() {
$(this).addClass('disabled');
var session_user_id = <? php echo $session_user_id; ?> ;
var number = 1;
$.post('ajax_delete_post.php', {
user_id: session_user_id,
number: number
}, function() {
$('#post_1').remove();
});
});
Es scheint, als ob Sie synchrone Anrufprobleme verwenden. Entfernen Sie den gesamten Code aus der Klickfunktion in eine neue Funktion. Rufen Sie diese Funktion bei Klick auf. Verwenden Sie auch asynchrone Ajax-Anfrage.
Sie sollten Ihren Beitrag sperren und vielleicht alles in eine Funktion wie diese bringen:
%Vor%Ihr Eingabe-Ding sollte dann natürlich so aussehen:
%Vor%Beenden Sie das Binden der Ereignisse jedes Mal, wenn Sie weitere Schaltflächen hinzufügen, und binden Sie sie stattdessen nur einmal mithilfe der Ereignisdelegierung.
%Vor% Kleine Anmerkung, ich vermute, du musst user_id
nicht weitergeben, php sollte das aus der Sitzung herausholen können.
Bearbeiten: Hoppla, .one
delegeated löst immer nur ein Ereignis aus, nicht eines pro Kind. Auf ähnliche .on
-Funktionalität aktualisiert.
Wichtig
Stellen Sie diesen Code nicht an einem Ort auf, an dem er mehr als einmal ausgeführt wird.
Ich weiß, dass deine Frage darin bestand herauszufinden, warum dein one () nicht funktionierte. Aber es sieht so aus, als hätten wir im Laufe der Diskussion festgestellt, dass Sie mehrere one () -Deklarationen erstellt haben. Wir wissen jetzt auch, dass Sie für jeden deklarierten Befehl eine Ausführung erhalten, die für Ihre Situation unerwünscht ist. Während dieser Befund Ihre Frage technisch beantwortet, glaube ich, dass Ihr Problem nicht gelöst ist. Ich dachte, dass deine Herangehensweise an dein Problem vielleicht modifiziert werden könnte und endete damit, diese JS-Geige zu machen:
Der Kern meines Vorschlags:
Das ist es ziemlich. Dies ist mein erster Versuch, eine Frage zu stackoverflow zu beantworten. Ich hoffe, Sie finden das hilfreich!