JQuery UI DatePicker не открывается до ранее выбранной даты, если формат не включает день - PullRequest
1 голос
/ 23 марта 2012

Я заметил неожиданное поведение в датчике jQuery UI.

Всякий раз, когда я использую формат, который не включает день, например, «MM yy» (октябрь 2011 г.), DatePicker, когда отображается в следующий раз, указывает на сегодняшний день вместо предыдущей даты.

Это не происходит, когда используется формат, например 'дд / мм / гг' (01.10.2011).

Я думаю, что это на самом деле ошибка, и я сообщу об этом сообществу jQuery UI.

В любом случае, в то же время, Интересно, вы сталкивались с этой проблемой раньше и можете предложить мне обходной путь ?

Пример проблемы можно найти здесь.

EDIT: Для полноты: я представил эту проблему сообществу пользовательского интерфейса jQuery как ошибку. Для тех, кто заинтересован, его можно найти здесь.

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Я решил вашу проблему.Пожалуйста, проверьте эту ссылку http://jsfiddle.net/nEGTv/3/

Просто добавьте эту строку в ваш код $("#monthDate1").datepicker('option', 'defaultDate', new Date(year, month, 1)); в вашей функции $("#monthDate1").focus.

3 голосов
/ 26 августа 2013

Ответ, который вы пометили как правильный, не совсем правильный. Позвольте мне сломать это.

$("#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, а некоторые без него.

...