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