jQuery UI. Widgets. Datepicker (Календарь)

Сразу оговорюсь, цикл этих статей не рассчитан на матерых профи, она является всего лишь толчком к развитию, этаким небольшим экскурсом по возможностям для новичков, для тех кто не имеет понятия о UI и jQuery в целом.
Ну, поехали!

Скачиваем: http://jqueryui.com/download
Подключаем шаманский фреймворк, локализацию для календаря и таблицу стилей:

<link type="text/css" href="css/ui-lightness/jquery-ui-1.7.2.custom.css" rel="stylesheet" />
<script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script>
<script src="js/i18n/jquery-ui-i18n.js" type="text/javascript"></script>

Итак, приготовления закончены.

Чтобы создать календарь нужна всего лишь одна строка html:

<input id="datepicker" type="text" />

Либо если Вы хотите встроить календарь в сайт как элемент страницы:

<div id="datepicker"></div>

И пара строк js:

$(function(){
  $.datepicker.setDefaults(
        $.extend($.datepicker.regional["ru"])
  );
  $("#datepicker").datepicker();
});

Живой пример:

И так мы получили вполне работающий календарь на русском, но вдруг мы делаем сайт на английском или украинском? Чтобы изменить ситуацию в нашу пользу надо всего лишь изменить один параметр, причем делать это можно динамически:

$('#datepicker').datepicker('option', $.datepicker.regional["uk"]));

Стандартного функционала «по умолчанию» не всегда хватает на выполнение тех или иных задач. Поэтому чуть-чуть подредактируем настройки:

$("#datepicker").datepicker({
    minDate: "-30",			//Минимальная дата которую можно выбрать, т.е. -30 дней от "сейчас"
    maxDate: "+1m +1w +3d"  //Максимальная дата которую можно выбрать, т.е. + 1 месяц, 1 неделя, и 3 дня от "сейчас"
});

события

$.datepicker.setDefaults($.extend(
  $.datepicker.regional["ru"])
);
$("#datepicker").datepicker({
  beforeShow: function(input) {
    $(input).css("background-color","#ff9");
  },
  onSelect: function(dateText, inst) {
    $(this).css("background-color","");
    alert("Выбрано: " + dateText +
      "nnid: " + inst.id +
      "nselectedDay: " + inst.selectedDay +
      "nselectedMonth: " + inst.selectedMonth +
      "nselectedYear: " + inst.selectedYear);
  },
  onClose: function(dateText, inst) {
    $(this).css("background-color","");
  }
});

В листинге выше у нас получилось целых три опции, в которых есть коллбэки.
beforeShow — это та функция, которая будет вызвана перед отображением календаря.
С помощью css-опций она установит инпуту желтый фон.
В onSelect определена функция, которая будет вызвана при выборе какой либо даты, она выведет выбранную дату в alert и передаст пустое значение css-опции, что вернет инпуту прежний вид.
onClose функция которая сработает при закрытии календаря — т.е.вернет инпуту белый фон.

методы

<a id="datepicker_open">Открыть в окне</a>
$.datepicker.setDefaults({changeYear: true}, $.extend($.datepicker.regional["ru"]));
$("#datepicker_open").click(function(){
  $("#datepicker").datepicker(
      "dialog",
      "23.04.2009",
      function(){
        alert("Событие onSelect");
      },
      { showButtonPanel: true }
  );
});

Открыть в окне

В приведенном примере я демонстрирую работу метода dialog. Мы вызываем этот метод при щелчке на ссылке. Первый аргумент – это название метода, второй аргумент textDate – дата на которой по умолчанию будет открываться календарь. В аргументе onSelect можно передать callback-функцию, которая будет вызвана при выборе конкретной даты в календаре. В аргументе settings можно передать объект с новыми настройками виджета, которые будут применены к календарю, который будет открыт в диалоговом окне.

Ну вот вроде бы и все… Пользуйтесь! А далее приведен список всех опций, методов и событий.

Опции:
  • altField — jQuery селектор для другого поля, которое должно быть обновлено, как только будет выбрана дата в Datepicker. Формат даты в этом дополнительном поле устанавливается с помощью опции altFormat.
  • altFormat — формат даты, который будет использоваться для опции altField. Эти настройки позволяют показывать пользователю один формат даты, тогда как для вычислений может использоваться другой формат. Полный список возможных форматов можно найти на http://docs.jquery.com/UI/Datepicker/formatDate
  • appendText — текст, который будет отображаться после каждого поля выбора даты. Можно использовать, например для того, чтобы пометить поле как обязательное для заполнения.
  • buttonImage — адрес картинки, которая будет отображаться на кнопке, с помощью которой можно вызывать календарь. Используется совместно с опцией showOn, когда та принимает значения ‘button’ или ‘both’. Если был определен текст в опции buttonText, он становится значением атрибута alt картинки.
  • buttonImageOnly — если для этой опции установить значение true, то картинка, адрес которой определен в опции buttonImage, будет отображаться не на кнопке, а сама по себе.
  • buttonText — текст, отображающийся на кнопке, с помощью которой можно вызывать календарь. Используется совместно с опцией showOn, когда та принимает значения ‘button’ или ‘both’.
  • changeMonth — если в этой опции передать значение true, будет возможно выбирать месяц из выпадающего списка.
  • changeYear — если в этой опции передать значение true, будет возможно выбирать год из выпадающего списка.
  • closeText — эта опция используется совместно с showButtonPanel, если последняя имеет значение true. Значение опции closeText определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • constrainInput — по умолчанию опция имеет значение true и принуждает строго соблюдать формат даты, определенный в опциях виджета, в текстовом поле ввода. Чтобы иметь возможность не соблюдать этот формат, следует установить опцию в false.
  • currentText — эта опция используется совместно с showButtonPanel, если последняя имеет значение true. Значение опция currentText определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • dateFormat — определяет формат даты. Значение опции dateFormat определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его. Полный список возможных форматов можно найти на
    http://docs.jquery.com/UI/Datepicker/formatDate
  • dayNames — массив, содержащий полные названия дней недели, начиная с воскресенья. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • dayNamesMin — массив, содержащий 2-хбуквенную аббревиатуру названия дней недели, начиная с воскресенья. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • dayNamesShort — массив, содержащий 3-хбуквенную аббревиатуру названия дней недели, начиная с воскресенья. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • defaultDate — устанавливает дату, которая будет подсвечена при первом открытии, если поле выбора даты пустое. Опция может быть определена через объект Date, либо как количество дней от текущего для (например +7 или -15), либо как строка значений, определяющих период (‘y’ для лет, ‘m’ для месяцев, ‘w’ для недель, ‘d’ для дней, например ‘+1m +7d’), и наконец как null для текущего дня.
  • duration — длительность эффекта анимации при открытии (закрытии) календаря. Может принимать значения в виде строки — ‘fast’, ‘normal’ (по умолчанию), ‘slow’ или в виде числа в миллисекундах. Если передать пустую строку, календарь будет открываться и закрываться без эффекта анимации.
  • firstDay — опция устанавливает первый день недели: воскресенье – 0, понедельник – 1,… Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • gotoCurrent — если установить значение опции в true, то кнопка «Сегодня» (доступная при showButtonPanel: true) будет указывать на выбранную дату взамен текущей.
  • hideIfNoPrevNext — если Вы ограничиваете диапазон доступных дат с помощью опций minDate и maxDate, то при достижении края диапазона, стрелки «Назад» и «Вперед» становятся неактивными. Но их можно и совсем скрывать, передав в опции hideIfNoPrevNext значение true.
  • isRTL — для этой опции необходимо установить значение true, если используется язык с написанием справа налево. Определяется в файле локализации, если он используется.
  • maxDate — устанавливает максимальную возможную для выбора дату через объект Date или как число дней от текущего (например +7) или как строку значений определяющих период (‘y’ для лет, ‘m’ для месяцев, ‘w’ для недель, ‘d’ для дней, например ‘+1y +1m’), или null для отсутствия ограничения.
  • minDate — устанавливает минимальную возможную для выбора дату через объект Date или как число дней от текущего (например -7) или как строку значений определяющих период (‘y’ для лет, ‘m’ для месяцев, ‘w’ для недель, ‘d’ для дней, например ‘-1y -1m’), или null для отсутствия ограничения.
  • monthNames — массив, содержащий полные названия месяцев. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • monthNamesShort — массив, содержащий 3-хбуквенную аббревиатуру названия месяцев. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.
  • navigationAsDateFormat — по умолчанию опция имеет значение false. Если установить значение true, функция dateFormat будет примерена к значениям опций nextText, prevText и currentText с тем, чтобы отображать при навигации, например предыдущее и следующее названия месяцев.
  • nextText — текст, который отображается в качестве ссылки на следующий месяц. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его. Если используется файл стилей ThemeRoller’а, это значение заменяется иконкой.
  • numberOfMonths — эта опция определяет, сколько месяцев сразу нужно показать. Значение опции может быть просто числом или массивом, состоящим из двух элементов, которые определяют соответственно количество строк и столбцов. Например, значение [2, 3] отобразит календарь в две строки по три месяца.
  • prevText — текст, который отображается в качестве ссылки на предыдущий месяц. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его. Если используется файл стилей ThemeRoller’а, это значение заменяется иконкой.
  • shortYearCutoff — значение по умолчанию +10. Эта опция используется только при условии использования в dateFormat двузначной записи года и выполняет роль компенсатора для определения века. Если значение передано в виде числа, используется как есть. Если значение передано в виде строки, конвертируется в число и добавляется к текущему значению года. После того как значение определено, все данные, выступающие в качестве значения года, и меньшие и равные ему считаются годами текущего века. Значения большие – считаются годами предыдущего века.
  • showAnim — определяет тип анимации при открывании календаря. По умолчанию имеет значение show (при закрывании будет использован hide). Без подключения дополнительных файлов могут быть использованы эффекты ‘slideDown’ и ‘fadeIn’ (при закрывании соответственно будут использоваться эффекты ‘slideUp’ и ‘fadeOut’). Так же возможно использование любых эффектов jQuery UI Effects при условии их дополнительного подключения.
  • showButtonPanel — установка значения true для этой опции приведет к тому, что будет показана панель с двумя кнопками – переход к сегодняшней дате и закрытие календаря.
  • showCurrentAsPos — когда используется отображение сразу нескольких месяцев, число, переданное в этой опции, определяет позицию текущего месяца. По умолчанию используется значение 0, и текущий месяц отображается в верхнем левом углу.
  • showMonthAfterYear — по умолчанию используется значение false и в заголовке название месяца идет перед годом. При использовании значения true название месяца будет следовать за годом.
  • showOn — по умолчанию эта опция имеет значение ‘focus’, что заставляет календарь открываться при щелчке в поле ввода. Другие возможные значения — ‘button’ и ‘both’. Рядом с полем ввода появится кнопка. В первом случае календарь будет открываться по щелчку на кнопке, а во втором случае как по щелчку на кнопке, таки при получении фокуса полем ввода.
  • showOptions — если Вы используете один из эффектов jQuery UI Effects, с помощью этой опции ему можно передать дополнительные настройки. Например: showOptions: {direction: ‘up’}.
  • showOtherMonths — по умолчанию имеет значение false. Если использовать true, на календаре будут отображаться дни предыдущего и/или следующего месяца без возможности их выбора.
  • stepMonths — определяет насколько месяцев сдвигать календарь при щелчке по ссылкам Следующий и Предыдущий. По умолчанию – 1.
  • yearRange — управление диапазоном лет, отображаемых в выпадающем списке (при использовании опции changeYear).
