Auf der folgenden Seite sendet die Schaltfläche "Entfernen" bei Firefox das Formular, die Schaltfläche "Hinzufügen" jedoch nicht. Wie verhindere ich, dass die Schaltfläche zum Entfernen das Formular sendet?
<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
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>
</head>
<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>
Antworten:
Sie verwenden ein HTML5-Schaltflächenelement. Denken Sie daran, dass diese Schaltfläche ein Standardverhalten für das Senden aufweist, wie in der W3-Spezifikation angegeben: W3C HTML5- Schaltfläche
Sie müssen den Typ also explizit angeben:
um den Standard-Übermittlungstyp zu überschreiben. Ich möchte nur auf den Grund hinweisen, warum dies passiert =)
=)
quelle
Stellen Sie den Typ auf Ihren Tasten ein:
... damit sie keine Submit-Aktion auslösen, wenn im Event-Handler eine Ausnahme auftritt. Korrigieren Sie dann Ihre
removeItem()
Funktion so, dass keine Ausnahme ausgelöst wird:Beachten Sie die Änderung: Ihr ursprünglicher Code extrahierte ein HTML-Element aus dem jQuery-Satz und versuchte dann, eine jQuery-Methode darauf aufzurufen. Dies löste eine Ausnahme aus, die zum Standardverhalten für die Schaltfläche führte.
FWIW, es gibt noch einen anderen Weg, wie Sie damit umgehen können ... Verdrahten Sie Ihre Ereignishandler mit jQuery und verwenden Sie die Methode präventDefault () für das Ereignisobjekt von jQuery , um das Standardverhalten im Voraus abzubrechen:
Diese Technik hält Ihre gesamte Logik an einem Ort und erleichtert das Debuggen. Sie ermöglicht auch das Implementieren eines Fallbacks, indem Sie
type
die Schaltflächen wieder aufsubmit
die Ereignisserverseite ändern und diese behandeln - dies wird als unauffällig bezeichnet JavaScript .quelle
return false
ist so wichtig. manchmal sogar für die Schaltfläche "Senden" verwenden (onclick
)Vor einiger Zeit brauchte ich etwas sehr Ähnliches ... und ich habe es bekommen.
Was ich hier schreibe, ist, wie ich die Tricks mache, um ein Formular ohne Validierung von JavaScript senden zu lassen und die Validierung nur auszuführen, wenn der Benutzer eine Schaltfläche drückt (normalerweise eine Senden-Schaltfläche).
Für das Beispiel werde ich ein minimales Formular verwenden, nur mit zwei Feldern und einer Senden-Schaltfläche.
Denken Sie daran, was gewünscht wird: Von JavaScript muss es ohne Überprüfung eingereicht werden können. Wenn der Benutzer jedoch eine solche Taste drückt, muss die Validierung durchgeführt und das Formular nur gesendet werden, wenn die Validierung bestanden wurde.
Normalerweise würde alles von etwas in der Nähe beginnen (ich habe alle zusätzlichen Dinge entfernt, die nicht wichtig sind):
Sehen Sie, wie das Formular-Tag kein hat
onsubmit="..."
(denken Sie daran, dass es eine Bedingung war, es nicht zu haben).Das Problem ist, dass das Formular immer gesendet wird, egal ob
onclick
zurückgegebentrue
oderfalse
.Wenn ich mich
type="submit"
für wechsletype="button"
, scheint es zu funktionieren, funktioniert aber nicht. Das Formular wird nie gesendet, dies ist jedoch problemlos möglich.Also habe ich endlich folgendes benutzt:
Und
function Validator
wo, woreturn True;
ist, füge ich auch einen JavaScript-Submit-Satz hinzu, ähnlich wie dieser:Das
id=""
ist nur für JavaScriptgetElementById
, dasname=""
ist nur für das Erscheinen in POST-Daten.Auf diese Weise funktioniert es wie ich brauche.
Ich stelle dies nur für Personen ein, die keine
onsubmit
Funktion im Formular benötigen , aber eine Validierung vornehmen, wenn eine Taste vom Benutzer gedrückt wird.Warum brauche ich kein Onsubmit auf Formular-Tag? Einfach, bei anderen JavaScript-Teilen muss ich eine Übermittlung durchführen, aber ich möchte nicht, dass es eine Validierung gibt.
Der Grund: Wenn der Benutzer derjenige ist, der die Übermittlung durchführt, möchte und muss die Validierung durchgeführt werden, aber wenn es sich um JavaScript handelt, muss ich die Übermittlung manchmal durchführen, während solche Validierungen dies vermeiden würden.
Es mag seltsam klingen, aber nicht, wenn man zum Beispiel denkt: bei einem Login ... mit einigen Einschränkungen ... wie PHP-Sitzungen nicht verwenden zu dürfen und keine Cookies erlaubt sind!
Daher muss jeder Link in ein solches Formular konvertiert werden, damit die Anmeldedaten nicht verloren gehen. Wenn noch keine Anmeldung erfolgt ist, muss es auch funktionieren. Daher muss keine Validierung für Links durchgeführt werden. Ich möchte dem Benutzer jedoch eine Nachricht präsentieren, wenn der Benutzer nicht beide Felder, Benutzer und Pass, eingegeben hat. Wenn eines fehlt, darf das Formular nicht gesendet 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 es gesendet werden können.
Wenn ich
onsubmit
an dem Formular-Tag arbeite , muss ich wissen, ob es sich um den Benutzer oder ein anderes JavaScript handelt. Da keine Parameter übergeben werden können, ist dies nicht direkt möglich. Einige Benutzer fügen daher eine Variable hinzu, um festzustellen, ob eine Validierung durchgeführt werden muss oder nicht. Das erste, was bei der Validierungsfunktion der Fall ist, ist, diesen Variablenwert usw. zu überprüfen. Zu kompliziert und der Code sagt nicht aus, was wirklich gewünscht wird.Die Lösung besteht also nicht darin, das Formular-Tag erneut einzureichen. Insead legte es dort, wo es wirklich gebraucht wird, auf den Knopf.
Auf der anderen Seite, warum Onsubmit-Code setzen, da ich konzeptionell keine Onsubmit-Validierung möchte. Ich möchte wirklich eine Tastenüberprüfung.
Der Code ist nicht nur klarer, er muss auch dort sein, wo er sein muss. Denken Sie daran: - Ich möchte nicht, dass JavaScript das Formular validiert (dies muss immer von PHP auf der Serverseite durchgeführt werden). - Ich möchte dem Benutzer eine Meldung anzeigen, dass alle Felder nicht leer sein dürfen und JavaScript (Client) benötigen Seite)
Warum müssen einige Leute (denken oder sagen Sie es mir) eine Onsumbit-Validierung durchführen? Nein, konzeptionell mache ich keine Onsumbit-Validierung auf Client-Seite. Ich mache nur etwas auf Knopfdruck. Warum also nicht einfach das implementieren lassen?
Nun, dieser Code und Stil machen den Trick perfekt. Auf jedem JavaScript, das ich zum Senden des Formulars benötige, habe ich gerade Folgendes eingegeben:
Und das überspringt die Validierung, wenn ich sie nicht brauche. Es sendet nur das Formular und lädt eine andere Seite usw.
Wenn der Benutzer jedoch auf die Schaltfläche " Senden" klickt (auch bekannt als "
type="button"
Nicht"type="submit"
), erfolgt die Validierung, bevor das Formular gesendet und, falls nicht gültig, nicht gesendet wird.Ich hoffe, dies hilft anderen, langen und komplizierten Code nicht auszuprobieren. Nur nicht verwenden,
onsubmit
wenn nicht benötigt, und verwendenonclick
. Aber denken Sie daran,type="submit"
zu JavaScript zu wechseln ,type="button"
und vergessen Sie bitte nicht, diessubmit()
per JavaScript zu tun .quelle
Ich stimme Shog9 zu, obwohl ich stattdessen Folgendes verwenden könnte:
Laut w3schools hat das
<button>
Tag in verschiedenen Browsern ein unterschiedliches Verhalten.quelle
Angenommen, Ihr HTML-Formular hat
id="form_id"
Fügen Sie dieses jQuery-Snippet zu Ihrem Code hinzu, um das Ergebnis anzuzeigen.
quelle
Sie können die Referenz Ihrer Schaltflächen einfach mit jQuery abrufen und deren Weitergabe wie folgt verhindern:
quelle
e.preventDefault(); e.stopPropagation();
ist genug, damit die Dinge funktionieren.e.stopImmediatePropagation()
Dies löst einen Fehler der undefinierten Methode in Chrome aus.$("form").submit(function () { return false; });
Das wird die Taste von der Abgabe verhindern , oder Sie können einfach auf die Schaltfläche Typen ändern „Knopf“<input type="button"/>
statt<input type="submit"/>
denen nur funktionieren , wenn diese Taste nicht die einzige Schaltfläche in dieser Form ist.quelle
Dies ist ein HTML5-Fehler, wie bereits gesagt wurde. Sie können die Schaltfläche dennoch als Senden verwenden (wenn Sie sowohl Javascript- als auch Nicht-Javascript-Benutzer abdecken möchten), indem Sie sie wie folgt verwenden:
Auf diese Weise können Sie die Übermittlung abbrechen, aber dennoch alles tun, was Sie in jquery- oder Javascript-Funktionen tun, und die Übermittlung für Benutzer durchführen, die kein Javascript haben.
quelle
Ich bin mir sicher, dass auf FF die
Funktion stoßen auf einen JavaScript-Fehler, der im IE nicht passiert ist
Wenn ein Javascript-Fehler auftritt, wird der Code "return false" nicht ausgeführt, sodass die Seite zurückgesetzt wird
quelle
Die Rückgabe false verhindert das Standardverhalten. Die Rückgabe false unterbricht jedoch das Sprudeln zusätzlicher Klickereignisse. Dies bedeutet, dass andere Klickbindungen nach dem Aufruf dieser Funktion nicht berücksichtigt werden.
Oder einfach so sagen
quelle
Fügen
e.preventDefault();
Sie einfach Ihre Methode hinzu, um zu verhindern, dass Ihre Seite Formulare sendet.Laut den MDN Web Docs
quelle
quelle
Sie können am Ende der Funktion oder nach dem Funktionsaufruf false zurückgeben.
Solange es das letzte ist, was passiert, wird das Formular nicht gesendet.
quelle
Hier ist ein einfacher Ansatz:
quelle
Der folgende Beispielcode zeigt Ihnen, wie Sie verhindern können, dass durch Klicken auf eine Schaltfläche ein Formular gesendet wird.
Sie können meinen Beispielcode ausprobieren:
quelle
Ich kann dies derzeit nicht testen, aber ich würde denken, Sie könnten die PreventDefault- Methode von jQuery verwenden.
quelle
Die Funktion removeItem enthält tatsächlich einen Fehler, wodurch die Formularschaltfläche ihr Standardverhalten ausführt (Senden des Formulars). Die Javascript-Fehlerkonsole gibt in diesem Fall normalerweise einen Zeiger.
Überprüfen Sie die Funktion removeItem im Javascript-Teil:
Die Linie:
funktioniert nicht Versuchen Sie stattdessen Folgendes:
quelle