Dieses kleine HTML5-Passwortfeld funktioniert einwandfrei OHNE das oninvalid-Attribut (das Muster sagt: mindestens 6 Zeichen):
<form>
<input type="password" name="user_password_new" pattern=".{6,}" required />
<input type="submit" name="register" value="Register" />
</form>
Siehe das jsFiddle hier .
Wenn ich jedoch ein oninvalid-Attribut hinzufüge, das eine benutzerdefinierte Fehlermeldung ausgibt, wenn die Benutzereingabe nicht in das Muster passt, wird das gesamte Feld NIEMALS gültig. Siehe den Code hier:
<form>
<input type="password" name="user_password_new" pattern=".{6,}" oninvalid="setCustomValidity('Minimum length is 6 characters')" required />
<input type="submit" name="register" value="Register" />
</form>
Siehe das jsFiddle hier .
Kannst du den Fehler erkennen?
Wenn Sie mit setCustomValidity()
einen Wert festlegen, ist das Feld ungültig. Das Festlegen einer Zeichenfolge mit einer Länge ungleich Null bewirkt, dass der Browser das Feld als ungültig betrachtet. Um die Auswirkungen anderer Validierungen zu berücksichtigen, müssen Sie die benutzerdefinierte Gültigkeit löschen:
<input type="password" name="user_password_new" pattern=".{6,}" required
oninvalid="setCustomValidity('Minimum length is 6 characters')"
oninput="setCustomValidity('')" />
Da ich über das gleiche Problem gestolpert bin, ist hier meine Lösung - getestet und arbeitet mit FF, Chrome, IE 10, Edge (Feb 2017).
<form>
<input pattern="1234" oninput="setCustomValidity(''); checkValidity(); setCustomValidity(validity.valid ? '' :'please enter 1234');">
<input type="email" required>
<input type="submit">
</form>
Erklärung:
setCustomValidity('');
entfernt die benutzerdefinierte Fehlerzeichenfolge, die andernfalls beim Validierungsprozess immer zu einem ungültigen Feld führen würde.
checkValidity();
führt eine manuelle Validierung durch - genauso wie bei der Formularübermittlung. Das Ergebnis wird in validity.valid
gespeichert.
Das zweite setCustomValidity(validity.valid ? '' :'please enter 1234');
setzt nun die Fehlerzeichenfolge entsprechend dem Validierungsergebnis. Wenn das Feld gültig ist, muss es leer sein. Andernfalls kann die benutzerdefinierte Fehlerzeichenfolge festgelegt werden.
Ich benutze gerne so:
<input type="email" name="Email" required oninvalid="setCustomValidity('ErrorMessage')"/>
Und für alle gültigen Eingabedaten nicht angeschlossen
UPD, noch etwas für bessere Arbeit:
$("input").attr("onblur", "setCustomValidity('')");
$("input").attr("oninput", "setCustomValidity(' ')");
Obwohl die Antworten auf diese Frage gute Informationen enthielten, reichten sie für meine Bedürfnisse nicht aus. Ich muss unterschiedliche Meldungen anzeigen, abhängig davon, welche Gültigkeitsregel fehlgeschlagen ist. In den anderen Beispielen wird dieselbe Validierungsfehlermeldung für alle Bewertungsfehler verwendet.
Die Eigenschaft "Gültigkeit" eines Formularobjekts enthält den Schlüssel zum Erstellen mehrerer Validierungsfehlermeldungen.
Sie können alle verschiedenen "Gültigkeit" -Eigenschaften auf dieser Website überprüfen.
https://www.w3schools.com/js/js_validation_api.asp
Dieses Beispiel zeigt, wie zwei verschiedene Überprüfungsmeldungen angezeigt werden. Wenn Sie die Kommentarzeile in der console.log () -Zeile nicht kommentieren, können Sie die Änderung der Gültigkeitseigenschaft beobachten, wenn Sie ein Feld eingeben.
<label for="user_password_new">New Password:</label>
<input type="password" name="user_password_new" id="user_password_new"
pattern=".{6,}"
value=""
required
oninput="
setCustomValidity('');
checkValidity();
// console.log(validity);
if (validity.patternMismatch) {
setCustomValidity('Please enter at least six characters.');
}
else if (validity.valueMissing) {
setCustomValidity('This field is required.');
}
else if (validity.valid) {
setCustomValidity('');
}
// allow default validation message to appear for other validation failures
"
>
HINWEIS: Einige Gültigkeitsprüfungen sind "typspezifisch". Beispielsweise werden die Attribute "rangeOverflow", "rangeUnderflow" und "stepMismatch" gesetzt, wenn type sie verwendet. Typ = "Nummer".
Sie können title
verwenden, solange Sie nichts dagegen haben, 'You must use this format:'
vor Ihrer Nachricht zu haben. Wenn Sie eine vollständige benutzerdefinierte Nachricht wünschen, funktionierte die setCustomValidity()
für mich.