ChatGPT解决这个技术问题 Extra ChatGPT

Set custom HTML5 required field validation message

Required field custom validation

I have one form with many input fields. I have put html5 validations

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

when I submit the form without filling this textbox it shows default message like

"Please fill out this field"

Can anyone please help me to edit this message?

I have a javascript code to edit it, but it's not working

$(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 custom validations

I have following HTML form

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

Validation messages I want like.

Required field: Please Enter Email Address Wrong Email: 'testing@.com' is not a Valid Email Address. (here, entered email address displayed in textbox)

I have tried this.

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

This function is not working properly, Do you have any other way to do this? It would be appreciated.

What do you mean 'not working'? Is it giving an error? Open Chrome's developer tools or Firefox's Firebug and see if there's a JavaScript error.
is there any other way to do this?
Can you post more code? What you have posted isn't enough to help you. And what browser(s) are you testing this in?
@LeviBotelho I have posted whole code, and I am testing this in Firefox and chrome
@SumitBijvani What do you mean by 'Looking for more better answers'? I'll improve my answer if you would tell me what parts are wrong / not sufficient.

C
Community

Code snippet

Since this answer got very much attention, here is a nice configurable snippet I came up with:

/**
  * @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);

Usage

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!';
  }
});

More details

defaultText is displayed initially

emptyText is displayed when the input is empty (was cleared)

invalidText is displayed when the input is marked as invalid by the browser (for example when it's not a valid email address)

You can either assign a string or a function to each of the three properties. If you assign a function, it can accept a reference to the input element (DOM node) and it must return a string which is then displayed as the error message.

Compatibility

Tested in:

Chrome Canary 47.0.2

IE 11

Microsoft Edge (using the up-to-date version as of 28/08/2015)

Firefox 40.0.3

Opera 31.0

Old answer

You can see the old revision here: https://stackoverflow.com/revisions/16069817/6


thanks... your custom validation for wrong email is working but, for required field it show me message please fill out this field can you change this message to Please enter email address
@SumitBijvani No problem, that behaviour occurs because we're setting setCustomValidity() for empty emails only after the blur event has fired once thus we just need to call it at DOM loading, too. See updated example/jsFiddle.
@SumitBijvani I've also fixed some flaws, see my code comments, please. Feel free to ask questions ;)
thanks for updated jsFiddle, validations are working fine, but there is one problem when I enter real email address, then also validation says, email address is invalid
This works great. I wanted the HTML5 "required" functionality to also validate against only whitespace chars being submitted (whereas by default it only validates against an empty string being submitted). So I changed the two lines with if (input.value == "") {, to instead read if (input.value.trim() == "") { - does the trick for me.
A
Akshay Khale

You can simply achieve this using oninvalid attribute, checkout this demo code

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

https://i.stack.imgur.com/eVzpj.png

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


lol, everyone throwing out pages of code, i am so lazy and i was looking for inline one, thanks @akshay khale your answer is best one.
Happy to help @Thedijje
Please keep in mind that setCustomValidity has to be reset with something like oninput="setCustomValidity('')": stackoverflow.com/a/16878766/1729850
Thanks @Leia for completing this answer. Unfortunately does not work for radio buttons. i.e if you trigger the invalid on one button, the custom string is added. Then if you click a different radio button, it will not clear the cutomValidity string on the first one. So looks like some javascript would be needed to listen and clear any setCustomValidity over all related radio buttons.
This should be the accepted answer. Simplicity is the best solution.
R
Rikin Patel

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/


This is the only one that worked for me. Thanks, Rikin.
I didn't want to try other advanced approaches. This was the only simple one that has worked for me for email validation. Thanks!
L
Levi Botelho

Try this:

$(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");
        };
    }
})

I tested this in Chrome and FF and it worked in both browsers.


Any chance to use rich HTML content? It seems to support only text, no tags, such as <b>Error: </b> Incorrect email address.
As far as I know it isn't yet possible. You can style the result accordingly with CSS, but that of course has its limits and doesn't apply to your case. At any rate, the technology is still fairly new and not widely-supported enough for most, so whatever your implementation in my opinion you are still better off using an alternative solution for the time being.
Let's say sometimes (depends on other inputs), I want to allow empty value of such input field. How can I turn off default validation message then? Assigning setCustomValidity("") does not help. Is there some other parameter that needs to be set? Please advise.
D
DontVoteMeDown

Man, I never have done that in HTML 5 but I'll try. Take a look on this fiddle.

I have used some jQuery, HTML5 native events and properties and a custom attribute on input tag(this may cause problem if you try to validade your code). I didn't tested in all browsers but I think it may work.

This is the field validation JavaScript code with 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 : "");
        };
    });
});

Nice. Here is the simple form 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>

The attribute requiredmessage is the custom attribute I talked about. You can set your message for each required field there cause jQuery will get from it when it will display the error message. You don't have to set each field right on JavaScript, jQuery does it for you. That regex seems to be fine(at least it block your testing@.com! haha)

As you can see on fiddle, I make an extra validation of submit form event(this goes on document.ready too):

$("#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;
        }
    }
});

I hope this works or helps you in anyway.


To avoid the non-standard attribute, you could use the standard data- prefix; e.g. data-requiredMessage. With jQuery, this is accessible with $(element).data('requiredMessage'); I don't know the standard DOM interface off the top of my head.
@IMSoP sure, it is valid!
d
davidcondrey

This works well for 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.");
                }
            }
        }
    }
});

and the form I'm using it with (truncated):

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

https://i.stack.imgur.com/LuZNf.jpg


M
Mimo

You can do this setting up an event listener for the 'invalid' across all the inputs of the same type, or just one, depending on what you need, and then setting up the proper message.

[].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);
    });

The second piece of the script, the validity message will be reset, since otherwise won't be possible to submit the form: for example this prevent the message to be triggered even when the email address has been corrected.

Also you don't have to set up the input field as required, since the 'invalid' will be triggered once you start typing in the input.

Here is a fiddle for that: http://jsfiddle.net/napy84/U4pB7/2/ Hope that helps!


e
eduardo a

Use the attribute "title" in every input tag and write a message on it


L
LuisRBarreras

Just need to get the element and use the method setCustomValidity.

Example

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

x
xgqfrms

you can just simply using the oninvalid=" attribute, with the bingding the this.setCustomValidity() eventListener!

https://i.stack.imgur.com/HC694.gif

oninvalid

reference link

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

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


setCustomValidity()
E
Engineer

You can add this script for showing your own message.

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

For other validation like pattern mismatch you can add addtional if else condition

like

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

there are other validity conditions like rangeOverflow,rangeUnderflow,stepMismatch,typeMismatch,valid