1216 Stimmen

So verhindern Sie das Absenden von Formularen über Schaltflächen

Auf der folgenden Seite wird das Formular mit Firefox mit der Schaltfläche "Entfernen" abgeschickt, mit der Schaltfläche "Hinzufügen" jedoch nicht.

Wie kann ich die remove Schaltfläche vom Absenden des Formulars ab?

function addItem() {
  var v = $('form :hidden:last').attr('name');
  var n = /(.*)input/.exec(v);

  var newPrefix;
  if (n[1].length == 0) {
    newPrefix = '1';
  } else {
    newPrefix = parseInt(n[1]) + 1;
  }

  var oldElem = $('form tr:last');
  var newElem = oldElem.clone(true);
  var lastHidden = $('form :hidden:last');

  lastHidden.val(newPrefix);

  var pat = '=\"' + n[1] + 'input';

  newElem.html(newElem.html().replace(new RegExp(pat, 'g'), '=\"' + newPrefix + 'input'));
  newElem.appendTo('table');
  $('form :hidden:last').val('');
}

function removeItem() {
  var rows = $('form tr');
  if (rows.length > 2) {
    rows[rows.length - 1].html('');
    $('form :hidden:last').val('');
  } else {
    alert('Cannot remove any more rows');
  }
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<html>
<body>
    <form autocomplete="off" method="post" action="">
        <p>Title:<input type="text" /></p>
        <button onclick="addItem(); return false;">Add Item</button>
        <button onclick="removeItem(); return false;">Remove Last Item</button>
        <table>
            <th>Name</th>

            <tr>
                <td><input type="text" id="input1" name="input1" /></td>
                <td><input type="hidden" id="input2" name="input2" /></td>
            </tr>
        </table>
        <input id="submit" type="submit" name="submit" value="Submit">
    </form>
</body>

</html>

0 Stimmen

Welche Antwort empfehlen Sie bitte?

2514voto

Metafaniel Punkte 26258

Sie verwenden ein HTML5-Schaltflächenelement. Der Grund dafür ist, dass diese Schaltfläche das Standardverhalten "Senden" hat, wie in der W3-Spezifikation angegeben, wie hier zu sehen: W3C HTML5-Schaltfläche

Daher müssen Sie seinen Typ explizit angeben:

<button type="button">Button</button>

um den standardmäßigen Übermittlungstyp außer Kraft zu setzen. Ich möchte nur auf den Grund hinweisen, warum dies geschieht.

91 Stimmen

Ich möchte auch darauf hinweisen, dass ein HTML-Element, das ein type-Attribut hat, von dem einer der Typen Taste sollte nicht f#$'n Standardtyp von einreichen . Das ist einfach nur idiotisch und ein großer Fehler in der Spezifikation. Ich verwende ständig Schaltflächen in Formularen, und selbst wenn es sich um einen Sonderfall handeln würde (was nicht der Fall ist), wäre es immer noch sinnvoll, den Standardtyp "submit" zu verwenden.

12 Stimmen

Ich habe die meiste Zeit dieser Woche damit verbracht, mich darüber zu ärgern, dass meine Electron-App "aktualisiert" wird, wenn ich ein Modal über eine Schaltfläche innerhalb eines Formulars öffne. Es passierte einmal und dann verhielt sich die App so, wie ich es erwartet hatte. Ich hatte absolut keine Ahnung, was da los war. Das war's! Ich habe kein Problem damit, dass der Standardtyp "Submit" ist. Es scheint ein bisschen ein gotcha aber angesichts es hat mich fünf Jahre zu lernen, über sie.

9 Stimmen

Dank Ihres Hinweises habe ich gerade erfahren, dass es einen type=reset für form gibt. Großartig!

659voto

Shog9 Punkte 151504

Legen Sie den Typ Ihrer Schaltflächen fest:

<button type="button" onclick="addItem(); return false;">Add Item</button>
<button type="button" onclick="removeItem(); return false;">Remove Last Item</button>

...das wird sie davon abhalten, eine Submit-Aktion auszulösen, wenn eine Ausnahme im Event-Handler auftritt. Korrigieren Sie dann Ihre removeItem() Funktion, damit sie keine Ausnahme auslöst:

function removeItem() {
  var rows = $('form tr');
  if ( rows.length > 2 ) {
    // change: work on filtered jQuery object
    rows.filter(":last").html('');
    $('form :hidden:last').val('');
  } else {
    alert('Cannot remove any more rows');
  }
}

Beachten Sie die Änderung: Ihr ursprünglicher Code hat ein HTML-Element aus dem jQuery-Set extrahiert und dann versucht, eine jQuery-Methode darauf aufzurufen - dies hat eine Ausnahme ausgelöst, was zum Standardverhalten der Schaltfläche geführt hat.

FWIW, gibt es einen anderen Weg, den Sie mit diesem gehen könnte ... Verdrahten Sie Ihre Event-Handler mit jQuery, und verwenden Sie die preventDefault() Methode auf jQuery's Veranstaltung Objekt, um das Standardverhalten im Voraus aufzuheben:

$(function() // execute once the DOM has loaded
{

  // wire up Add Item button click event
  $("#AddItem").click(function(event)
  {
    event.preventDefault(); // cancel default behavior

    //... rest of add logic
  });

  // wire up Remove Last Item button click event
  $("RemoveLastItem").click(function(event)
  {
    event.preventDefault(); // cancel default behavior

    //... rest of remove last logic
  });

});

...

<button type="button" id="AddItem" name="AddItem">Add Item</button>
<button type="button" id="RemoveLastItem" name="RemoveLastItem">Remove Last Item</button>

Bei dieser Technik bleibt die gesamte Logik an einem Ort, was die Fehlersuche erleichtert... Außerdem können Sie eine Rückfallfunktion implementieren, indem Sie die type auf den Tasten zurück zu submit und die Verarbeitung des Ereignisses serverseitig - dies wird als unaufdringliches JavaScript .

5 Stimmen

Type="button" funktioniert bei mir in Firefox nicht immer. Wenn das js kompliziert genug ist und ein Fehler auftritt, sendet Firefox das Formular trotzdem ab. Wahnsinn!

2 Stimmen

@MatthewLock: Wohl kaum - bei einem Fehler im Skript wird der Codeblock einfach geschlossen, und die Aktion wird wie gewohnt fortgesetzt. Versuchen Sie, die jQuery-Ereignismethoden e.preventDefault() und/oder e.stopPropgation() als erste Zeilen der Methode aufzurufen. Siehe stackoverflow.com/questions/2017755/ mehr erfahren

8 Stimmen

Type=button sollte das Formular jedoch niemals abschicken, egal wie

39voto

z666zz666z Punkte 1185

Vor einiger Zeit brauchte ich etwas sehr Ähnliches... und ich habe es bekommen.

Also, was ich hier ist, wie ich die Tricks, um ein Formular in der Lage, von JavaScript ohne Validierung und führen Validierung nur, wenn der Benutzer eine Schaltfläche (in der Regel eine Schaltfläche "Senden") drückt gesendet werden.

Für das Beispiel werde ich ein minimales Formular mit nur zwei Feldern und einer Schaltfläche zum Absenden verwenden.

Denken Sie daran, was gewünscht wird: Von JavaScript aus muss es ohne jede Prüfung übermittelt werden können. Wenn der Benutzer jedoch auf eine solche Schaltfläche drückt, muss die Validierung durchgeführt und das Formular nur gesendet werden, wenn es die Validierung besteht.

Normalerweise würden alle in etwa so anfangen (ich habe alles Unwichtige entfernt):

<form method="post" id="theFormID" name="theFormID" action="">
   <input type="text" id="Field1" name="Field1" />
   <input type="text" id="Field2" name="Field2" />
   <input type="submit" value="Send" onclick="JavaScript:return Validator();" />
</form>

Sehen Sie, wie form tag hat keine onsubmit="..." (Sie erinnern sich, dass es eine Bedingung war, es nicht zu haben).

Das Problem ist, dass das Formular immer abgeschickt wird, unabhängig davon, ob onclick gibt zurück. true o false .

Wenn ich die type="submit" para type="button" Es scheint zu funktionieren, tut es aber nicht. Es sendet nie das Formular, aber das kann leicht gemacht werden.

Also habe ich schließlich das hier benutzt:

<form method="post" id="theFormID" name="theFormID" action="">
   <input type="text" id="Field1" name="Field1" />
   <input type="text" id="Field2" name="Field2" />
   <input type="button" value="Send" onclick="JavaScript:return Validator();" />
</form>

Und am function Validator , donde return True; ist, füge ich auch einen JavaScript-Übermittlungssatz hinzu, der in etwa so lautet:

function Validator(){
   //  ...bla bla bla... the checks
   if(                              ){
      document.getElementById('theFormID').submit();
      return(true);
   }else{
      return(false);
   }
}

El id="" ist nur für JavaScript getElementById die name="" ist nur, dass sie in den POST-Daten erscheint.

Auf diese Weise funktioniert es so, wie ich es brauche.

Ich habe dies nur für Leute, die keine onsubmit Funktion auf dem Formular, sondern machen einige Validierung, wenn eine Schaltfläche vom Benutzer gedrückt wird.

Warum brauche ich kein onsubmit im Formular-Tag? Einfach, auf andere JavaScript-Teile, die ich brauche, um eine Übermittlung durchführen, aber ich will nicht, dass es keine Validierung sein.

Der Grund: Wenn der Benutzer derjenige ist, der die Übermittlung durchführt, möchte und muss ich die Validierung durchführen, aber wenn es sich um JavaScript handelt, muss ich manchmal die Übermittlung durchführen, während solche Validierungen dies vermeiden würden.

Es mag seltsam klingen, aber nicht, wenn man z.B. an ein Login denkt... mit einigen Einschränkungen... wie z.B. dass keine PHP-Sitzungen verwendet werden dürfen und auch keine Cookies erlaubt sind!

Also muss jeder Link in ein solches Formular umgewandelt werden, damit die Anmeldedaten nicht verloren gehen. Wenn noch kein Login erfolgt ist, muss es auch funktionieren. Es muss also keine Validierung auf Links durchgeführt werden. Aber ich möchte dem Benutzer eine Meldung präsentieren, wenn er nicht beide Felder, Benutzer und Pass, ausgefüllt hat. Wenn also eines fehlt, darf das Formular nicht abgeschickt werden! da ist das Problem.

Siehe das Problem: das Formular darf nicht gesendet werden, wenn ein Feld leer ist, nur wenn der Benutzer eine Schaltfläche gedrückt hat, wenn es sich um einen JavaScript-Code handelt, muss er gesendet werden können.

Wenn ich die Arbeit an onsubmit auf dem Formular-Tag, müsste ich wissen, ob es der Benutzer oder ein anderes JavaScript ist. Da keine Parameter übergeben werden können, ist es nicht möglich, direkt, so dass einige Leute eine Variable hinzufügen, um zu sagen, ob die Validierung durchgeführt werden muss oder nicht. Das erste, was die Validierungsfunktion macht, ist, den Wert der Variable zu überprüfen usw... Zu kompliziert, und der Code sagt nicht, was wirklich gewollt ist.

Die Lösung besteht also darin, onsubmit nicht auf dem Formular-Tag zu haben. Sondern dort, wo es wirklich gebraucht wird, nämlich auf der Schaltfläche.

Für die andere Seite, warum setzen onsubmit Code seit konzeptionell ich nicht onsubmit Validierung wollen. Ich möchte wirklich Schaltfläche Validierung.

Der Kodex ist nicht nur klarer, er ist auch da, wo er sein muss. Denken Sie einfach daran: - Ich möchte nicht, dass JavaScript das Formular validiert (das muss immer von PHP auf der Serverseite erledigt werden) - Ich möchte dem Benutzer eine Meldung anzeigen, die besagt, dass alle Felder nicht leer sein dürfen; dafür ist JavaScript erforderlich (clientseitig)

Warum also denken manche Leute (oder sagen mir), dass es auf einer Onsumbit-Validierung beruhen muss? Nein, konzeptionell mache ich keine Onsumbit-Validierung auf der Client-Seite. Ich bin nur etwas auf eine Schaltfläche gedrückt wird, also warum nicht einfach lassen, dass implementiert werden?

Nun, dieser Code und Stil erfüllt den Zweck perfekt. Auf jedem JavaScript, das ich brauche, um das Formular zu senden ich einfach setzen:

document.getElementById('theFormID').action='./GoToThisPage.php'; // Where to go
document.getElementById('theFormID').submit(); // Send POST data and go there

Und das überspringt die Validierung, wenn ich sie nicht brauche. Es sendet einfach das Formular und lädt eine andere Seite, usw.

Wenn der Benutzer jedoch auf die Schaltfläche "Senden" (auch bekannt als type="button" ノット type="submit" ) wird die Validierung durchgeführt, bevor das Formular abgeschickt wird, und wenn es nicht gültig ist, nicht gesendet.

Nun, ich hoffe, dies hilft anderen, nicht lange und komplizierte Codes zu versuchen. Einfach nicht verwenden onsubmit falls nicht benötigt, und verwenden Sie onclick . Aber denken Sie daran, zu wechseln type="submit" a type="button" und vergessen Sie bitte nicht, die submit() durch JavaScript.

31voto

poundifdef Punkte 17185

Ich stimme mit Shog9 überein, auch wenn ich stattdessen verwenden könnte:

<input type = "button" onClick="addItem(); return false;" value="Add Item" />

Laut w3schools die <button> Tag verhält sich in den verschiedenen Browsern unterschiedlich.

28voto

Ata Iravani Punkte 2009

Sie können einfach den Verweis auf Ihre Schaltflächen mit jQuery, und verhindern, dass seine Ausbreitung wie unten:

 $(document).ready(function () {
    $('#BUTTON_ID').click(function(e) {

            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();

            return false;
    });});

3 Stimmen

e.preventDefault(); e.stopPropagation(); reicht aus, damit die Dinge funktionieren. e.stopImmediatePropagation() Dies führt in Chrome zu einem Fehler wegen einer undefinierten Methode.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X