Поведение jQueryUI datepicker при открытии во время частичной обратной передачи ASP.NET: год становится 1899 или 1900

У меня есть очень интересная ошибка с jQueryUI datepicker и UpdatePanel, где выбранная дата datepicker примерно 100 лет назад. jQuery - это версия 1.6.2, а jQueryUI - версия 1.8.14. Вот примерный макет:


  
    
      
      
    
    
  

Итак, у меня есть UpdatePanel, которая содержит раскрывающийся список, который вызывает обратную передачу при его изменении, а также текстовое поле. У меня есть jQueryUI, устанавливающий текстовое поле как средство выбора даты. Обратите внимание, что все это содержится в модальном диалоговом окне jQueryUI.

Вот что происходит:

  1. Когда открывается диалоговое окно, фокус по умолчанию находится в раскрывающемся списке. Нажатие клавиши на клавиатуре изменит выбор в раскрывающемся списке, но не инициирует обратную передачу.
  2. После изменения значения раскрывающегося списка с помощью клавиатуры щелкните текстовое поле. Начнется частичная обратная передача (из-за того, что раскрывающийся список потерял фокус), и появится jQueryUI DatePicker, показывающий текущий месяц и год (февраль 2012 г. на момент написания).
  3. Частичная обратная передача, вероятно, завершится до того, как мы сможем что-либо сделать с указателем даты.
  4. После завершения обратной передачи нажмите одну из кнопок месяца вперед / назад на панели выбора даты. Если вы нажмете назад, то перейдете к ноябрю 2010 года. Если вы нажмете вперед, то перейдете к январю 2010 года.
  5. После изменения месяца с помощью кнопок щелкните день в календаре.Средство выбора даты закрывается и помещает дату в текстовое поле. Если вы нажали назад на шаге 4, дата будет в ноябре 1899 года. Если вы нажали вперед на шаге 4, дата будет в январе 1900 года.

Кажется, что средство выбора даты сбивается, когда оно инициализируется, когда оно уже открыто после частичного обратная передача. Я знаю, что настройка datepicker не переживает частичную обратную передачу и что мне нужно повторно инициализировать ее в функции pageLoad .

Я могу сказать, происходит ли это, проверив, больше ли $ ('. Ui-datepicker-title'). Length нуля при настройке datepicker в pageLoad . Но я не знаю, что оттуда делать. Убедившись, что это происходит, я попробовал следующее в pageLoad перед настройкой datepicker:

  • $ ('. DateText'). Unbind ();
  • $ ('. DateText' ) .datepicker ('destroy');
  • $ ('# ui-datepicker-div'). remove ();

Он либо делает то же самое, либо закрывается и больше не появляется.

Как я могу это исправить?

Обновление : Я пробовал использовать jQueryUI 1.8.18 и jQuery 1.7.1 (последние версии на момент написания), но проблема все еще возникает.

Обновление 2 : мне удалось обойти проблему, указав функцию в параметрах для onChangeMonthYear , когда средство выбора даты инициализируется в pageLoad . Если параметр года этого события равен 1899 или 1900, я устанавливаю дату datepicker на один месяц назад или вперед от текущего момента (соответственно).Это устанавливает содержимое текстового поля, которое мне не нужно, поэтому я затем устанавливаю значение текстового поля на ''. В итоге datepicker работает нормально.

Я все же хотел бы лучше разобраться в этой проблеме, поэтому я знаю, является ли это ошибкой в ​​jQueryUI, которую я должен зарегистрировать, или я должен делать что-то другое в другом месте.

Обновление 3 : все еще происходит с ASP.NET 4, jQuery 1.7.2 и jQueryUI 1.8.21. Я протестировал его на пустой странице с настройкой, подобной описанной здесь, и увидел такое же поведение. Я называю это ошибкой jQueryUI. Он хранится здесь .

ОБНОВЛЕНИЕ 4: Я воспроизвел проблему без ASP.NET в этом jsfiddle .

5
задан Tom Hamming 10 July 2012 в 16:25
поделиться