2010-05-14 33 views
5

Ich benutze jquery's .submit(), um das Submit-Ereignis des Benutzers abzufangen, jedoch habe ich ein Problem festgestellt.Verwenden von jquery, um das erneute Übermitteln des Formulars zu verhindern

Wenn der Benutzer den Absenden-Button einzeln anklickt, wird das Formular normal übermittelt, aber wenn ein Benutzer es absichtlich schnell anklickt, wird es mehrmals übergeben, was doppelte Daten in der Datenbank verursacht.

Was ist die Lösung für diese Art von Problem?

Update: Nun, ich sehe einige der Ratschläge gesagt, Deaktivieren der Absenden-Taste. Dies sollte verhindern, dass das Formular mehrfach eingereicht wird, aber das Problem ist, dass das Formularelement in meiner Seite nicht aktualisiert wird, wenn ich es deaktiviere, kann der Benutzer es nicht mehr senden, das Deaktivieren für 15s funktioniert vielleicht, ist aber Dies ist der richtige Weg, um dieses Problem zu lösen?

+0

werden Sie mit Ajax das Formular abzuschicken ... Ursache Sperrung ist gut, wenn nicht ajax ... – Reigel

+0

Ja, ich jQuerys Last verwende. Wenn der Benutzer das Formular abschickt, wird eine Zeile in der Tabelle erhöht. – Sawyer

+0

schau dir meine Antwort noch einmal an, wenn es hilft ... – Reigel

Antwort

7

das Absenden Deaktivieren Taste ist in der Tat der Weg zu gehen.

In vielen Fällen hängt die auszuführende serverseitige Logik jedoch vom Vorhandensein des Name-Wert-Paares der betreffenden Übergabeschaltfläche in der Anforderungsparameterzuordnung ab. Vor allem in serverseitigen komponentenbasierten MVC-Frameworks wie MS ASP.NET und Sun JSF, aber auch in "einfachen" Formularen mit mehr als einem Submit-Button. Das Name-Wert-Paar der gedrückten Schaltfläche "Senden" ist erforderlich, um die auszuführende Aktion zu bestimmen. Wenn Sie die Schaltfläche deaktivieren, wird das Name-Wert-Paar in der Anforderungsparameterzuordnung vollständig ausgeblendet, und die Serverseite kann keine Aktion ausführen oder die falsche Aktion ausführen.

Es gibt grundsätzlich zwei Möglichkeiten, um dies zu realisieren:

  1. Verwenden setTimeout() die Taste nach wenigen Millisekunden zu deaktivieren, so dass das Name-Wert-Paar ohnehin gesendete. 50ms ist eine erschwingliche Menge.

    $("form").submit(function() { 
        var form = this; 
        setTimeout(function() { 
         $(':submit', form).attr('disabled', true); 
        }, 50); 
    }); 
    
  2. Kopieren Sie die Name-Wert-Paar der tatsächlich gedrückt Submit-Button in einem versteckten Eingang des Formulars. Dies ist ein wenig komplizierter, da diese Information im submit Ereignis der <form> nicht verfügbar ist. Sie müssen die $(document) das zuletzt angeklickte Element erfassen lassen.

    $("form").submit(function() { 
        $(':submit', this).attr('disabled', true); 
        $(this).append($('<input/>').attr({ 
         type: 'hidden', 
         name: $.lastClicked.name, 
         value: $.lastClicked.value 
        })); 
    }); 
    
    $(document).click(function(e) { 
        e = e || event; 
        $.lastClicked = e.target || e.srcElement; 
    }); 
    

aktualisieren: wie pro Ihre Update:

Nun, ich sehe einige der Ratschläge den Absenden-Button sagte zu deaktivieren. Dies sollte verhindern, dass das Formular mehrmals gesendet wird, aber das Problem ist, dass das Formularelement in meiner Seite nicht aktualisiert wird, wenn ich es deaktiviere, kann der Benutzer es nicht mehr senden, das Deaktivieren für 15s funktioniert vielleicht, aber ist das Der richtige Weg, um dieses Problem zu lösen?

Sie feuern also eigentlich eine ajaxische Anfrage. Sie könnten einfach die Schaltfläche (n) im Callback-Handler der jjQuery-Ajax-Funktion wieder aktivieren. Angenommen, Sie sind mit jQuery.post:

$("form").submit(function() { 
    // Disable buttons here whatever way you want. 

    var form = this; 
    $.post('some/url', function(data) { 
     // Re-enable buttons at end of the callback handler. 
     $(':submit', form).attr('disabled', false); 
    }); 
}); 
1

versucht der Absenden-Button auf Formular deaktivieren ....

$("form").submit(function() { 
    $(':submit',this).attr('disabled','disabled'); 
    $('selector').load(url,function(){ 
     $(':submit',this).removeAttr('disabled'); 
    }) 
});​ 

quick demo

+0

Danke Mann, sehe mein Update! – Sawyer

+0

Was ist "URL"? Vergessen Sie auch nicht, dass durch Drücken der Eingabetaste das Formular übermittelt wird. – nickf

+0

@nickf - Würdest du mich auch fragen, was '$ ('Selektor')' '? ... das OP gab nicht viele Codes (nur das' .submit() ') ... so nahm ich an. .. ja drück Enter würde auch einreichen, wenn ein Textfeld im Fokus ist und du Enter drückst ... aber dann wieder hängt es von den Codes des OP ab .... – Reigel

0

Das eigentliche Problem liegt bei Datenbank-Layer muss entworfen werden Doppelungen zu vermeiden. Hier ist eine universelle, aber ein wenig hässliche Lösung:

Wenn Sie eine Seite zum ersten Mal rendern, können Sie eine GUID erstellen. Sagen Sie, Operations-ID. und lege es in einen Viewstate. Wenn Sie ein Ereignis auf der Serverseite verarbeiten, fügen Sie diese GUID einfach in eine Tabelle ein, sagen Sie OngoingOperations, wo es sich um einen Primärschlüssel handelt. Die erste Einfügung wird erfolgreich ausgeführt, die andere wird fehlschlagen. Um benutzerfreundlicher zu sein, können Sie einfach nachfolgende Operationen überspringen und den Status der ersten zurückgeben.

OngoingOperations Die Tabelle kann wie folgt aussehen:

TABLE OngoingOperations CREATE ( OperationID UNIQUEPrimärSchlüssel, OperationDate DATETIME Standard getDate(), OperationStatus nvarchar (max) );

OperationStatus - ist eine Statusnachricht oder Daten, die von nachfolgenden Übermittlungen an den Client zurückgegeben werden. Hier können Sie eine Flagge (ok oder nicht) oder eine detaillierte Nachricht verwenden - wie Sie möchten.

Diese Tabelle erfordert die Sammlung alter Datensätze, z. B. jede Stunde, in der Sie Vorgänge löschen, die mindestens zwei Stunden zuvor abgeschlossen wurden.

Anton Burtsev

0

Try this:

$("form").submit(function() { 
    var form = this; 
    setTimeout(function() { 
     $(':submit', form).attr('disabled', true); 
    }, 50); 

    setTimeout(function() { 
     $(':submit', form).removeAttr('disabled'); 
    }, 1000); 
}); 
Verwandte Themen