Imposta messaggio di convalida del campo obbligatorio HTML5 personalizzato


113

Convalida personalizzata del campo obbligatorio

Ho un modulo con molti campi di input. Ho messo convalide html5

<input type="text" name="topicName" id="topicName" required />

quando invio il modulo senza riempire questa casella di testo, viene visualizzato un messaggio predefinito come

"Please fill out this field"

Qualcuno può aiutarmi a modificare questo messaggio?

Ho un codice javascript per modificarlo, ma non funziona

$(document).ready(function() {
    var elements = document.getElementsByName("topicName");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                e.target.setCustomValidity("Please enter Room Topic Title");
            }
        };
        elements[i].oninput = function(e) {
            e.target.setCustomValidity("");
        };
    }
})


Email di convalida personalizzate

Ho il seguente modulo HTML

<form id="myform">
    <input id="email" name="email" type="email" />
    <input type="submit" />
</form>


Messaggi di convalida che desidero.

Campo obbligatorio: inserire l'indirizzo e-mail E-
mail errata: "testing @ .com" non è un indirizzo e-mail valido. ( qui, indirizzo email inserito visualizzato nella casella di testo )

L'ho provato.

function check(input) {  
    if(input.validity.typeMismatch){  
        input.setCustomValidity("'" + input.value + "' is not a Valid Email Address.");  
    }  
    else {  
        input.setCustomValidity("");  
    }                 
}  

Questa funzione non funziona correttamente, hai altri modi per farlo? Sarebbe apprezzato.


1
Cosa intendi con "non funziona"? Sta dando un errore? Apri gli strumenti per sviluppatori di Chrome o Firebug di Firefox e verifica se c'è un errore JavaScript.
Osiride

C'è un altro modo di fare questo?
Sumit Bijvani

Puoi inserire altro codice? Quello che hai pubblicato non è abbastanza per aiutarti. E in che browser lo stai testando?
Levi Botelho

@LeviBotelho Ho pubblicato l'intero codice e lo sto testando su Firefox e Chrome
Sumit Bijvani

3
@SumitBijvani Cosa intendi con "Alla ricerca di risposte migliori"? Migliorerò la mia risposta se mi dicessi quali parti sono sbagliate / non sufficienti.
ComFreek

Risposte:


117

Snippet di codice

Poiché questa risposta ha ricevuto molta attenzione, ecco un bel frammento configurabile che ho creato:

/**
  * @author ComFreek <https://stackoverflow.com/users/603003/comfreek>
  * @link https://stackoverflow.com/a/16069817/603003
  * @license MIT 2013-2015 ComFreek
  * @license[dual licensed] CC BY-SA 3.0 2013-2015 ComFreek
  * You MUST retain this license header!
  */
(function (exports) {
    function valOrFunction(val, ctx, args) {
        if (typeof val == "function") {
            return val.apply(ctx, args);
        } else {
            return val;
        }
    }

    function InvalidInputHelper(input, options) {
        input.setCustomValidity(valOrFunction(options.defaultText, window, [input]));

        function changeOrInput() {
            if (input.value == "") {
                input.setCustomValidity(valOrFunction(options.emptyText, window, [input]));
            } else {
                input.setCustomValidity("");
            }
        }

        function invalid() {
            if (input.value == "") {
                input.setCustomValidity(valOrFunction(options.emptyText, window, [input]));
            } else {
               input.setCustomValidity(valOrFunction(options.invalidText, window, [input]));
            }
        }

        input.addEventListener("change", changeOrInput);
        input.addEventListener("input", changeOrInput);
        input.addEventListener("invalid", invalid);
    }
    exports.InvalidInputHelper = InvalidInputHelper;
})(window);

uso

jsFiddle

<input id="email" type="email" required="required" />
InvalidInputHelper(document.getElementById("email"), {
  defaultText: "Please enter an email address!",

  emptyText: "Please enter an email address!",

  invalidText: function (input) {
    return 'The email address "' + input.value + '" is invalid!';
  }
});

Più dettagli

  • defaultText viene visualizzato inizialmente
  • emptyText viene visualizzato quando l'ingresso è vuoto (è stato cancellato)
  • invalidText viene visualizzato quando l'input è contrassegnato come non valido dal browser (ad esempio quando non è un indirizzo email valido)

È possibile assegnare una stringa o una funzione a ciascuna delle tre proprietà.
Se si assegna una funzione, può accettare un riferimento all'elemento di input (nodo DOM) e deve restituire una stringa che viene quindi visualizzata come messaggio di errore.

Compatibilità

Testato in:

  • Chrome Canary 47.0.2
  • IE 11
  • Microsoft Edge (utilizzando la versione aggiornata al 28/08/2015)
  • Firefox 40.0.3
  • Opera 31.0

Vecchia risposta

Puoi vedere la vecchia revisione qui: https://stackoverflow.com/revisions/16069817/6


1
grazie ... la tua convalida personalizzata per l'email errata funziona ma, per il campo obbligatorio mi mostra il messaggio, please fill out this fieldpuoi modificare questo messaggio inPlease enter email address
Sumit Bijvani

@SumitBijvani Nessun problema, questo comportamento si verifica perché stiamo impostando setCustomValidity()email vuote solo dopo che l' evento di sfocatura è stato attivato una volta, quindi dobbiamo solo chiamarlo anche al caricamento del DOM. Vedi esempio aggiornato / jsFiddle.
ComFreek

@SumitBijvani Ho anche corretto alcuni difetti, guarda i miei commenti sul codice, per favore. Sentiti libero di fare domande;)
ComFreek

1
grazie per jsFiddle aggiornato, le convalide funzionano bene, ma c'è un problema quando inserisco il vero indirizzo e-mail, quindi anche la convalida dice che l'indirizzo e-mail non è valido
Sumit Bijvani

1
Funziona alla grande. Volevo che la funzionalità "richiesta" HTML5 convalidasse anche l'invio di soli caratteri di spazio bianco (mentre per impostazione predefinita si convalida solo contro l'invio di una stringa vuota). Quindi ho cambiato le due righe con if (input.value == "") {, invece di leggere if (input.value.trim() == "") {- fa il trucco per me.
Jaza

56

Puoi semplicemente ottenere questo risultato utilizzando l'attributo oninvalid, controlla questo codice demo

<form>
<input type="email" pattern="[^@]*@[^@]" required oninvalid="this.setCustomValidity('Put  here custom message')"/>
<input type="submit"/>
</form>

inserisci qui la descrizione dell'immagine

Codepen Demo: https://codepen.io/akshaykhale1992/pen/yLNvOqP


13
lol, tutti buttano fuori pagine di codice, sono così pigro e stavo cercando uno in linea, grazie @akshay khale la tua risposta è la migliore.
Dheeraj Thedijje

1
Felice di aiutare @Thedijje
Akshay Khale,

10
Tieni presente che setCustomValidity deve essere reimpostato con qualcosa del tipo oninput="setCustomValidity('')": stackoverflow.com/a/16878766/1729850
Leia

2
Grazie @Leia per aver completato questa risposta. Purtroppo non funziona per i pulsanti di opzione. cioè se si attiva l'invalido su un pulsante, viene aggiunta la stringa personalizzata. Quindi, se fai clic su un pulsante di opzione diverso, non cancellerà la stringa cutomValidity sul primo. Quindi sembra che sarebbe necessario un po 'di javascript per ascoltare e cancellare qualsiasi setCustomValidity su tutti i pulsanti di opzione correlati.
ryan2johnson9

2
Questa dovrebbe essere la risposta accettata. La semplicità è la soluzione migliore.
Keno Clayton

19

HTML:

<form id="myform">
    <input id="email" oninvalid="InvalidMsg(this);" name="email" oninput="InvalidMsg(this);"  type="email" required="required" />
    <input type="submit" />
</form>

JAVASCRIPT:

function InvalidMsg(textbox) {
    if (textbox.value == '') {
        textbox.setCustomValidity('Required email address');
    }
    else if (textbox.validity.typeMismatch){{
        textbox.setCustomValidity('please enter a valid email address');
    }
    else {
       textbox.setCustomValidity('');
    }
    return true;
}

Demo:

http://jsfiddle.net/patelriki13/Sqq8e/


Questo è l'unico che ha funzionato per me. Grazie, Rikin.
Bashar Ghadanfar

Non volevo provare altri approcci avanzati. Questo è stato l'unico semplice che ha funzionato per me per la convalida della posta elettronica. Grazie!
Mycodingproject

16

Prova questo:

$(function() {
    var elements = document.getElementsByName("topicName");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("Please enter Room Topic Title");
        };
    }
})

L'ho testato in Chrome e FF e ha funzionato in entrambi i browser.


1
C'è qualche possibilità di utilizzare contenuto HTML ricco? Sembra supportare solo testo, nessun tag, come <b>Error: </b> Incorrect email address.
Ωmega

Per quanto ne so non è ancora possibile. Puoi modellare il risultato di conseguenza con CSS, ma questo ovviamente ha i suoi limiti e non si applica al tuo caso. In ogni caso, la tecnologia è ancora abbastanza nuova e non ampiamente supportata per la maggior parte, quindi qualunque sia la tua implementazione, a mio parere, per il momento è ancora meglio usare una soluzione alternativa.
Levi Botelho

Diciamo che a volte (dipende da altri input), voglio consentire un valore vuoto di tale campo di input. Come posso disattivare il messaggio di convalida predefinito, quindi? L'assegnazione setCustomValidity("")non aiuta. C'è qualche altro parametro che deve essere impostato? Si prega di avvisare.
Ωmega

8

Amico, non l'ho mai fatto in HTML 5 ma ci proverò. Dai un'occhiata a questo violino.

Ho usato alcuni eventi e proprietà nativi jQuery, HTML5 e un attributo personalizzato sul tag di input (questo potrebbe causare problemi se provi a convalidare il tuo codice). Non l'ho testato in tutti i browser ma penso che possa funzionare.

Questo è il codice JavaScript di convalida del campo con jQuery:

$(document).ready(function()
{
    $('input[required], input[required="required"]').each(function(i, e)
    {
        e.oninput = function(el)
        {
            el.target.setCustomValidity("");

            if (el.target.type == "email")
            {
                if (el.target.validity.patternMismatch)
                {
                    el.target.setCustomValidity("E-mail format invalid.");

                    if (el.target.validity.typeMismatch)
                    {
                         el.target.setCustomValidity("An e-mail address must be given.");
                    }
                }
            }
        };

        e.oninvalid = function(el)
        {
            el.target.setCustomValidity(!el.target.validity.valid ? e.attributes.requiredmessage.value : "");
        };
    });
});

Bello. Ecco il semplice modulo html:

<form method="post" action="" id="validation">
    <input type="text" id="name" name="name" required="required" requiredmessage="Name is required." />
    <input type="email" id="email" name="email" required="required" requiredmessage="A valid E-mail address is required." pattern="^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9]+$" />

    <input type="submit" value="Send it!" />
</form>

L'attributo requiredmessageè l'attributo personalizzato di cui ho parlato. Puoi impostare il tuo messaggio per ogni campo richiesto perché jQuery riceverà da esso quando visualizzerà il messaggio di errore. Non devi impostare ogni campo correttamente su JavaScript, jQuery lo fa per te. Quella regex sembra andare bene (almeno ti blocca testing@.com! Haha)

Come puoi vedere su fiddle, faccio un'ulteriore convalida dell'evento submit form ( questo vale anche per document.ready ):

$("#validation").on("submit", function(e)
{
    for (var i = 0; i < e.target.length; i++)
    {
        if (!e.target[i].validity.valid)
        {
            window.alert(e.target.attributes.requiredmessage.value);
            e.target.focus();
            return false;
        }
    }
});

Spero che questo funzioni o ti aiuti comunque.


Per evitare l'attributo non standard, potresti usare il data-prefisso standard ; ad es data-requiredMessage. Con jQuery, questo è accessibile con $(element).data('requiredMessage'); Non conosco l'interfaccia DOM standard dalla parte superiore della mia testa.
IMSoP

@IMSoP certo, è valido!
DontVoteMeDown

6

Questo funziona bene per me:

jQuery(document).ready(function($) {
    var intputElements = document.getElementsByTagName("INPUT");
    for (var i = 0; i < intputElements.length; i++) {
        intputElements[i].oninvalid = function (e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                if (e.target.name == "email") {
                    e.target.setCustomValidity("Please enter a valid email address.");
                } else {
                    e.target.setCustomValidity("Please enter a password.");
                }
            }
        }
    }
});

