HTML5 форма обязательный атрибут. Установить пользовательское сообщение проверки?

193

У меня есть следующая форма HTML5: http://jsfiddle.net/nfgfP/

<form id="form" onsubmit="return(login())">
<input name="username" placeholder="Username" required />
<input name="pass"  type="password" placeholder="Password" required/>
<br/>Remember me: <input type="checkbox" name="remember" value="true" /><br/>
<input type="submit" name="submit" value="Log In"/>

В настоящее время, когда я нажимаю кнопку ввода, когда оба они пусты, появляется всплывающее окно с сообщением "Пожалуйста, заполните это поле". Как изменить это сообщение по умолчанию на "Это поле не может быть пустым"?

EDIT: Также обратите внимание, что сообщение об ошибке поля типа пароля просто *****. Чтобы воссоздать это, введите имя пользователя и нажмите submit.

EDIT. Я использую Chrome 10 для тестирования. Пожалуйста, сделайте то же самое

  • 0
    О, +1 за безумное сообщение проверки пустого пароля = / Как это прошло QA, интересно ...
  • 2
    Почему бы просто не принять сообщение браузера по умолчанию? Это то, что пользователи видят для каждого другого сайта, который они посещают, вы просто запутаете своих пользователей, создав нестандартное сообщение. (Google, вероятно, справился с большей оценкой и тестированием UX при определении этой формулировки, чем вы!).
Показать ещё 2 комментария
Теги:
validation
forms

11 ответов

164
Лучший ответ

Используйте setCustomValidity:

document.addEventListener("DOMContentLoaded", function() {
    var elements = document.getElementsByTagName("INPUT");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                e.target.setCustomValidity("This field cannot be left blank");
            }
        };
        elements[i].oninput = function(e) {
            e.target.setCustomValidity("");
        };
    }
})

I изменен на ванильный JavaScript из Mootools, как предлагается @itpastorn в комментарии, но при необходимости вы сможете при необходимости выработать эквивалент Mootools.

Изменить

Я обновил код здесь, так как setCustomValidity работает несколько иначе, чем я понял, когда я изначально ответил. Если для параметра setCustomValidity установлено значение, отличное от пустой, это приведет к тому, что поле будет считаться недействительным; поэтому вы должны очистить его до проверки действительности, вы не можете просто установить его и забыть.

Далее отредактируйте

Как указано в комментарии @thomasvdb ниже, вам нужно очистить пользовательскую достоверность в некотором событии вне invalid, иначе может быть дополнительный проход через обработчик oninvalid, чтобы его очистить.

  • 0
    Я пробовал это, но все еще есть ошибка. Если вы оставите поле пустым, оно показывает сообщение, затем введите что-то в поле, но теперь оно показывает пустое сообщение и действие не выполняется. Если вы сейчас нажмете кнопку еще раз, она пройдет.
  • 1
    @thomasvdb Попробуйте установить пользовательскую достоверность для пустой строки в событии input . На данный момент он очищается только в случае invalid события.
Показать ещё 7 комментариев
115

Вот код для обработки пользовательского сообщения об ошибке в HTML5

<input type="text" id="username" required placeholder="Enter Name"
    oninvalid="this.setCustomValidity('Enter User Name Here')"
    oninput="setCustomValidity('')"  />

Это самая важная часть:

    oninput="setCustomValidity('')"
  • 0
    Отлично работает на Firefox 29.0 и Chrome 34.0.1847.137.
  • 0
    отлично и в FF 38 пока что. Исправляет ошибку в проверке электронной почты, если используется только oninvalid ().
Показать ещё 5 комментариев
79

Очень просто управлять настраиваемыми сообщениями с помощью HTML5 event oninvalid

Вот код:

<input id="UserID"  type="text" required="required"
       oninvalid="this.setCustomValidity('Witinnovation')">
  • 3
    Также проверьте другие проверки, такие как шаблон, минимальные / максимальные значения и т. Д. Sanalksankar.blogspot.com/2010/12/…
  • 10
    Это приводит к ошибке в Firefox, когда он проверяется при обновлении, но не дает изменений и исправлений.
Показать ещё 3 комментария
63

Примечание.. Это больше не работает в Chrome, а не проверяется в других браузерах. См. Правки ниже. Этот ответ остается здесь для исторической справки.

Если вы считаете, что строка проверки действительно не должна быть задана кодом, вы можете установить атрибут заголовка элемента ввода для чтения: "Это поле не может быть пустым". (Работает в Chrome 10)

title="This field should not be left blank."

См. http://jsfiddle.net/kaleb/nfgfP/8/

И в Firefox вы можете добавить этот атрибут:

x-moz-errormessage="This field should not be left blank."

Изменить

