键入期间jQuery UI Datepicker缓慢

时间:2010-07-14 22:07:25

标签: jquery jquery-ui jquery-ui-datepicker performance

我听说过jQuery有多么优雅和优雅的所有这些经验,但由于性能不佳,我试图在实际项目中实现jQuery控件。这次我遇到了与Richard类似的问题。 jQuery UI DatePicker在我正在处理的ASP.NET应用程序中失败了用户验收测试,因为在输入文本框时,在输入最后两个数字时会有一些滞后。 (例如'1/1/20 10 ')。

有没有人知道一个选项/方法可以阻止jQuery UI干扰用户在与之绑定的文本框中的输入?

2 个答案:

答案 0 :(得分:3)

我在IE 6中遇到了同样的问题。 我使用了一个性能工具(DynaTrace Ajax版)来查看滞后的位置,并在密钥事件上执行的更新日期函数中找到它。 所以,我的工作是停用keyup事件。

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

编辑:这样做有一个缺点。手动输入日期时,不会刷新日期选择器。

那么,另一个(更好的?)解决方案是仅在用户点击带有showOn: 'button'选项的小按钮时显示日期选择器(此处有更多信息:http://jqueryui.com/demos/datepicker/#icon-trigger

然后,仅在显示日期选择器时更改JQuery datepicker代码以刷新日期。为此,找到_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;
},

当然,更改插件的代码有点讨厌......

答案 1 :(得分:3)

要扩展Jason所说的内容,您可以通过执行此操作覆盖基本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;
    }
 }); 

.......