События:
  • beforeShow — здесь можно определить функцию, которая будет вызываться перед открытием календаря. Функция принимает в качестве аргумента объект, характеризующий текстовое поле ввода с которым работает виджет.
  • beforeShowDay — в этой опции можно определить пользовательскую функцию, которая будет принимать в качестве аргумента выбранную дату. Функция должна возвратить массив, где элемент с индексом [0] – true или false показывает, возможен или нет выбор этой даты. Элемент с индексом [1] содержит имя класса (классов) для отображения даты. Элемент с индексом [2] (опционально) – текст всплывающей подсказки для даты. Функция будет вызываться для каждой даты в календаре в момент наведения указателя мыши.
  • onChangeMonthYear — здесь можно определить функцию, которая будет вызываться при смене месяца или года в календаре. Функция принимает три аргумента. Первые два аргумента – это новые значения года и месяца, третий аргумент – объект datepicker.
  • onClose — в этой опции определяется функция, которая будет вызвана, когда календарь был закрыт без выбора какой-либо даты.
  • onSelect — в этой опции определяется функция, которая будет вызвана, когда в календаре выбрана какая-либо дата.
Методы:
  • destroy — .datepicker(‘destroy’) полностью удаляет всю функциональность виджета Datepicker. Возвращает элементы в состояние, предшествующее инициализации.
  • disable — .datepicker(‘disable’) временно запрещает использование всей функциональности виджета. Вновь разрешить ее использование можно с помощью метода enable.
  • enable — .datepicker(‘enable’) разрешает использование всей функциональности виджета, если ранее она была запрещена с использованием метода disable.
  • option — .datepicker(‘option’, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции виджета после инициализации.
  • dialog — .datepicker(‘dialog’, dateText, [onSelect], [settings], [pos]) открывает виджет Datepicker в режиме диалогового окна. В аргументе dateText передается дата, на которой должен быть открыт календарь. Остальные аргументы необязательные. В аргументе onSelect можно передать функцию, которая будет вызвана в момент выбора даты в календаре, в аргументе settings можно передать объект с новыми настройками виджета, в аргументе pos – координаты, в которых будет открыто диалоговое окно. Здесь можно использовать события мыши, чтобы определить координаты.
  • isDisabled — .datepicker(‘isDisabled’) метод возвращает значение true, если к виджету был применен метод disable и false в противном случае.
  • hide — .datepicker(‘hide’, [speed]) скрывает ранее открытый календарь.
  • show — .datepicker(‘show’) открывает календарь.
  • getDate — .datepicker(‘getDate’) метод возвращает дату, выбранную в календаре.
  • setDate — .datepicker(‘setDate’, date) метод позволяет установить дату в календаре. Значением аргумента date может быть строка (например: 25.10.1917)

20 Комментарии “jQuery UI. Widgets. Datepicker (Календарь)

  1. Не сразу получилось его подключить и настроить. Не получалось подключить комбобокс выбора года. Когда прописал опцию changeYear в одной строке с локализацией — календарь, несмотря на локализацию, стал отображать иероглифы. Решил проблему, прописав опцию в другом месте: $(function(){ $.datepicker.setDefaults( $.extend($.datepicker.regional["ru"]) ); $("#datepicker").datepicker({changeYear: true}); }); Работает, ура. Спасибо огромное за статью и документацию.

  2. Прекрасный материал. Всё работает. У меня просьба: разъясните, как сделать неактивными выходные дни (чтобы клиент не мог выбирать ни субботу, ни воскресенье). Заренее признателен.

  3. Все хорошо, только кодировка у меня гонит почему то..(

  4. Замечательный календарь, вот только не нашел как выбрать период даты

  5. Подскажите: как сделать чтобы уже при запуске (до выбора даты в календаре) в поле ввода была прописана какая-нибудь дата?

  6. Тот же вопрос как и у Андрея постом выше

  7. setDate — .datepicker('setDate', date) метод позволяет установить дату в календаре

  8. Всем привет! Подскажите, в чем проблема, пожалуйста. Подключаю у себя все по инструкции, работает все нормально, даже в шестом осле. После того, как начинаю менять настройки, например добавляю $("#datepicker").datepicker({changeYear: true}); }); — работает везде, кроме осла, причем любого! При нажатии в поле просто ничего не происходит. Переходил на Ваш сайт — все нормально, пробовал добавлять настройки в скачанный пример — опять пропадает в осле.

  9. Возможно этот комментарий поможет кому-то: проблема в новой версии. На данном сайте ссылка на скачивание, где я взял естественно последнюю версию, даже не думая. Проблема описана сверху. Скачав сейчас старую версию по той же ссылке, проверил — все работает, в том числе в IE

  10. Привет. Очень полезная информация, но к сожалению я так и не поняла, у меня дата выводится в формате mm.dd.yyyy, как мне ее поменять на dd.mm.yyyy. И еще после выбора даты мне нужно узнать день недели, как это сделать?

  11. привет! всё вроде скачал, но то ли конфликт со скриптами то ли что, пытался сколько разобраться не получается, если кто может отправьте рабочий пример со скриптами, ящичек указываю indetify@mail.ru Спасиб огромное

  12. автор а свой пример запилить и скинуть ссыль на гугл драйв не мог?

  13. Вспоминаем, что браузер кэширует js, css и кучу других файлов. Поэтому, если что то поменяли в этих отдельных файлах, чтобы проверить, как работает страничка после изменения — перезагружаем её по Ctrl+F5.

  14. А можно сделать чтобы datepicker выезжал всегда сверху или всегда снизу от поля?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *