4

我听说过所有这些关于 jQuery 的伟大和优雅的伟大经验,但由于性能不佳,我试图在现实世界的项目中实现 jQuery 控件,我是 0 比 2。这次我遇到了与理查德类似的问题。jQuery UI DatePicker 在我正在处理的 ASP.NET 应用程序中未能通过用户验收测试,因为在文本框中输入时,在输入最后两个数字时会出现一些延迟。(例如'1/1/20 10 ')。

有谁知道可以阻止 jQuery UI 干扰用户在与其关联的文本框中输入的选项/方法?

4

2 回答 2

3

我在 IE 6 中遇到了同样的问题。我使用了一个性能工具(DynaTrace Ajax 版)来查看延迟在哪里,我在对 keyup 事件执行的更新日期函数中找到了它。因此,我的工作是停用 keyup 事件。

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

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

因此,另一个(更好的?)解决方案是仅在用户单击带有选项的小按钮时才显示日期选择器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;
},

当然,改插件的代码有点恶心……

于 2011-03-23T11:08:22.877 回答
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;
    }
 }); 

…………

于 2011-04-12T19:49:18.633 回答