Disabilita la convalida degli elementi del modulo HTML5


418

Nei miei moduli, vorrei utilizzare i nuovi tipi di modulo HTML5, ad esempio <input type="url" />( maggiori informazioni sui tipi qui ).

Il problema è che Chrome vuole essere super utile e convalidare questi elementi per me, tranne per il fatto che fa schifo. Se fallisce la convalida integrata, non c'è nessun messaggio o indicazione oltre all'elemento che ottiene lo stato attivo. Ricompilare gli elementi URL con "http://", quindi la mia convalida personalizzata tratta questi valori come stringhe vuote, tuttavia Chrome lo rifiuta. Se potessi cambiare le sue regole di validazione, anche questo funzionerebbe.

So che potrei semplicemente tornare all'utilizzo type="text"ma voglio i bei miglioramenti usando queste nuove offerte di tipi (ad esempio: passa automaticamente a un layout di tastiera personalizzato sui dispositivi mobili):

Quindi, c'è un modo per disattivare o personalizzare la convalida automatica?


8
La bozza delle specifiche HTML 5.1 menziona un inputmodeattributo che, se capisco cosa ho letto correttamente, può essere usato per specificare quale tipo di tastiera dovrebbe essere offerto all'utente quando interagisce con il campo, senza implicare alcuna regola di validazione. Ad un certo punto in futuro, l'utilizzo inputmodedell'attributo anziché typedell'attributo sarà probabilmente la soluzione corretta a questo problema, ma non ancora.
Mark Amery,

@MarkAmery Anche se non sarebbe troppo difficile avere il futuro adesso:$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
Marnen Laibow-Koser,

1
@ MarnenLaibow-Koser Mentre quello che hai descritto funziona se tutto ciò che vuoi fare è disattivare la convalida (come specificato dalla domanda), non ottiene esattamente lo stesso risultato inputmode. Facendo a modo tuo, non puoi ancora (ad esempio) leggere valori non numerici che l'utente digita in una casella di input di tipo number. Ad esempio, prova a digitare qualcosa di non numerico nella casella di testo in questo violino e fai clic sul pulsante.
Mark Amery,

@MarkAmery Interessante. È perché <input type='number'>non accetta affatto valori non numerici?
Marnen Laibow-Koser,

@ MarnenLaibow-Koser credo di si. La risposta accettata su questa domanda relativa al problema include un collegamento alla specifica che il richiedente risponde obbligando questo comportamento.
Mark Amery,

Risposte:


752

Se si desidera disabilitare la convalida lato client per un modulo in HTML5, aggiungere un attributo novalidate all'elemento modulo. Ex:

<form method="post" action="/foo" novalidate>...</form>

Vedi https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-form-novalidate


83
novalidate="novalidate"ed novalidate=""è anche una sintassi valida.
Bassim,

9
@bassim Sintassi valida ma eccessivamente dettagliata: perché digitare più del necessario?
user1569050

11
@ user1569050 Ad esempio in framework come CakePHP, utilizzerà il novalidate="novalidate"metodo quando si imposta novalidate => truel' $optionsarray di FormHelper::create(). Grazie bassista per le informazioni extra :)
Jelmer

12
@ rybo111 Questa è la convalida sul lato client, che è buona per abbassare il numero di richieste al server. Non è una scusa per facilitare la convalida sul lato server.
martti,

11
@martti Mi riferivo al fatto che se sto testando una nuova convalida PHP posso disabilitare rapidamente la convalida JavaScript per quel modulo per evitare di dover compilare correttamente l'intero modulo. Avrei dovuto scrivere "più facile da testare".
Rybo111,

31

Ho letto le specifiche e ho fatto alcuni test su Chrome, e se si rileva l'evento "non valido" e si restituisce false che sembra consentire l'invio del modulo.

Sto usando jquery, con questo HTML.

// suppress "invalid" events on URL inputs
$('input[type="url"]').bind('invalid', function() {
  alert('invalid');
  return false;
});

document.forms[0].onsubmit = function () {
  alert('form submitted');
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input type="url" value="http://" />
  <button type="submit">Submit</button>
</form>

Non l'ho provato su nessun altro browser.


Eccellente - Lo proverò domani e ti farò sapere come va. Grazie.
nickf

Wow! Stavo passando un brutto momento a guardare dove era andato il mio evento di presentazione. Grazie Signore!
Gipsy King,

2
FireFox sta eseguendo la convalida al cambio di input. Quindi l'evento "non valido" non viene generato. Quindi, nessuna soluzione per me.
Niels Steenbeek,

7
domani non arriva mai :)
Lucky Soni,

4
Non funziona Ho reso il codice un frammento. Catturare l' invalidevento e restituire false non consente l'invio del modulo.
Dan Dascalescu,

23

Volevo solo aggiungere che l'uso dell'attributo novalidate nel modulo impedirà al browser di inviare il modulo. Il browser valuta ancora i dati e aggiunge le pseudo-classi: valid e: invalid.

L'ho scoperto perché le pseudo classi valide e non valide fanno parte del foglio di stile HTML5 che ho usato. Ho appena rimosso le voci nel file CSS relative alle pseudo classi. Se qualcuno trova un'altra soluzione, per favore fatemelo sapere.


Come si chiamavano le voci?
tm_forthefuture,

