it-swarm.com.ru

Используя плагин проверки jQuery: onfocusout, onkeyup не работает, как и ожидалось, на производственном сайте

Я использую плагин jQuery Validate v.1.9.0, он работает очень хорошо. Но я сталкиваюсь с этой проблемой, как только пользователь отправляет форму и, если есть какие-либо ошибки, он правильно отображает сообщение об ошибке. Проблема в том, что он не обновляет сообщение, если пользователь предпринимает действия по исправлению этой ошибки. Например. если поле является обязательным, при первом получении сообщения пользователь начинает печатать, то это сообщение должно исчезнуть. 

В документах упоминается, что onfocusout & onkeyup используются для этой цели и по умолчанию они установлены в true. Самое смешное, что, похоже, он работает на моей локальной рабочей станции, но не работает (тихо), когда я загружаю свой код на рабочий сайт. Я подумал, что по-королевски все испортил, поэтому запустил jsfiddle и вставил соответствующий код, чтобы посмотреть, происходит ли это и там.

Я был поражен, увидев, что это происходит и там. Поэтому мой вопрос: почему он работает на моей локальной машине, а не на производственных площадках?

Постскриптум Автономный пример на http://jsfiddle.net/tankchintan/cge44/5/

ОБНОВЛЕНИЕ

Чтобы повторить проблему, сделайте -

  1. Перейдите на страницу jsfiddle.
  2. Без заполнения каких-либо полей нажмите кнопку отправить форму.
  3. Он покажет сообщение об ошибке, кроме каждого поля.
  4. Теперь начните вводить текст в любом из полей.
  5. Вы заметите, что сообщение об ошибке не исчезает, даже если правило выполнено. На моей локальной машине эта ошибка исчезает, когда я что-то набираю в поле.
17
Chantz

Эта проблема существует даже в некоторых примерах на веб-сайте JQuery.

Я обнаружил, что проблема возникает, когда элемент ввода не имеет типа. Веб-браузеры предполагают, что типом является «текст», если он не указан, но с этим связана проблема jquery.validate. Ваш элемент ввода должен выглядеть так:

<input id="cname" name="name" type="text" class="required" minlength="2" />
16
nuander

Используйте это вместо этого!

onkeyup: function(element) { $(element).valid(); },
onfocusout: function(element) { $(element).valid(); },
28
user1893029

Очевидно, это не сработает, если ваша библиотека jQuery слишком новая. Я испытывал то же самое, откат от jquery v1.7.2 до v1.3.2 устранил проблему. 

Страница примера в http://jquery.bassistance.de/validate/demo/ использует 1.3.2, но я не уверен, в какой именно версии jquery произошла эта поломка.

2
Sam Barnum

Следующие работы для меня:

$(document).ready(function () {
        $("#myFormElement").submit(function (event) {
            var validator = $.data($('form')[0], 'validator');
            validator.settings.onfocusout = function (element) { $(element).valid(); };
            validator.settings.onkeyup = function (element) { $(element).valid(); };
        });

        var validator = $.data($('form')[0], 'validator');
        validator.settings.onfocusout = false;
        validator.settings.onkeyup = false;
    });

Это отключает начальную проверку onkeyup. Если пользователь затем нажимает кнопку «Отправить», мы снова включаем проверку, чтобы после того, как поле стало действительным, ему/ей немедленно давали обратную связь.

Я не уверен, почему эти свойства изначально логические, а затем обратные вызовы для события submit. Я только нашел метод, установив для свойств значение true в событии submit, что вызвало исключение в библиотеке валидации (при попытке вызвать функцию вызова).

2
mixja

Я думаю, что поведение по умолчанию - скрывать это сообщение только тогда, когда поле проверяется, например. «Пожалуйста, введите действительный адрес электронной почты» исчезает после ввода «[email protected]», что, я думаю, имеет смысл.

Смотрите демонстрации: http://jquery.bassistance.de/validate/demo/

Я думаю, что вы, возможно, пытаетесь сделать что-то похожее на это: jquery validate: focusCleanup: true и focusInvalid: false не работают должным образом

0
agtb