Описание
Легкий (~36kb минифицированный js файл и ~9kb gziped), кастомизируемый, кроссбраузерный календарь, написан с использованиемes5
иcss flexbox
. Работает во всех современных браузерах:
IE 10+, Chrome, Firefox, Safari 8+, Opera 17+.
Легкий (~36kb минифицированный js файл и ~9kb gziped), кастомизируемый, кроссбраузерный календарь, написан с использованиемes5
иcss flexbox
. Работает во всех современных браузерах:
IE 10+, Chrome, Firefox, Safari 8+, Opera 17+.
bower i --save air-datepicker
Либо можно скачать файлы напрямую с GitHub
Подключите стили и скрипты из папки/dist
:
<html>
<head>
<link href="dist/css/datepicker.min.css" rel="stylesheet" type="text/css">
<script src="dist/js/datepicker.min.js"></script>
</head>
</html>
Календарь автоматически проинициализируется на элементах с классом.datepicker-here
, при этом опции можно передать черезdata
атрибуты.
<input type='text' class="datepicker-here" data-position="right top" />
// Инициализация
$('#my-element').datepicker([options])
// Доступ к экземпляру объекта
$('#my-element').data('datepicker')
<input type='text' class='datepicker-here' />
Передайте параметр{multipleDates: true}
для выбора нескольких дат. Если требуется ограничить количество выбранных дат, то передайте необходимое число{multipleDates: 3}
.
<input type="text"
class="datepicker-here"
data-multiple-dates="3"
data-multiple-dates-separator=", "
data-position='right top'/>
Проинициализируйте плагин на элементе, который не является текстовым полем, например на<div> … </div>
, либо передайте параметр{inline: true}
.
<div class="datepicker-here"></div>
<input type="text"
class="datepicker-here"
data-min-view="months"
data-view="months"
data-date-format="MM yyyy" />
Чтобы ограничить выбор даты, используйтеminDate
иmaxDate
, которым нужно передать объект даты.
$('#minMaxExample').datepicker({
// Можно выбрать тольо даты, идущие за сегодняшним днем, включая сегодня
minDate: new Date()
})
Используйте парамтер{range: true}
для выбора диапазона. В качестве разделителя дат будет использованmultipleDatesSeparator
Для того, чтобы иметь возомжность выбрать одну и ту же дату, необходимо установить{toggleSelected: false}
.
<input type="text" data-range="true" data-multiple-dates-separator=" - " class="datepicker-here"/>
Для того, чтобы сделать невозмножным выбрать конкретные дни недели, можно воспользоваться методомonRenderCell
.
// Сделаем неактивными воскресенье и субботу
var disabledDays = [0, 6];
$('#disabled-days').datepicker({
onRenderCell: function (date, cellType) {
if (cellType == 'day') {
var day = date.getDay(),
isDisabled = disabledDays.indexOf(day) != -1;
return {
disabled: isDisabled
}
}
}
})
Air Datepicker позволяет менять содержимое ячеек как угодно. Для этого можно также воспользоваться методомonRenderCell
.
Давайте добавим вспомогательные элементы к нескольким датам и покажем случайный текст при выборе этих дат:
var eventDates = [1, 10, 12, 22],
$picker = $('#custom-cells'),
$content = $('#custom-cells-events'),
sentences = [ … ];
$picker.datepicker({
onRenderCell: function (date, cellType) {
var currentDate = date.getDate();
// Добавляем вспомогательный элемент, если число содержится в `eventDates`
if (cellType == 'day' && eventDates.indexOf(currentDate) != -1) {
return {
html: currentDate + '<span class="dp-note"></span>'
}
}
},
onSelect: function onSelect(fd, date) {
var title = '', content = ''
// Если выбрана дата с событием, то отображаем его
if (date && eventDates.indexOf(date.getDate()) != -1) {
title = fd;
content = sentences[Math.floor(Math.random() * eventDates.length)];
}
$('strong', $content).html(title)
$('p', $content).html(content)
}
})
// Сразу выберем какую-ниудь дату из `eventDates`
var currentDate = currentDate = new Date();
$picker.data('datepicker').selectDate(new Date(currentDate.getFullYear(), currentDate.getMonth(), 10))
Для добавления каких-либо действий с начала анимации или по ее окончанию, используйте опцииonShow
иonHide
$('#example-show-hide-callbacks').datepicker({
onShow: function(dp, animationCompleted){
if (!animationCompleted) {
log('start showing')
} else {
log('finished showing')
}
},
onHide: function(dp, animationCompleted){
if (!animationCompleted) {
log('start hiding')
} else {
log('finished hiding')
}
}
})
Для выбора времени используйте опцию{timepicker: true}
- она добавит время и пару ползунков, с помощью которых можно уставноить часы и минуты.
По умолчанию будет установлено текущее время на компьюетере пользователя, это значение можно изменять параметромstartDate
.
<div class="datepicker-here" data-timepicker="true"></div>
Подробнее о параметрах выбора времени можно почитать в Опциях.
Формат времени задается в объекте локализации, либо в парамтреtimeFormat
. По умолчанию используется 24-х часовой формат. Для выбора 12-ти часового формата вtimeFormat
нужно добавить символaa
илиAA
. После чего в виджете появятся обозочения 'AM' или 'PM', в зависимости от выбранного периода времени.
<div class="datepicker-here" data-timepicker="true" data-time-format='hh:ii aa'></div>
Для задания максимально/минимально возможных значений часов или минут используйте параметрыmaxHours
,minHours
,maxMinutes
,minMinutes
. Также время можно указывать в парамтерахminDate
иmaxDate
Давайте создадим календарь, где пользователь может выбрать время с 09:00 до 18:00, а в субботу и воскресенье с 10:00 до 16:00.
<input type='text' id='timepicker-actions-exmpl' />
<script>
// Зададим стартовую дату
var start = new Date(),
prevDay,
startHours = 9;
// 09:00
start.setHours(9);
start.setMinutes(0);
// Если сегодня суббота или воскресенье - 10:00
if ([6,0].indexOf(start.getDay()) != -1) {
start.setHours(10);
startHours = 10
}
$('#timepicker-actions-exmpl').datepicker({
timepicker: true,
startDate: start,
minHours: startHours,
maxHours: 18,
onSelect: function(fd, d, picker) {
// Ничего не делаем если выделение было снято
if (!d) return;
var day = d.getDay();
// Обновляем состояние календаря только если была изменена дата
if (prevDay != undefined && prevDay == day) return;
prevDay = day;
// Если выбранный день суббота или воскресенье, то устанавливаем
// часы для выходных, в противном случае восстанавливаем начальные значения
if (day == 6 || day == 0) {
picker.update({
minHours: 10,
maxHours: 16
})
} else {
picker.update({
minHours: 9,
maxHours: 18
})
}
}
})
</script>
Вы можете добавить свою локализацию в объект$.fn.datepicker.language["my-lang"]
и при вызове календаря передать название языка в параметрlanguage
$.fn.datepicker.language['my-lang'] = {...}
$('.my-datepicker').datepicker({
language: 'my-lang'
})
Также объект локализации можно передавать непосредственно вlanguage
$('.my-datepicker').datepicker({
language: {
days: [...]
...
}
})
Если в вашей локализации не будет хватать каких-то полей, то они будут взяты из языка по умолчанию (русский язык).
$.fn.datepicker.language['ru'] = {
days: ['Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'],
daysShort: ['Вос','Пон','Вто','Сре','Чет','Пят','Суб'],
daysMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
months: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
monthsShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'],
today: 'Сегодня',
clear: 'Очистить',
dateFormat: 'dd.mm.yyyy',
timeFormat: 'hh:ii',
firstDay: 1
};
Типstring
Значение по умолчанию""
Дополнительные классы для календаря.
Типboolean
Значение по умолчаниюfalse
Если true, то календарь будет виден постоянно.
Типstring|object
Значение по умолчанию"ru"
Язык календаря. Если передается строка, то поиск языка будет осуществляться в объектеDatepicker.language
Если передан объект, то данные будут браться из него.
Если в объекте локализации не будет хватать каких то полей, то они будут взяты из языка по умолчанию.
ТипDate
Значение по умолчаниюnew Date()
Дата, которая будет отображаться при инициализации календаря.
Типnumber
Значение по умолчанию""
Индекс дня, с которого начинается неделя. Возможные значение от 0 до 6, где 0 - воскресенье и 6 - суббота. По умолчанию берется из локализации, если значение передать сюда, то оно будет иметь больший приоритет.
Типarray
Значение по умолчанию[6, 0]
Массив индексов дней, которые будут считаться выходными днями. Им будет добавлен класс.-weekend-
. По умолчанию это суббота и воскресенье.
Типstring
Значение по умолчанию""
Желаемый формат даты, кобминация из d, m, yyyy, D, M, и т.д. По умолчанию берется из локализации, если передать значение сюда, то оно будет иметь больший приоритет.
Типstring|jQuery
Значение по умолчанию""
Альтернативное поле воода в значение которого будут попадать выбранные даты с форматомaltFieldDateFormat
.
Типstring
Значение по умолчанию"@"
Формат даты для альтернативного поля.
Типboolean
Значение по умолчаниюtrue
Если true, то клик на выделенной дате снимет выделение.
Типboolean
Значение по умолчаниюtrue
Если true, то по календарю можно будет осуществлять навигацию с помощью клавиатуры.
Сочетания клавиш:
Типstring
Значение по умолчанию"bottom left"
Позиционирование календаря отностиельно текстового поля. Первым значением задается основная ось позиционирования,
воторым - положение на этой оси. Например{position: "right top"}
- утсановит позицию клаендаря справа вверху от текстового поля.
Типnumber
Значение по умолчанию12
Отступ от основной оси позиционирования.
Типstring
Значение по умолчанию"days"
Начальный вид календаря. Возможноые значения:
days
- отображение дней месяцаmonths
- отображение месяцев одного годаyears
- отображение годов одной декадыТипstring
Значение по умолчанию"days"
Минимальное представление календаря, по наступлению которого, выбор ячейки приведет к ее активации, а не переходу к следующему виду.
Возможные значения такие же как и у параметраview
.
Типboolean
Значение по умолчаниюtrue
Если true, то будут отображаться дни других месяцев.
Типboolean
Значение по умолчаниюtrue
Если true, то можно будет выбрать дни из других месяцев.
Типboolean
Значение по умолчаниюtrue
Если true, то при выборе дней из других месяца, будет осуществялться переход к этому месяцу.
Типboolean
Значение по умолчаниюtrue
Если true, то при отображении декады, будут показаны годы из других декад.
Типboolean
Значение по умолчаниюtrue
Если true, то можно будет выбрать года из других декад
Типboolean
Значение по умолчаниюtrue
Если true, то при выборе года из другой декады, будет осуществлен переход к этой декаде.
ТипDate
Значение по умолчанию""
Минимальная дата для возможности выбора. Все даты, идущее до нее нельзя будет активировать.
ТипDate
Значение по умолчанию""
Максимальная дата для возможности выбора. Все даты, идущее после нее нельзя будет выбрать.
Типboolean
Значение по умолчаниюtrue
Если true, то при наступлении даты, которая была бы меньше минимально возможной или больше максимально возможной, деактвировались бы кнопки навигации 'вперед', 'назад'
Типboolean|number
Значение по умолчаниюfalse
Если true, то можно будет выбрать неограниченное количество дат. Если передать число, то количество выбираемых дат будет ограниченно этим числом.
Типstring
Значение по умолчанию","
Разделитель дат, который будет использован при объеденения нескольких дат в одну строку.
Типboolean
Значение по умолчаниюfalse
Если true, то будет включен режим выбора диапазона дат. В качестве разделителя будет использованmultipleDatesSeparator
Типboolean|Date
Значение по умолчаниюfalse
Если true, то будет отображена кнопка "Сегодня". Если передать объект даты, то при клике по кнопке будет осуществлен переход и последующий выбор этой даты.
// Выбор сегодняшнего дня
$('.datepicker').datepicker({
todayButton: new Date()
})
Типboolean
Значение по умолчаниюfalse
Если true, то будет отображена кнопка "Очистить".
Типstring
Значение по умолчанию"focus"
Тип события, по наступлению которого будет показан календарь.
Типboolean
Значение по умолчаниюfalse
Если true, то при активации даты, календарь закроется.
Типstring
Значение по умолчанию<svg><path d="M 17,12 l -5,5 l 5,5"></path></svg>
Контент кнопки 'предыдущий месяц|год|декада'.
Типstring
Значение по умолчанию<svg><path d="M 14,12 l 5,5 l -5,5"></path></svg>
Контент кнопки 'следующий месяц|год|декада'.
Типobject
Значение по умолчанию
navTitles = {
days: 'MM, <i>yyyy</i>',
months: 'yyyy',
years: 'yyyy1 - yyyy2'
};
Значение заголовка календаря в зависимости от текущего вида, можно использовать те же обозначения что и вdateFormat
. Недостающие поля будут взяты из значения по умолчанию. Также можно использовать html теги.
$('#my-datepicker').datepicker({
navTitles: {
days: '<h3>Выберете дату заезда</h3> MM, yyyy'
}
})
Типstring
Значение по умолчанию"monthsShort"
Какое поле из объекта локализации использовать в качестве названий месяцев, когдаview = "months"
.
Типboolean
Значение по умолчаниюfalse
Еслиtrue
, то будет добавлена возомжность выбора времени.
Типstring
Значение по умолчанию" "
Разделитель между датой и временем.
Типstring
Значение по умолчаниюnull
Формат времени. По умолчанию берется из локализации. Если передать значение сюда, то оно будет иметь больший приоритет.
Для включения 12-ти часового режима добавьте 'aa' или 'AA' в параметрtimeFormat
, например{timeFormat: "hh:ii AA"}
Возможные варианты:
Типnumber
Значение по умолчанию0
Минимальное значение часов от 0 до 23. Нельзя выбрать час меньше, чем переданное значение.
Типnumber
Значение по умолчанию23
Максимальное значение часов от 0 до 23. Нельзя выбрать час больше, чем переданное значение.
Типnumber
Значение по умолчанию0
Минимальное значение часов от 0 до 59. Нельзя вустановить значение минут меньше, чем переданное значение.
Типnumber
Значение по умолчанию59
Максимальное значение минут от 0 до 59. Нельзя вустановить значение минут больше, чем переданное значение.
Типnumber
Значение по умолчанию1
Шаг выбора часов.
Типnumber
Значение по умолчанию1
Шаг выбора минут.
Типfunction
Значение по умолчаниюnull
Функция обратного вызова при выборе даты.
Date
выбранной даты, если{multipleDates: true}
, то будет передан массив таких объектов.Типfunction
Значение по умолчаниюnull
Функция обратного вызова при появлении календаря.
false
, то анимация только началась, еслиtrue
- уже закончилась.Типfunction
Значение по умолчаниюnull
Функция обратного вызова при скрытии календаря.
false
, то анимация только началась, еслиtrue
- уже закончилась.Типfunction
Значение по умолчаниюnull
Функция обратного вызова при изменении месяца.
Типfunction
Значение по умолчаниюnull
Функция обратного вызова при изменении года.
Типfunction
Значение по умолчаниюnull
Функция обратного вызова при изменении декады.
Типfunction
Значение по умолчаниюnull
Функция обратного вызова при изменении вида календаря
Типfunction
Значение по умолчаниюnull
Функция обратного вызова при отрисовке ячейки календаря.
Функция должна возвращать объект, которой может состоять из трех полей:
{
html: '', // Кастомный контент ячейки
classes: '', // Дополнительные классы для ячейки
disabled: '' // true/false, если true, то ячейку нельзя будет выбрать
}
$('#my-datepicker').datepicker({
// Передаем функцию, которая добавляет 11 числу каждого месяца класс 'my-class'
// и делает их невозможными к выбору.
onRenderCell: function(date, cellType) {
if (cellType == 'day' && date.getDate() == 11) {
return {
classes: 'my-class',
disabled: true
}
}
}
})
Досутп к экземпляру плагина осуществляется черезdata
атрибут.
var myDatepicker = $('#my-elem').datepicker().data('datepicker');
myDatepicker.show();
Показывает календарь.
Скрывает календарь.
Удаляет календарь.
Переходит на следующий месяц если вид days, на следующий год если months, и следующую декаду если years.
Переходит на предыдщуий месяц если вид days, на предыдущий год если months, и предыдущую декаду если years.
Выбирает переданную дату или несколько дат, если передан массив с датами. Если{multipleDates: false}
и уже есть активная дата, то она будет деактивирована. Если{multipleDates: true}
то будет добавлена еще одна активная дата.
Date()
Снимает выделение с переданной даты.
Убирает выделение со всех активных дат.
Обновление опций календаря, после вызова метода он автоматически перерисуется. Можно обновлять сразу несколько параметров, для этого нужно передать объект с требуемыми полями.
var datepicker = $('#my-elem').datepicker().data('datepicker');
// Обновление одного параметра
datepicker.update('minDate', new Date())
// Обновление нескольких параметров
datepicker.update({
position: "top right",
maxDate: new Date(),
todayButton: true
})
Устанавливает новое представление для календаря.
datepicker.view = 'months';
Устанавливает новую отображаемую дату, нужно передать JavaScriptDate()
datepicker.date = new Date();
DOM элемент календаря
Массив выбранных дат