2010-07-14 3 views
4

Я слышал все эти замечательные впечатления от того, насколько велика и изящна jQuery, но я для 2 попытки реализовать элементы управления jQuery в реальных проектах из-за низкой производительности. На этот раз я столкнулся с аналогичной проблемой, как Richard. В jQuery UI DatePicker не удалось выполнить тестирование приёма пользователей в приложении ASP.NET, над которым я работаю, потому что при вводе текста в текстовое поле происходит определенное отставание при вводе последних двух чисел. (например, '1/1/20 ').

Кто-нибудь знает о параметре/подходе, который остановит пользовательский интерфейс jQuery от вмешательства пользователя в текстовое поле, к которому он привязан?jQuery UI Datepicker Slow во время ввода

+0

Просто попробовал это на демо-странице JQuery UI. Никаких проблем. Можете ли вы воссоздать эту проблему? У вас есть видео, демонстрирующее проблему, любые факты/цифры, а также какие браузеры, какова спецификация ПК и т. Д., Какие другие js были запущены на странице, сколько других элементов управления ... Мы действительно нужна дополнительная информация. – redsquare

+0

Как сказал redsquare - вы пробовали демонстрацию jQuery UI на веб-сайте jQuery? Если у вас нет проблем, возможно, на вашем сайте может быть что-то очень специфическое. – JasCav

+0

Вы когда-нибудь находили ответ? Я испытываю точный вопрос, и у меня такая же проблема и на демонстрационном сайте jQueryUI. –

ответ

3

У меня была такая же проблема в IE 6. Я использовал инструмент производительности (DynaTrace Ajax Edition), чтобы узнать, где находится отставание, и нашел его в функции даты обновления, выполненной в событии keyup. Итак, моя работа заключалась в деактивации события keyup.

$("#idOfTheInput").unbind("keyup"); 

EDIT: Существует недостаток делать это. При вводе вручную даты датапикер не будет обновляться.

Итак, другой (? Лучше) решение, чтобы показать выбора даты только тогда, когда пользователь нажимает на маленькую кнопку с опцией showOn: 'button' (подробнее здесь: http://jqueryui.com/demos/datepicker/#icon-trigger)

Затем измените код Datepicker 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; 
}, 

Конечно, это немного противно, чтобы изменить код плагина ...

+0

Удивительный, не могли бы вы поделиться с вами инструментом, который вы использовали? Я не могу дождаться теста это на следующей неделе. – Sephrial

+0

Я использовал DynaTrace Ajax. В основном, это программное обеспечение отслеживает все между вами и сервером: сеть, кеш, javascript и Ajax. Я не люблю рекламировать, но это потрясающая программа. Очень полезно. – Jason

+0

So , @Sephrial, вы пробовали это? Работает ли нормально? – Jason

3

Чтобы расширить то, что сказал Джейсон, вы можете переопределить метод вне файла базы Ui, делая это

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; 
    } 
}); 

.......

+0

Спасибо Кристиану. Более удобный (и менее грязный!) способ изменить функцию. +1 – Jason