e il modulo con cui lo sto usando (troncato):

<form id="welcome-popup-form" action="authentication" method="POST">
    <input type="hidden" name="signup" value="1">
    <input type="email" name="email" id="welcome-email" placeholder="Email" required></div>
    <input type="password" name="passwd" id="welcome-passwd" placeholder="Password" required>
    <input type="submit" id="submitSignup" name="signup" value="SUBMIT" />
</form>

inserisci qui la descrizione dell'immagine


5

Puoi farlo impostando un listener di eventi per "non valido" su tutti gli ingressi dello stesso tipo, o solo uno, a seconda di ciò di cui hai bisogno, e quindi impostando il messaggio corretto.

[].forEach.call( document.querySelectorAll('[type="email"]'), function(emailElement) {
    emailElement.addEventListener('invalid', function() {
        var message = this.value + 'is not a valid email address';
        emailElement.setCustomValidity(message)
    }, false);

    emailElement.addEventListener('input', function() {
        try{emailElement.setCustomValidity('')}catch(e){}
    }, false);
    });

La seconda parte dello script, il messaggio di validità verrà azzerato, altrimenti non sarà possibile inviare il form: questo ad esempio impedisce che il messaggio venga attivato anche quando l'indirizzo email è stato corretto.

Inoltre non è necessario impostare il campo di input come richiesto, poiché "non valido" verrà attivato una volta che inizi a digitare l'input.

Ecco un violino per questo: http://jsfiddle.net/napy84/U4pB7/2/ Spero che aiuti!


5

Usa l'attributo "titolo" in ogni tag di input e scrivi un messaggio su di esso


4

Ho solo bisogno di ottenere l'elemento e utilizzare il metodo setCustomValidity.

Esempio

var foo = document.getElementById('foo');
foo.setCustomValidity(' An error occurred');

3

puoi semplicemente usare l' attributo oninvalid = " , con l'aggiunta di this.setCustomValidity () eventListener!

Ecco i miei codici demo! (Puoi eseguirlo per verificare!) inserisci qui la descrizione dell'immagine

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>oninvalid</title>
</head>
<body>
    <form action="https://www.google.com.hk/webhp?#safe=strict&q=" method="post" >
        <input type="email" placeholder="xgqfrms@email.xyz" required="" autocomplete="" autofocus="" oninvalid="this.setCustomValidity(`This is a customlised invalid warning info!`)">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

link di riferimento

http://caniuse.com/#feat=form-validation

https://www.w3.org/TR/html51/sec-forms.html#sec-constraint-validation


setCustomValidity ()
xgqfrms

1

Puoi aggiungere questo script per mostrare il tuo messaggio.

 <script>
     input = document.getElementById("topicName");

            input.addEventListener('invalid', function (e) {
                if(input.validity.valueMissing)
                {
                    e.target.setCustomValidity("Please enter topic name");
                }
//To Remove the sticky error message at end write


            input.addEventListener('input', function (e) {
                e.target.setCustomValidity('');
            });
        });

</script>

Per altre convalide come la mancata corrispondenza del modello, è possibile aggiungere una condizione if else aggiuntiva

piace

else if (input.validity.patternMismatch) 
{
  e.target.setCustomValidity("Your Message");
}

ci sono altre condizioni di validità come rangeOverflow, rangeUnderflow, stepMismatch, typeMismatch, valid

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.