Event Listener действителен для форм HTML5

  • В новом HTML5 есть "недопустимое" событие, к которому вы можете добавить слушателя:

    document.addEventListener('invalid', function(e){
       var element = $(e.target);
       element.addClass("invalid");
       element.parent().addClass("invalid");
    }, true);
    

    Обратите внимание, что это событие работает только при отправке формы... Если я стиль ввода input:invalid { background: red }, стиль применяется, когда пользователь начинает печатать, а его ввод недействителен. Это событие только уволили? Я попытался добавить слушателя к самим входам, а не к документу, и это не сработало.

  • Я добавляю слушателя, чтобы применить стиль к родительскому элементу ввода... Теперь, когда пользователь исправляет его, он снова действует снова... Я знаю, что там нет "действительного" события, поэтому, как могу ли я его выполнить?


Итак, вот скрипка → http://jsfiddle.net/Osoascam/ceArQ/7/ Недействительный прослушиватель, кажется, только уволен на submit... Я просто хотел узнать, есть ли способ добавить обработчик, как и для фокуса. Посмотрите, что если вы наберете

Спасибо заранее,

Óscar

Ответы

Ответ 1

Чтобы решить вашу проблему, вы должны использовать: недопустимый псевдо-селектор и вход или событие изменения.

$(document).bind('change', function(e){
    if( $(e.target).is(':invalid') ){
        $(e.target).parent().addClass('invalid');
    } else {
        $(e.target).parent().removeClass('invalid');
    }
});

Вот простая скрипка http://jsfiddle.net/trixta/YndYx/.

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

И вот скрипка, использующая смесь ввода и события изменения: http://jsfiddle.net/trixta/jkQEX/

И если вы хотите иметь этот кросс-браузер, вы можете просто использовать webshims lib до polyfill. Вот пример x-браузера: http://jsfiddle.net/trixta/RN8PA/

Ответ 2

Поскольку эти классы всегда добавляются при отправке формы, удалите класс, предшествующий проверке:

$('#myForm').submit(function(){
    $('.invalid', this).removeClass('invalid'); // Remove all invalid classes
    $(this).removeClass('invalid');             // If the parent = form.
    // Normal validation procedure.
});

Ожидаемый результат:

  • Пользователь инициирует submit
  • onsubmit запускается > Все имена классов invalid в форме удаляются.
  • События invalid запускаются, а классы invalid добавляются при необходимости

Update

Добавлен дополнительный блок для вашей скрипки, см. обновленный скрипт: http://jsfiddle.net/ceArQ/10/. Я применил метод checkValidity() и свойство validity.valid. Теперь классы автоматически добавляются, когда вход недействителен.

document.addEventListener('keyup', function(e){
    var input = e.target;
    if (!$.nodeName(input, 'input')) return;
    input.checkValidity();
    var element = $(input).parent();
    if(input.validity.valid) {
        element.removeClass('invalid');
        element.parent().removeClass('invalid');
    } else { //Remove the lines below if you don't want to automatically add
             // classes when they're invalid.
        element.addClass('invalid');
        element.parent().removeClass('invalid');
    }
});

В режиме проверки ключа проверяется достоверность входного элемента. Если он действителен, класс invalid удаляется из родительского элемента.

Ответ 3

Вы можете привязать логику проверки к событиям focus и blur или быть более отзывчивыми к событию keyup.

$('input').keyup(function() {
    if(isValid(this)) {
        $(this).removeClass('invalid').parent().removeClass('invalid');
        $(this).addClass('valid').parent().addClass('invalid');
    }
    else {
        $(this).removeClass('valid').parent().removeClass('valid');
        $(this).addClass('invalid').parent().addClass('invalid');
    }
});

Ответ 4

Пробовали ли вы использовать :valid, чтобы указать, действительно ли поле. и имеющие недопустимые формы, просто сохраняйте свой стиль по умолчанию.

Затем вызов form.checkValidity() в обработчике отправки? (Браузер должен сообщить конечному пользователю, что элемент формы недействителен).