Чтобы пройти через три подхода, первый потерпит неудачу, потому что вы настроены таким образом, что #datepicker
еще не определено. Вы можете проверить это, заменив его на alert($('#datepicker').length)
и убедившись, что оно равно нулю.
Второй подход заключается в двух щелчках, потому что средство выбора даты не знает о первом щелчке, потому что оно было создано после щелчка.
Третий подход работает, потому что он заставляет указатель даты появляться после первого щелчка. Это хорошо, но немного расточительно, потому что после настройки средства выбора даты у него есть собственный прослушиватель событий, который будет отображаться при запуске щелчка.
Возвращаясь к первому подходу, он не работал, потому что #datepicker
еще не существовало. Вы можете сделать это, переместив ('#datepicker').datepicker()
после точки в коде, где он создан.
Если это невозможно, вы можете сделать так, чтобы ваша функция запускалась только при первом щелчке, используя третий подход, но переключаясь с on
на one
. Это сделает так, что первый щелчок - это ваш прослушиватель событий, который создает и показывает указатель даты. После этого ваш прослушиватель событий будет удален, и будет существовать только встроенный прослушиватель выбора даты.
Тем не менее, я действительно ненавижу $(document).on('click', ...
, потому что он оценивает каждый раз, когда вы нажимаете на страницу. Он фиксирует событие на уровне документа, а затем сравнивает каждый элемент в списке целей с селектором. Это медленно и действительно складывается, если у вас их много. Если вы должны использовать делегированный слушатель, вы должны переместить его к ближайшему родителю. Например, если #datepicker
всегда появляется в #form1
, вы можете вместо этого сделать $('#form1').on('click', ...
и сократить обработку.