1
Haha - Non so più scusa. Questo è successo 3 anni fa. :(
BFTrick,

1
Intendi <form action="" method="" class="" id="" novalidate>
:;

15

La soluzione migliore è utilizzare un input di testo e aggiungere l'attributo inputmode = "url" per fornire le funzionalità della tastiera URL. La specifica HTML5 è stata pensata per questo scopo. Se mantieni type = "url" ottieni la convalida della sintassi che non è utile in tutti i casi (è meglio verificare se restituisce un errore 404 invece della sintassi che è abbastanza permissiva e non è di grande aiuto).

Hai anche la possibilità di sovrascrivere il modello predefinito con l'attributo modello = "https?: //.+" per esempio per essere più permissivo.

Inserire l'attributo novalidate nel modulo non è la risposta giusta alla domanda posta perché rimuove la convalida per tutti i campi nel modulo e potresti voler mantenere la convalida per i campi e-mail, ad esempio.

L'uso di jQuery per disabilitare la validazione è anche una cattiva soluzione perché dovrebbe assolutamente funzionare senza JavaScript.

Nel mio caso, ho inserito un elemento select con 2 opzioni (http: // o https: //) prima dell'input dell'URL perché ho solo bisogno di siti Web (e non ftp: // o altre cose). In questo modo evito di scrivere questo strano prefisso (il più grande rimpianto di Tim Berners-Lee e forse la principale fonte di errori di sintassi dell'URL) e utilizzo un semplice input di testo con inputmode = "url" con segnaposto (senza HTTP). Uso jQuery e lo script lato server per convalidare la reale esistenza del sito Web (no 404) e per rimuovere il prefisso HTTP se inserito (evito di utilizzare un modello come pattern = "^ ((? Http).) * $" per evitare di mettere il prefisso perché penso che sia meglio essere più permissivi)


13

Invece di provare a fare una fine alla convalida del browser, potresti inserire il http://testo come segnaposto. Questo è dalla stessa pagina che hai collegato:

Segnaposto

Il primo miglioramento apportato da HTML5 ai moduli Web è la possibilità di impostare il testo segnaposto in un campo di input . Il testo segnaposto viene visualizzato all'interno del campo di input purché il campo sia vuoto e non focalizzato. Non appena si fa clic su (o scheda per) il campo di input, il testo segnaposto scompare.

Probabilmente hai già visto il testo segnaposto. Ad esempio, Mozilla Firefox 3.5 ora include il testo segnaposto nella barra degli indirizzi che dice "Cerca segnalibri e cronologia":

inserisci qui la descrizione dell'immagine

Quando fai clic sulla (o sulla scheda) della barra degli indirizzi, il testo segnaposto scompare:

inserisci qui la descrizione dell'immagine

Ironia della sorte, Firefox 3.5 non supporta l'aggiunta di testo segnaposto ai propri moduli Web. È la vita.

Supporto segnaposto

IE  FIREFOX SAFARI  CHROME  OPERA   IPHONE  ANDROID
·   3.7+    4.0+    4.0+    ·       ·       ·

Ecco come puoi includere il testo segnaposto nei tuoi moduli web:

<form>
  <input name="q" placeholder="Search Bookmarks and History">
  <input type="submit" value="Search">
</form>

I browser che non supportano l' placeholderattributo lo ignoreranno semplicemente. Nessun danno nessun inganno. Verifica se il tuo browser supporta il testo segnaposto .

Non sarebbe esattamente lo stesso in quanto non fornirebbe quel "punto di partenza" per l'utente, ma almeno è a metà strada.


5
+1 per la mancia, ma sfortunatamente non sarà una soluzione per me. Non voglio ancora che venga fatta alcuna convalida, principalmente perché l'UX è così scadente.
nickf

10

Ho trovato una soluzione per Chrome con CSS questo seguente selettore senza bypassare il modulo di verifica nativo che potrebbe essere molto utile.

form input::-webkit-validation-bubble-message, 
form select::-webkit-validation-bubble-message,
form textarea::-webkit-validation-bubble-message {
    display:none;
} 

In questo modo, puoi anche personalizzare il tuo messaggio ...

Ho trovato la soluzione in questa pagina: http://trac.webkit.org/wiki/Styling%20Form%20Controls


1
Questo non funziona nell'ultima versione di Chrome (29), mi chiedo se a causa del battito di ciglia
Blowsie,

5

Usa novalidate nel tuo modulo.

<form name="myForm" role="form" novalidate class="form-horizontal" ng-hide="formMain">

Saluti!!!


1
che dire di disabilitare la convalida per un singolo tag di input?
Tobias Kolb,

0

Ecco la funzione che uso per impedire a chrome e opera di mostrare la finestra di dialogo di input non valida anche quando si utilizza novalidate.

window.submittingForm = false;
$('input[novalidate]').bind('invalid', function(e) {
    if(!window.submittingForm){
        window.submittingForm = true;
        $(e.target.form).submit();
        setTimeout(function(){window.submittingForm = false;}, 100);
    }
    e.preventDefault();
    return false;
});

0

puoi aggiungere del javascript per sopprimere quelle odiose bolle di validazione e aggiungere i tuoi validatori.

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);


-5

Potresti installare una semplice estensione di Chrome e disabilitare la convalida al volo https://chrome.google.com/webstore/detail/html5-form-validation-err/dcpagcgkpeflhhampddilklcnjdjlmlb/related

per impostazione predefinita tutto funzionerà come predefinito, ma sarai in grado di disabilitare la convalida html5 con un solo clic sull'icona dell'estensione sulla barra degli strumenti


Non sono sicuro del motivo per cui a molti non piace questa soluzione, consente di testare la convalida del server per i moduli HTML5 senza superare il vero codice HTML
Andrew Zhilin,

3
Credo che non sia apprezzato perché la domanda si concentra sulla creazione di un modulo HTML5 e sulla disattivazione della convalida automatica per tutti gli utenti. Chiedere a tutti gli utenti di A) utilizzare Chrome e B) installare un'estensione prima di utilizzare il sito non è una soluzione sostenibile.
Kallmanation,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.