Я слышал все эти замечательные отзывы о том, насколько великолепен и элегантен jQuery, но я 0 из 2, пытаясь реализовать элементы управления jQuery в реальных проектах из-за низкой производительности. На этот раз я столкнулся с проблемой, аналогичной Richard. Пользовательский интерфейс jQuery DatePicker не прошел приемочное тестирование пользователя в приложении ASP.NET, над которым я работаю, потому что при вводе текста в текстовое поле происходит некоторое отставание, особенно при вводе последних двух чисел. (например, "1/1/2010").
Кто-нибудь знает вариант/подход, который не позволит пользовательскому интерфейсу jQuery мешать вводу текста пользователем в текстовом поле, к которому он привязан?
jQuery UI Datepicker медленно во время набора текста
Ответы (2)
У меня была такая же проблема в IE 6. Я использовал инструмент производительности (DynaTrace Ajax Edition), чтобы увидеть, где было отставание, и я нашел его в функции даты обновления, выполняемой при событии нажатия клавиши. Итак, моя работа заключалась в том, чтобы деактивировать событие keyup.
$( "#idOfTheInput" ).unbind("keyup");
EDIT: у этого есть недостаток. При вводе даты вручную средство выбора даты не будет обновляться.
Итак, другое (лучшее?) решение — показывать средство выбора даты только тогда, когда пользователь нажимает маленькую кнопку с опцией showOn: 'button'
(подробнее здесь: http://jqueryui.com/demos/datepicker/#).icon-trigger )
Затем измените код средства выбора даты JQuery, чтобы обновлять дату только при отображении средства выбора даты. Для этого найдите функцию _doKeyUp
и добавьте условие, говорящее: «Если отображается средство выбора даты, выполните обновление, в противном случае не обновляйте».
_doKeyUp: function(event) {
var inst = $.datepicker._getInst(event.target);
if ($.datepicker._datepickerShowing) {
if (inst.input.val() != inst.lastVal) {
try {
var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
(inst.input ? inst.input.val() : null),
$.datepicker._getFormatConfig(inst));
if (date) { // only if valid
$.datepicker._setDateFromField(inst);
$.datepicker._updateAlternate(inst);
$.datepicker._updateDatepicker(inst);
}
}
catch (event) {
$.datepicker.log(event);
}
}
}
return true;
},
Конечно, немного противно менять код плагина...
Чтобы расширить то, что сказал Джейсон, вы можете переопределить метод вне базового файла пользовательского интерфейса, выполнив это
jQuery(function(){
jQuery.datepicker._doKeyUp = function(event) {
var inst = jQuery.datepicker._getInst(event.target);
if(jQuery.datepicker._datepickerShowing) {
if(inst.input.val() != inst.lastVal) {
try {
var date = jQuery.datepicker.parseDate(jQuery.datepicker._get(inst, 'dateFormat'),
(inst.input ? inst.input.val() : null),
jQuery.datepicker._getFormatConfig(inst));
if(date) { // only if valid
jQuery.datepicker._setDateFromField(inst);
jQuery.datepicker._updateAlternate(inst);
jQuery.datepicker._updateDatepicker(inst);
}
}
catch (event) {
jQuery.datepicker.log(event);
}
}
}
return true;
}
});
.......