javascripthtmlformsvalidation

How to set custom validation message for HTML input on mouseenter?


I have an ASP.NET Core project and I'm trying to set custom text for the validation tooltip for the HTML form input field. By default, it shows "Please fill out this field". I tried to add event listeners for input, change and mouseenter events like this.

<!DOCTYPE html>
<html>
<body>
    <form>
        <label for="field1">Field1:</label>
        <input id="field1" type="text" class="validate" data-error-message="You must fill in field1!" required
               oninput="this.setCustomValidity('');this.reportValidity()" onchange="validateInputElement(this)" onmouseenter="validateInputElement(this)" />
        <label for="field2">Field1:</label>
        <input id="field2" type="text" class="validate" data-error-message="You forgot to fill in field2!" required
               oninput="this.setCustomValidity('');this.reportValidity()" onchange="validateInputElement(this)" onmouseenter="validateInputElement(this)" />
    </form>
    <script>
        function validateInputElement(element)
        {
            let validationMessage = "";
            if(element.validity !== ValidityState.valid)
            {
                validationMessage = element.dataset["errorMessage"];
            }
            else if(document.querySelector("input#field1")?.value === document.querySelector("input#field2")?.value)
            {
                validationMessage = "You must enter different values!"
            }
            element.setCustomValidity(validationMessage);
            element.reportValidity();
        }
    </script>
</body>
</html>

In this case, my custom validation messages are displayed, but the default validation messages are also displayed. How to disable default validation messages?

Solved

by adding form attribute "novalidate" and change validation function code from
if(element.validity !== ValidityState.valid)

to

if(!element.validity.valid)

The resulting code snippet is

<!DOCTYPE html>
<html>
<body>
    <form novalidate>
        <label for="field1">Field1:</label>
        <input id="field1" type="text" class="validate" data-error-message="You must fill in field1!" required
               oninput="this.setCustomValidity('');this.reportValidity()" onchange="validateInputElement(this)" onmouseenter="validateInputElement(this)" />
        <label for="field2">Field1:</label>
        <input id="field2" type="text" class="validate" data-error-message="You forgot to fill in field2!" required
               oninput="this.setCustomValidity('');this.reportValidity()" onchange="validateInputElement(this)" onmouseenter="validateInputElement(this)" />
    </form>
    <script>
        function validateInputElement(element)
        {
            let validationMessage = "";
            if(!element.validity.valid)
            {
                validationMessage = element.dataset["errorMessage"];
            }
            else if(document.querySelector("input#field1")?.value === document.querySelector("input#field2")?.value)
            {
                validationMessage = "You must enter different values!"
            }
            element.setCustomValidity(validationMessage);
            element.reportValidity();
        }
    </script>
</body>
</html>

But I also want that invalid field is not automatically receive focus on moseenter.


Solution

  • If I understand your question I assume you want to remove the browser validation that show tooltip with the text "Please fill out this field".

    In this case you just need to add the "novalidate" attribute to the form.

    <!DOCTYPE html>
    <html>
    <body>
        <form novalidate>
            <label for="field1">Field1:</label>
            <input id="field1" type="text" class="validate" data-error-message="You must fill in field1!" required
                   oninput="this.setCustomValidity('');this.reportValidity()" onchange="validateInputElement(this)" onmouseenter="validateInputElement(this)" />
            <label for="field2">Field1:</label>
            <input id="field2" type="text" class="validate" data-error-message="You forgot to fill in field2!" required
                   oninput="this.setCustomValidity('');this.reportValidity()" onchange="validateInputElement(this)" onmouseenter="validateInputElement(this)" />
        </form>
        <script>
            function validateInputElement(element)
            {
                let validationMessage = "";
                if(element.validity !== ValidityState.valid)
                {
                    validationMessage = element.dataset["errorMessage"];
                }
                else if(document.querySelector("input#field1")?.value === document.querySelector("input#field2")?.value)
                {
                    validationMessage = "You must enter different values!"
                }
                element.setCustomValidity(validationMessage);
                element.reportValidity();
            }
        </script>
    </body>
    </html>