setCustomValidity()
функция не используется для обозначения поля недействительным, оно используется для хранения пользовательского сообщения, которые позже будут отображаться если поле помечено как недействительное. В коде вы вызываете функцию setCustomValidity()
внутри обработчика проверки, который не вызывается до тех пор, пока не будет нажата кнопка отправки. Вот почему он появляется во второй раз, но не первый: потому что сообщение о действительности применяется после первого представления.
Вместо этого вы должны позвонить функции setCustomValidity()
перед отправкой формы. Вы можете просто вызвать его при загрузке страницы. Ниже приведен модифицированный рабочий код. Если вы хотите иметь больше возможностей управления, вы также можете вызвать его из обработчика события onchange
, чтобы вы могли вставлять логику, которая запускается всякий раз, когда содержимое поля обновляется.
var form = document.getElementById("form");
var field = document.getElementById("field");
form.onsubmit = validateForm;
/* specify the message that will be displayed if the field is marked invalid */
field.setCustomValidity("Field must be a number.");
/* this is the function that actually marks the field as valid or invalid */
function validateForm() {
if (!isNaN(field.value)) {
return true;
}
return false;
}
<form id="form">
<label for="field">Favorite number</label>
<input type="text" id="field" required />
<input type="submit" />
</form>
jsFiddle Version
Как и в сторону, что вы делаете на самом деле может быть достигнуто на всех современных браузерах без использования JavaScript, используя HTML5 pattern attribute. Этот атрибут принимает регулярное выражение, и браузер использует его для обозначения содержимого поля как действительного или недействительного.
Вот что сеть в Mozilla разработчика должен сказать об атрибуте шаблона:
Pattern: Регулярное выражение, значение элемента управления сверяется. Шаблон должен соответствовать всему значению, а не только некоторому подмножеству. Используйте атрибут title, чтобы описать шаблон, чтобы помочь пользователю. Этот атрибут применяется, когда значением атрибута type является текст, поиск, tel, url или электронная почта; в противном случае он игнорируется. Язык регулярных выражений совпадает с языком JavaScript. Шаблон не окружен прямыми косыми чертами.
Преимущественно это также дает прямую обратную связь относительно действительности, без необходимости представлять форму, благодаря псевдоклассам CSS. Вы можете даже использовать атрибут HTML title
, чтобы установить собственное сообщение об ошибке.
Ниже вы можете увидеть пример формы, которая принимает только цифры без использования JavaScript. Если ничего другого, это хороший способ обеспечить надежный откат для любого, у кого отключен Javascript, и он помогает с доступностью, потому что гораздо проще для программного обеспечения для скрипта или программного обеспечения для сбора полезной информации из регулярного выражения, чем от пользователя -подписанная функция проверки.
input[type="text"]:invalid {
background-color: red;
}
input[type="text"]:valid {
background-color: green;
}
<form id="form">
<label for="field">Favorite number</label>
<input type="text" id="field" pattern="\d*" title="Field must be a number." required />
<input type="submit" />
</form>
Твердый ответ. Однако, что, если вы хотите иметь настраиваемый обмен сообщениями на основе конкретной проблемы, с которой сталкивается пользователь? Например, если это был номер телефона, и поле было 7 цифр, сообщение могло бы быть «Пожалуйста, введите код города». или что-то в этом роде. – Jason
@Jason В этом случае вы, вероятно, захотите поместить некоторую логику в обработчик события onchange, который будет запускаться каждый раз, когда содержимое поля изменяется. –
http://stackoverflow.com/questions/13798313/set-custom-html5-required-field-validation-message – Jason