Это, похоже, изменилось с тех пор, как я изначально написал этот ответ. Теперь добавление заголовка не изменяет сообщение о действительности, оно просто добавляет добавление к сообщению. Эта скрипка все еще применяется.

Изменить 2

Chrome теперь ничего не делает с атрибутом title как на Chrome 51. Я не уверен, в какой версии это изменилось.

  • 1
    Это не меняет фактическое содержание сообщения.
  • 2
    На момент тестирования я это сделал.
Показать ещё 6 комментариев
31

Я создал небольшую библиотеку, чтобы облегчить изменение и перевод сообщений об ошибках. Вы даже можете изменить текст по типу ошибки, который в настоящее время недоступен с помощью title в Chrome или x-moz-errormessage в Firefox. Go проверить его на GitHub и дать отзыв.

Он используется как:

<input type="email" required data-errormessage-value-missing="Please input something">

Там есть демон в jsFiddle.

  • 0
    Спасибо! Решил мою небольшую ошибку, упомянутую в качестве комментария в принятом ответе.
  • 0
    Здорово слышать!
Показать ещё 1 комментарий
28

Очень просто управлять настраиваемыми сообщениями с помощью события HTML5 oninvalid

Вот код:

User ID 
<input id="UserID"  type="text" required 
       oninvalid="this.setCustomValidity('User ID is a must')">
  • 2
    необходимо установить пустое сообщение о достоверности после того, как элемент управления обнаружит ввод, иначе для всех полей будет отображаться первое выполненное сообщение о достоверности. Добавляйте oninput = "setCustomValidity ('')" при каждом вызове setCustomValidity (). +1 к ответу Сомнатха.
25

Установив и отменив setCustomValidity в нужное время, сообщение проверки будет работать безупречно.

<input name="Username" required 
oninvalid="this.setCustomValidity('Username cannot be empty.')" 
onchange="this.setCustomValidity('')" type="text" />

Я использовал onchange вместо oninput, который является более общим и возникает, когда значение изменяется в любом состоянии даже через JavaScript.

  • 0
    Это должен быть принятый ответ. Работал в Windows 10 1709 в следующих браузерах: Chrome 66.0.3359.139 64 бит, Firefox 59.0.3 (64 бит), Internet Explorer 11.431.16299.0, Edge 41.16299.402.0. Работал в macOS 10.13.2 в Safari 11.0 (13604.1.38.1.6). Работал в Android 4.4.4 в Chrome 66.0.3359.158. Для тех, кто ищет способ JSX: onInvalid={(e) => { e.target.setCustomValidity('foo') }} onChange={(e) => { e.target.setCustomValidity('') }} .
  • 0
    Приложение: e может быть нулевым, например, когда опция удалена из поля React Select. Не забудьте проверить это.
Показать ещё 2 комментария
13

Попробуйте это, лучше и протестируйте:

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

Демо:

http://jsfiddle.net/patelriki13/Sqq8e/

  • 0
    эй .... хорошее решение, но type = email не работает в браузере Safari. посмотрите w3schools.com/html/html_form_input_types.asp
  • 1
    Да, это не поддерживается для сафари, но я дал ответ на заданное пользовательское сообщение проверки.
9

Самый простой и самый чистый способ, который я нашел, - использовать атрибут data для хранения вашей пользовательской ошибки. Проверьте работоспособность node и обработайте ошибку, используя какой-то пользовательский html. Изображение 5036

le javascript

if(node.validity.patternMismatch)
        {
            message = node.dataset.patternError;
        }

и некоторый супер HTML5

<input type="text" id="city" name="city" data-pattern-error="Please use only letters for your city." pattern="[A-z ']*" required>
  • 3
    Несмотря на ошибку, говоря только буквы, шаблон допускает пробел и апостроф? Кроме того, Az допускает '[', '\', ']', '^', '_' и '`'.
2

Это очень простое управление требуемым сообщением типа ввода HTML. Нет необходимости в JS или CSS использовать HTML5.

Сначала вы можете использовать этот атрибут "oninvalid"

<input id="userid" type="text or others" required="" oninvalid="this.setCustomValidity('Hello Username cant be Blank!')">

Или вы можете использовать атрибут "oninput"

<input id="userid" type="text or others" required="" oninvalid="this.setCustomValidity('Hello Username cant be Blank!')" oninput="setCustomValidity('')">
  • 13
    Просто чтобы быть ясно, что это буквально JS :)
1

У меня есть более простое решение ванили js:

Для флажков:

document.getElementById("id").oninvalid = function () {
    this.setCustomValidity(this.checked ? '' : 'My message');
};

Для входов:

document.getElementById("id").oninvalid = function () {
    this.setCustomValidity(this.value ? '' : 'My message');
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню