Deaktivieren Sie die Validierung von HTML-Formularelementen
Lesezeit: 8 Minuten
Nickf
In meinen Formularen möchte ich zum Beispiel die neuen HTML-Formulartypen verwenden <input type="url" /> (mehr Infos zu den Typen hier).
Das Problem ist, dass Chrome super hilfreich sein und diese Elemente für mich validieren will, außer dass es scheiße ist. Wenn die integrierte Validierung fehlschlägt, gibt es keine andere Meldung oder Anzeige als das Element, das den Fokus erhält. Ich fülle URL-Elemente mit vor "http://", und meine eigene benutzerdefinierte Validierung behandelt diese Werte nur als leere Zeichenfolgen, Chrome lehnt dies jedoch ab. Wenn ich die Validierungsregeln ändern könnte, würde das auch funktionieren.
Ich weiß, ich könnte einfach wieder zum Konsum zurückkehren type="text" aber ich möchte die netten Verbesserungen, die diese neuen Typen bieten (z. B.: es wechselt automatisch zu einem benutzerdefinierten Tastaturlayout auf mobilen Geräten):
Gibt es eine Möglichkeit, die automatische Validierung auszuschalten oder anzupassen?
Die Entwurfsspezifikation für HTML 5.1 erwähnt eine inputmode Attributdie – wenn ich richtig verstehe, was ich gelesen habe – verwendet werden kann, um anzugeben, welcher Tastaturtyp dem Benutzer angeboten werden soll, wenn er mit dem Feld interagiert, ohne auch irgendwelche Validierungsregeln implizieren. Irgendwann in der Zukunft mit der inputmode Attribut statt der type -Attribut wird wahrscheinlich die richtige Lösung für dieses Problem sein – aber noch nicht.
– Mark Amery
12. Dezember 2013 um 13:55 Uhr
@MarkAmery Obwohl es nicht allzu schwer wäre, die Zukunft jetzt zu bekommen: $('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
– Marnen Laibow-Koser
3. Juli 2014 um 19:22 Uhr
@MarnenLaibow-Koser Während das, was Sie beschrieben haben, funktioniert, wenn Sie nur die Validierung ausschalten möchten (wie vom Fragesteller angegeben), wird nicht ganz das gleiche Ergebnis wie erzielt inputmode möchten. Wenn Sie die Dinge auf Ihre Art tun, können Sie (zum Beispiel) immer noch keine nicht numerischen Werte lesen, die der Benutzer in ein Eingabefeld vom Typ type eingibt number. Versuchen Sie beispielsweise, etwas Nichtnumerisches in das Textfeld einzugeben diese Geige und auf die Schaltfläche klicken.
– Mark Amery
3. Juli 2014 um 20:07 Uhr
@MarkAmery Interessant. Ist das weil <input type='number'> akzeptiert überhaupt keine nicht-numerischen Werte?
– Marnen Laibow-Koser
7. Juli 2014 um 13:24 Uhr
@MarnenLaibow-Koser Ich denke schon. Die akzeptierte Antwort auf diese Frage zum Problem enthält einen Link zur Spezifikation, dass der Antwortende dieses Verhalten vorschreibt.
– Mark Amery
7. Juli 2014 um 14:21 Uhr
Jakob S
Wenn Sie die clientseitige Validierung für ein Formular in HTML deaktivieren möchten, fügen Sie die novalidate -Attribut zum Formularelement. Ex:
novalidate="novalidate" und novalidate="" ist auch eine gültige Syntax.
– bassim
30. Mai 2012 um 13:20 Uhr
@bassim Gültige Syntax, aber übermäßig ausführlich – warum mehr eingeben als nötig?
– Benutzer1569050
16. Januar 2013 um 14:17 Uhr
@ user1569050 Stimmt, aber manchmal ist es nicht deine Entscheidung und du willst sie nur validieren. Also eigentlich nur der Vollständigkeit halber.
– bassim
23. Januar 2013 um 9:36 Uhr
@ user1569050 Zum Beispiel wird in Frameworks wie CakePHP die novalidate="novalidate" Methode, wenn Sie die festlegen novalidate => true in dem $options Reihe der FormHelper::create(). Danke Bassim für die zusätzlichen Infos 🙂
Ich habe die Spezifikation gelesen und einige Tests in Chrome durchgeführt. Wenn Sie das Ereignis “ungültig” abfangen und “false” zurückgeben, scheint dies die Formularübermittlung zu ermöglichen.
FireFox validiert bei Änderung der Eingabe. Dann wird kein “ungültiges” Ereignis ausgelöst. Also keine Lösung für mich.
– Niels Steenbeek
12. November 2012 um 14:42 Uhr
Funktioniert nicht. Ich habe den Code zu einem Snippet gemacht. Fangen die invalid event und die Rückgabe von false lässt das Formular nicht senden.
– Dan Dascalescu
7. Juli 2015 um 7:59 Uhr
Ich wollte nur hinzufügen, dass die Verwendung des Attributs novalidate in Ihrem Formular nur verhindert, dass der Browser das Formular sendet. Der Browser wertet die Daten trotzdem aus und fügt die Pseudoklassen :valid und :invalid hinzu.
Ich habe das herausgefunden, weil die gültigen und ungültigen Pseudoklassen Teil des HTML5-Boilerplate-Stylesheets sind, das ich verwendet habe. Ich habe gerade die Einträge in der CSS-Datei entfernt, die sich auf die Pseudoklassen beziehen. Falls jemand eine andere Lösung findet bitte melden.
Was meinen Sie: <form action="" method="" class="" id="" novalidate> 😉
– Muhammad Shahzad
24. April 2017 um 11:01 Uhr
Plankton
Die beste Lösung besteht darin, eine Texteingabe zu verwenden und das Attribut inputmode=”url” hinzuzufügen, um die URL-Tastaturfunktionen bereitzustellen. Dafür wurde die HTML5-Spezifikation gedacht. Wenn Sie type=”url” beibehalten, erhalten Sie die Syntaxvalidierung, die nicht in jedem Fall nützlich ist (es ist besser zu prüfen, ob sie einen 404-Fehler zurückgibt, anstatt der Syntax, die recht freizügig ist und keine große Hilfe ist).
Sie haben auch die Möglichkeit, das Standardmuster mit dem Attribut pattern=”https?://.+” zu überschreiben, um beispielsweise freizügiger zu sein.
Das Einfügen des novalidate-Attributs in das Formular ist nicht die richtige Antwort auf die gestellte Frage, da es die Validierung für alle Felder im Formular entfernt und Sie die Validierung beispielsweise für E-Mail-Felder beibehalten möchten.
Die Verwendung von jQuery zum Deaktivieren der Validierung ist ebenfalls eine schlechte Lösung, da es unbedingt ohne JavaScript funktionieren sollte.
In meinem Fall setze ich ein select-Element mit 2 Optionen (http:// oder https://) vor die URL-Eingabe, weil ich nur Webseiten benötige (und kein ftp:// oder ähnliches). Auf diese Weise vermeide ich dieses seltsame Präfix (das größte Bedauern von Tim Berners-Lee und vielleicht die Hauptquelle für URL-Syntaxfehler) und verwende eine einfache Texteingabe mit inputmode=”url” mit Platzhaltern (ohne HTTP). Ich verwende jQuery und ein serverseitiges Skript, um die tatsächliche Existenz der Website zu überprüfen (kein 404) und um das HTTP-Präfix zu entfernen, falls es eingefügt wird (ich vermeide es, ein Muster wie pattern=”^((?http).)*$” zu verwenden. um zu verhindern, dass das Präfix gesetzt wird, weil ich denke, dass es besser ist, freizügiger zu sein)
John Kugelmann
Anstatt zu versuchen, die Validierung des Browsers zu umgehen, könnten Sie die http:// als Platzhaltertext ein. Dies ist von der Seite, die Sie verlinkt haben:
Platzhaltertext
Die erste Verbesserung, die HTML5 für Webformulare bringt, ist die Möglichkeit, festzulegen Platzhaltertext in einem Eingabefeld. Platzhaltertext wird im Eingabefeld angezeigt, solange das Feld leer und nicht fokussiert ist. Sobald Sie auf das Eingabefeld klicken (bzw. mit der Tabulatortaste darauf tippen), verschwindet der Platzhaltertext.
Sie haben wahrscheinlich schon einmal Platzhaltertext gesehen. Beispielsweise enthält Mozilla Firefox 3.5 jetzt Platzhaltertext in der Adressleiste mit der Aufschrift „Lesezeichen und Verlauf durchsuchen“:
Wenn Sie auf die Adressleiste klicken (oder mit der Tabulatortaste dorthin navigieren), verschwindet der Platzhaltertext:
Ironischerweise unterstützt Firefox 3.5 das Hinzufügen von Platzhaltertext zu Ihren eigenen Webformularen nicht. So ist das Leben.
Es wäre nicht genau das Gleiche, da es diesen “Ausgangspunkt” für den Benutzer nicht bieten würde, aber es ist zumindest der halbe Weg dorthin.
+1 für den Tipp, aber es wird leider keine Lösung für mich sein. Ich möchte immer noch keine Validierung, hauptsächlich weil die UX dafür so schlecht ist.
– Nickf
22. Juni 2010 um 5:40 Uhr
Ich habe eine Lösung für Chrome mit CSS im folgenden Selektor gefunden, ohne das native Bestätigungsformular zu umgehen, was sehr nützlich sein könnte.
form input::-webkit-validation-bubble-message,
form select::-webkit-validation-bubble-message,
form textarea::-webkit-validation-bubble-message {
display:none;
}
Auf diese Weise können Sie Ihre Nachricht auch individuell gestalten…
+1 für den Tipp, aber es wird leider keine Lösung für mich sein. Ich möchte immer noch keine Validierung, hauptsächlich weil die UX dafür so schlecht ist.
– Nickf
22. Juni 2010 um 5:40 Uhr
blkpingu
Sie können etwas Javascript hinzufügen, um diese widerlichen Validierungsblasen zu unterdrücken, und Ihre eigenen Validatoren hinzufügen.
document.addEventListener('invalid', (function(){
return function(e) {
//prevent the browser from showing default error bubble / hint
e.preventDefault();
// optionally fire off some custom validation handler
// myValidation();
};
})(), true);
14414700cookie-checkDeaktivieren Sie die Validierung von HTML-Formularelementenyes
Die Entwurfsspezifikation für HTML 5.1 erwähnt eine
inputmode
Attributdie – wenn ich richtig verstehe, was ich gelesen habe – verwendet werden kann, um anzugeben, welcher Tastaturtyp dem Benutzer angeboten werden soll, wenn er mit dem Feld interagiert, ohne auch irgendwelche Validierungsregeln implizieren. Irgendwann in der Zukunft mit derinputmode
Attribut statt dertype
-Attribut wird wahrscheinlich die richtige Lösung für dieses Problem sein – aber noch nicht.– Mark Amery
12. Dezember 2013 um 13:55 Uhr
@MarkAmery Obwohl es nicht allzu schwer wäre, die Zukunft jetzt zu bekommen:
$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
– Marnen Laibow-Koser
3. Juli 2014 um 19:22 Uhr
@MarnenLaibow-Koser Während das, was Sie beschrieben haben, funktioniert, wenn Sie nur die Validierung ausschalten möchten (wie vom Fragesteller angegeben), wird nicht ganz das gleiche Ergebnis wie erzielt
inputmode
möchten. Wenn Sie die Dinge auf Ihre Art tun, können Sie (zum Beispiel) immer noch keine nicht numerischen Werte lesen, die der Benutzer in ein Eingabefeld vom Typ type eingibtnumber
. Versuchen Sie beispielsweise, etwas Nichtnumerisches in das Textfeld einzugeben diese Geige und auf die Schaltfläche klicken.– Mark Amery
3. Juli 2014 um 20:07 Uhr
@MarkAmery Interessant. Ist das weil
<input type='number'>
akzeptiert überhaupt keine nicht-numerischen Werte?– Marnen Laibow-Koser
7. Juli 2014 um 13:24 Uhr
@MarnenLaibow-Koser Ich denke schon. Die akzeptierte Antwort auf diese Frage zum Problem enthält einen Link zur Spezifikation, dass der Antwortende dieses Verhalten vorschreibt.
– Mark Amery
7. Juli 2014 um 14:21 Uhr