2009-12-11 113 views
6

由于将OnSelect添加到我的Datepicker,TextChanged事件不再为此控件触发。我的代码如下:JQuery Datepicker OnSelect和TextChanged问题

$(function() { 
    $("#<%=txtStartDate.ClientID %>").datepicker({ 
     minDate: 0, 
     dateFormat: 'dd-M-yy', 
     onSelect: function(dateText, inst) { 
      var theDate = new Date(Date.parse($(this).datepicker('getDate'))); 
      $("#<%=txtEndDate.ClientID %>").datepicker('option', 'minDate', theDate); 
     } 
    }); 

    $("#<%=txtEndDate.ClientID %>").datepicker({ 
     dateFormat: 'dd-M-yy' 
    }); 
}); 

<%-- etc ---- %> 

<asp:TextBox ID="txtStartDate" runat="server" AutoPostBack="true" OnTextChanged="txtStartDate_TextChanged"></asp:TextBox> 

我的其他日期选择器(txtEndDate)TextChanged事件不火所以只能把它归结为在ONSELECT正在为txtStartDate控件定义。

非常感谢在这一个任何帮助。干杯!

回答

6

的jQuery UI的日期选择器的短暂检查之后源的解决方法就是激发更改事件自己

... 
onSelect: function(dateText, inst) { 
    var theDate = new Date(Date.parse($(this).datepicker('getDate'))); 
    $("#<%=txtEndDate.ClientID %>").datepicker('option', 'minDate', theDate); 
    if (inst.input) 
     inst.input.trigger('change'); 
} 
... 

这样做的原因是在jQuery UI的日期选择器源以下行

if (onSelect) 
    // trigger custom callback 
    onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); 
else if (inst.input) 
    // fire the change event 
    inst.input.trigger('change'); 

正如你所看到的,如果datepicker实例是一个input字段,但如果你指定了一个自定义的onSelect处理程序(如你所做的那样)不会触发它,则默认情况下jQuery UI Datepicker会触发change事件。

你可能会争辩说,实际上这是正确的行为,因为它保证了最大的可配置性。您可以决定是否希望change事件以这种方式发生。

但我同意,这种行为也许应记录在案。

0

与此类似,我发现,如果你附加的DatePicker到一个文本输入框,并指定.selectMultiple,然后会出现怪异的行为。特别是,当你点击一个已经选好的单元格(为了取消选中它),它会闪烁但保持选中状态。发生这种情况是因为首先单元格未选中,但DatePicker会引发“更改”事件。更改事件会将当前单元格重新打开,因为日历已附加到文本输入!

这是有道理的,在某种程度上:你可能不应该将多个选择放在一个文本框中。但是这种行为是无证的,而且很难追踪,除非你已经知道DatePicker如何理解文本框。