One () arbeitet nicht mit AJAX?

9

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%     
jason328 17.09.2012, 20:59
quelle

9 Antworten

3

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.

    
Nope 23.09.2012, 00:59
quelle
0

Nun, stellen Sie zuerst sicher, dass Sie kein Leerzeichen zwischen < und php haben, wo Sie die session_user_id echo ... Dies könnte eine mögliche Lösung sein, der Rest scheint recht.

    
Max Allan 17.09.2012 21:21
quelle
0

Könnten Sie diesen Code ausprobieren und die Konsole überprüfen, wenn sie zweimal ausgelöst wird?

%Vor%

BEARBEITEN

versuchen Sie eine letzte Sache: Zitate

%Vor%     
RASG 17.09.2012 21:29
quelle
0

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

    
Dropped.on.Caprica 21.09.2012 00:26
quelle
0

Aus was ich in Ihrem Dokument verstehe:

%Vor%     
LeGEC 24.09.2012 11:41
quelle
0

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.

    
Zahid Riaz 24.09.2012 11:44
quelle
0

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%     
Ivan Schrecklich 27.09.2012 06:20
quelle
0

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.

    
Kevin B 27.09.2012 20:56
quelle
0

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:

  1. Binden Sie Ihr click-Ereignis an den OUTER-div-Wrapper ("#post_list" in meinem Beispiel). Auf diese Weise können Sie immer Klicks auf die Löschschaltfläche erkennen, selbst wenn ein Post über einen Ajax-Anruf neu erstellt / hinzugefügt wurde.
  2. Fügen Sie für jede Ihrer Schaltflächen ein benutzerdefiniertes Attribut "data-postid" hinzu, um zu ermitteln, welche Beitrags-ID Sie löschen müssen.
  3. In meinem Beispiel verwende ich eine langsame fadeOut, um einen langsamen Ajax-Aufruf zu simulieren. Aber der Zweck davon ist, zu zeigen, wie man die Callback-Funktion für die Fertigstellung benutzt, um etwas anderes zu tun (wie das DOM-Element, das erfolgreich gelöscht wurde).

Das ist es ziemlich. Dies ist mein erster Versuch, eine Frage zu stackoverflow zu beantworten. Ich hoffe, Sie finden das hilfreich!

    
Dean L 27.09.2012 22:12
quelle

Tags und Links