Подтвердить что ты не робот

JqueryUI datepicker запускает размытие ввода перед датой передачи, избегает/обходится?

У меня есть проверка на ввод текста, связанная с его событием размытия. У меня есть datepicker в этом поле (версия из jqueryUI), поэтому, когда вы нажимаете на это поле, отображается датапикер, затем вы нажимаете дату и заполняете дату в поле, как это делает datepicker. Однако, до ввода даты, кажется, что поле ввода получает свое размытие по какой-либо причине. Похоже, фокус уходит от ввода до того, как дата заселяется. Таким образом, моя проверка активируется прямо в тот момент, когда пользователь выбирает дату, прежде чем дата действительно пробивается в поле, когда это не должно. Он должен работать после того, как дата будет введена. Кто-нибудь знает, почему размытие происходит в этот момент или как его обойти?

4b9b3361

Ответ 1

Когда пользователь щелкает за пределами поля ввода (для выбора даты), поле ввода будет размыто. Нет. Таким образом, вместо запуска проверки на размытие используйте datepicker onSelect callback.

$('.selector').datepicker({
    onSelect: function(dateText) { /* validation here */ }
});

Если вы хотите сохранить свои onblur-события, вы можете отложить проверку, чтобы позволить datepicker заполнить поле до запуска проверки, например:

$('#myform input').blur(function () {
    setTimeout(function () { /* validation here */ }, 1);
});

Использование setTimeout для обработки concurrency -элементов может выглядеть как взломанный, но из-за однопоточной природы JavaScripts он работает очень хорошо. Джон Ресиг из jQuery-славы рассказывает об этом в этом blogpost.

Ответ 2

Я нашел единственный способ последовательно получать как клавиатуру, так и команды выбора выбора, работающие со следующим кодом:

 $(".date-picker")
            .datepicker("option", "onSelect", function (dateText, inst) {
                // User Method
            })
            .change(function () {
                // User Method
            });

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

Ответ 3

Вы можете попробовать следующее:

$(".date-pick").datepicker({
...
onSelect: function() {
this.focus();
},
onClose: function() {
this.blur();
}
...

Ответ 4

Магнарс отвечает выше, очень хорошо. Просто для того, чтобы дать дополнительную информацию для потомков, здесь также подход, который хорошо работает с фреймворками валидации, которые делают проверку на размытие. Я фактически отменяю событие blur, которое было настроено с помощью проверки на document.ready/pageload (довольно распространенный шаблон для проверки), а затем вернул его в параметр onclose datepicker. Событие закрытия datepicker, по-видимому, происходит после того, как datepicker передал информацию в поле, так что это нормально для проверки размытости, выполняемой в этой точке. Таким образом, я не должен делать ничего особенного для поля в самом коде проверки. Любой подход, вероятно, применим ко всему, что кто-либо делает, если они сталкиваются с этим.

$('#datefield').datepicker(
{beforeShow: function(input) {
                             $(input).unbind('blur');
             },
 onClose: function(dateText, inst) {
                             $(this).validationEngine();this.focus();this.blur() }
});

(В моей структуре ".validationEngine()" это то, что регистрирует обработчики проверки)

Ответ 5

Наклон этой темы, потому что у меня возникли трудности с принятым решением.

Мне было проще вызвать событие "change", когда срабатывает событие datepicker "onClose". Это гарантирует, что событие изменения входного элемента всегда срабатывает:

$('#my_element').datepicker({
    onClose: function() {
        $(this).trigger('change');
    }
});

Это может показаться глупым, потому что оно срабатывает в то время, когда ничего не изменилось. Тем не менее, он работает более надежно, чем datepicker 'onSelect', и помог мне избежать проблем с аккомпанементом или размытием событий, которые происходят перед событиями datepicker.

Ответ 6

Создайте свое пользовательское событие в jquery и привяжите его к текстовому поле. После этого запускается событие on onclose event datepicker. Таким образом, если вы перейдете из текстового поля, то пользовательское событие будет запущено.

$("inputText").bind('CustomEventName',function(){//your validate method code});

и в параметре Datepicker

$("#inputText").datePicker({onClose:function(){ $(this).trigger('CustomEventName')});

Ответ 7

У меня была такая же проблема, как и вы, и ответ Магнар помог, но не полностью ответил на проблему.

Вы определили основную причину. Действие пользователя, взаимодействующего с календарем, удаляет фокус из поля ввода. Это (в случае ненавязчивой проверки jquery) вызовет событие onBlur, инициировав проверку этого поля ввода. В этот момент значение остается прежним, пока пользователь не выберет что-то.

Следовательно, опираясь на ответ Магнар, он утверждает, что вам нужно повторно проверить поле ввода в календаре календаря. Наиболее очевидным способом является вызов $("form").valid(), однако это подтверждает всю форму.

Лучше всего просто проверить поле ввода, связанное с выбором даты, и вы можете вызвать это, выполнив следующее:

$('#myform input').blur(function () {
    var that = this;
    setTimeout(function () {
        $(that).trigger("focus").trigger("blur");
    }, 100);
});

Теперь только ваше поле ввода проверено, потому что вы подделали пользователя, щелкнув его и вне поля ввода.