Почему мой атрибут "oninvalid" допускает сбой шаблона?

Это небольшое поле пароля HTML5 отлично работает БЕЗ атрибута oninvalid (шаблон говорит: минимум 6 символов):

<form>
    <input type="password" name="user_password_new" pattern=".{6,}" required />      
    <input type="submit"  name="register" value="Register" />
</form>

Смотрите jsFiddle здесь.

Но когда я добавляю атрибут oninvalid, который выдает собственное сообщение об ошибке, когда пользовательский ввод не соответствует шаблону, все поле NEVER становится действительным, см. здесь код:

<form>
    <input type="password" name="user_password_new" pattern=".{6,}" oninvalid="setCustomValidity('Minimum length is 6 characters')" required />      
    <input type="submit"  name="register" value="Register" />
</form>

Смотрите jsFiddle здесь.

Вы можете определить ошибку?

Ответ 1

Если вы установите значение с помощью setCustomValidity(), то это поле недействительно. То есть установка ненулевой длины приводит к тому, что браузер считает поле недопустимым. Чтобы разрешить любые другие проверки, вы должны очистить пользовательскую достоверность:

<input type="password" name="user_password_new" pattern=".{6,}" required
   oninvalid="setCustomValidity('Minimum length is 6 characters')" 
   oninput="setCustomValidity('')" />

Ответ 2

Поскольку я наткнулся на ту же проблему, вот мое решение - протестировано и работает с FF, Chrome, IE 10, Edge (февраль 2017).

<form>
<input pattern="1234" oninput="setCustomValidity(''); checkValidity(); setCustomValidity(validity.valid ? '' :'please enter 1234');">
<input type="email" required>
<input type="submit">
</form>

Ответ 3

Мне нравится использовать вот так:

<input type="email" name="Email" required oninvalid="setCustomValidity('ErrorMessage')"/>

И отключен для всех допустимых входных данных

UPD, еще одна вещь для лучшей работы:

    $("input").attr("onblur", "setCustomValidity('')");
    $("input").attr("oninput", "setCustomValidity(' ')");

Ответ 4

Вы можете использовать title, пока вы не возражаете против 'You must use this format:' перед своим сообщением. Если вы хотите получить полное пользовательское сообщение, setCustomValidity() работал у меня.

Ответ 5

Хотя ответы на этот вопрос имели хорошую информацию, их было недостаточно для моих нужд. Мне нужно отображать разные сообщения в зависимости от того, какое правило допустимости не удалось. В других примерах одно и то же сообщение об ошибке проверки используется для всех отказов валидации.

Свойство "validity" объекта формы содержит ключ к созданию более одного сообщения об ошибке проверки.

Вы можете просмотреть все свойства свойства "действительность" на этом веб-сайте.

https://www.w3schools.com/js/js_validation_api.asp

В этом примере показано, как отображать два разных сообщения проверки. Если вы раскомментируете приведенную ниже строку console.log(), вы можете посмотреть изменение свойства действительности при вводе в поле.

<label for="user_password_new">New Password:</label>
<input type="password" name="user_password_new" id="user_password_new"
    pattern=".{6,}"
    value=""
    required
    oninput="
        setCustomValidity('');
        checkValidity();
        // console.log(validity);
        if (validity.patternMismatch) {
            setCustomValidity('Please enter at least six characters.');
        }
        else if (validity.valueMissing) {
            setCustomValidity('This field is required.');
        }
        else if (validity.valid) {
            setCustomValidity('');
        }
        // allow default validation message to appear for other validation failures
    "
>

ПРИМЕЧАНИЕ. Некоторые проверки действительности относятся к типу. Например, атрибуты "rangeOverflow", "rangeUnderflow" и "stepMismatch" устанавливаются, если тип использует их; TYPE = "число".