Die jquery-Validierung wartet nicht darauf, dass die Remote-Validierung true zurückgibt, betrachtet die Form als gültig
$("#new_component_form").validate({
errorClass: 'input-error',
rules : {
"comp_data[account_name]" : {
required: true,
remote: {
url: "/validate",
data: {
provider: 'twitter'
}
}
}
},
onsubmit: true,
onfocusout: false,
onkeyup: false,
onclick: false
});
$("#new_component_form").submit(function(){
console.log($(this).valid());
Diese Ausgänge wahr, auch wenn der Wert ungültig ist. Ich sehe die Validierung schließlich nicht und zeigt die Fehlermeldung, aber die form ist immer noch vorgelegt.
InformationsquelleAutor der Frage oreoshake | 2011-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als jQuery-Validate-1.11.1 (und vielleicht auch ältere), die akzeptierte Antwort funktioniert nicht. Darüber hinaus gibt es keine einfache Antwort auf diese Frage, und die Lösung erfordert das hinzufügen einer benutzerdefinierte Gültigkeitsprüfung-Methode von jQuery Validierung.
Eigentlich die einfache Antwort kann nur sein: Don ' T call
valid()
manuell, wenn alles, was Sie tun möchten, ist das Formular abschicken. Lass das Validate plugin es für Sie tun. Intern, wird es warten, bis alle asynchronen Anfragen, um abzuschließen, bevor das Formular eingereicht werden. Dieses Problem tritt nur, wenn Sie manuell prüfenvalid()
oderelement()
.Jedoch, es gibt viele Gründe, warum Sie möglicherweise tun müssen. Zum Beispiel, die Seite, die ich arbeite, muss zur überprüfung der Gültigkeit eines Feldes mit einem remote-validator aktivieren, bevor Sie den rest des Formulars. Ich könnte einfach tun, es mit der hand statt mit jQuery Validierung, aber das ist eine Duplizierung der Anstrengungen.
Also, warum die Einstellung
async: false
nicht funktionieren? Wenn Sie async auf false, wird die Anfrage wird gemacht werden synchron, aber das plugin funktioniert nicht mit dieser richtig. Die interneremote
Funktion gibt immer"pending"
die Ursache dervalid()
Funktion zurücktrue
auch wenn die Anfrage bereits abgeschlossen und erhielt eine falsche Antwort! Es überprüft nicht den Wert der response-oder zeigen die Fehler erst später.Die Lösung zu machen
valid()
undelement()
Verhalten sich synchron, wenn mit einem synchronen callback hinzufügen, um eine benutzerdefinierte Validierung der Methode. Ich habe versucht, diese selbst, und es scheint gut zu funktionieren. Sie können kopieren Sie einfach den Quellcode aus dem regulären remote-Validierung und ändern Sie es zu behandeln synchrone ajax-Aufrufe, und werden synchron standardmäßig.Den source-code der remote-Funktion in v1.11.1 auf der Zeile beginnt 1112 der jquery.validate.js:
Merken, wie es immer gibt "pending" zurück, auch wenn der ajax-Aufruf abgeschlossen ist.
Um dieses Problem zu beheben, nehmen Sie die folgenden änderungen:
valid
variable außerhalb der ajax-call und die success-Funktion, um eine Schließung, und weisen Sie ihm einen Wert von "pending".valid
Variablen eine Zuweisung.valid
variable anstelle der Konstanten "pending".Hier ist der komplette code für ein plugin, um das plugin. Nur speichern diese als js Datei und fügen ihn in Ihre Seite oder Vorlage, nach der include für jQuery Validierung:
Getestet hab ich dies mit meiner eigenen form und es funktioniert Super. Kann ich testen mein element für die Gültigkeit bevor der rest der form. Allerdings werden Sie wahrscheinlich wollen, zu setzen
onkeyup: false
um zu verhindern, dass die Durchführung einer synchronen Rückruf auf jede Taste zu drücken. Benutze ich auch gerneonfocusout: false
.Diesen zu nutzen, ersetzen Sie einfach "remote" in den validation-Einstellungen mit "synchronousRemote" überall, das Sie verwenden möchten. Zum Beispiel:
InformationsquelleAutor der Antwort Glazed
Stieß in das gleiche Problem scheint es, dass Sie über die set remote-Aufruf synchron - async: false
Sonst die
$("form").valid()
wird true zurückgegeben, für die remote-überprüfung, sehen Sie bitte unten, was ich verwendenInformationsquelleAutor der Antwort Bogdan
Hier ist eine Lösung, mit der wir kam mit auf mein Projekt.
Dieser nutzt die Tatsache, dass $("#form").validate().pendingRequest immer > 0, wenn eine remote-Validierung.
Hinweis: dies funktioniert nicht mit der Einstellung
async: true
im remote-Anfrage.InformationsquelleAutor der Antwort Paul B.
Der einfachste Weg, um dieses problem zu beheben (es wird berichtet, hier: https://github.com/jzaefferer/jquery-validation/issues/361) prüfen Sie zweimal, ob das Formular gültig ist:
Einstellung der Fernbedienung Regeln
async:false
und die Prüfung auf Gültigkeit mit Hilfevalid()
eigentlich wartet die Anrufe zu beenden, aber Ihre return-Werte werden nicht verwendet. Aufrufvalid()
wieder berücksichtigt.Ein bisschen hässlich, aber es funktioniert. Ich bin mit jquery 2.1.0 und jquery-validation-1.11.1, BTW.
InformationsquelleAutor der Antwort emilast
Musst du halt das normale abschicken der browser im Falle, dass die überprüfung den Wert false zurückgibt.
InformationsquelleAutor der Antwort ElHacker
Ich weiß, das ist patch aber
Ich habe es behoben durch überprüfung der aktuellen ajax anhängig ist
Ich check aktuelle ajax-Aufruf von
$.active
Es wird geben Sie 0, wenn kein ajax läuftInformationsquelleAutor der Antwort programtreasures