Ответ, который вы пометили как правильный, не совсем правильный. Позвольте мне сломать это.
$("#monthDate1").focus(function () {
$(".ui-datepicker-calendar").hide();
//add event to perform on done button click
$(".ui-datepicker-close").click(function(){
var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
$("#monthDate1").datepicker('option', 'defaultDate', new Date(year, month, 1));
$("#monthDate1").datepicker('setDate', new Date(year, month, 1));
});
});
Делая $("#monthDate1").focus
, вы ожидаете события click
каждый раз, когда ваш контроль переходит в focus
, что очень плохо.
Рассмотрите возможность запуска $.ajax
каждый раз, когда вы click
на $(".ui-datepicker-close")
. Ваша функция будет запрашивать с сервера не один раз, а столько раз, сколько ваш контроль вступил в focus
.
Fix:
Не связывайте focus
на $("#monthDate1")
, а вместо этого используйте live
или delegate
(для версий jquery> = 1.9.3, если я не ошибаюсь).
Вот пример с live
:
$(".ui-datepicker-close").live('click', function(){
var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
$("#monthDate1").datepicker('option', 'defaultDate', new Date(year, month, 1));
$("#monthDate1").datepicker('setDate', new Date(year, month, 1));
});
Вот пример с delegate
:
$("#ui-datepicker-div").delegate(".ui-datepicker-close", 'click', function(){
var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
$("#monthDate1").datepicker('option', 'defaultDate', new Date(year, month, 1));
$("#monthDate1").datepicker('setDate', new Date(year, month, 1));
});
UPDATE
Это обновление относится к ответу, который я дал в своем комментарии.
Пользователь $(".ui-datepicker-calendar").hide();
внутри события focus
не совсем в порядке, потому что он немного глючит.
Вот как это сделать без проблем:
var dynamicStyle = $("<style> .ui-datepicker-calendar { display: none; } </style>")
.attr("id", "dynamicDatepickerStyle");
$("#monthDate1").datepicker({
beforeShow: function ()
{
$("body").append(dynamicStyle);
},
onClose: function ()
{
$("#dynamicDatepickerStyle").remove();
}
});
это добавит style
, который будет hide
calendar
, когда вы open
datepicker
, и remove
* style
, когда datepicker
закрыт, чтобы он не повлияет на другие средства выбора даты на странице. Это если вы хотите, чтобы на странице было несколько сборщиков дат, некоторые с calendar
, а некоторые без него.