title добавляется к предупреждению шаблона. Просто помните, что предупреждения переведены на язык браузера, что может сделать английскую строку странной.
Это единственный способ полностью заменить предупреждение:
/**
* Shows a custom validity message
* @param e - event
*/
function invalid(e) {
if (!/PATTERN/.test(e.target.value)) { // somehow validity.valid returns a wrong value
e.target.setCustomValidity('INVALID')
} else {
e.target.setCustomValidity('')
}
}
Как только форма проверена, предупреждение продолжает появляться, пока значение не соответствует шаблону. Если событие input просто устанавливает setCustomValidity('') как предлагается в большинстве других ответов, возвращается предупреждение по умолчанию.