jQuery UI: Customized datepicker
Написать этот код меня подтолкнул комментарий, но идея сделать такую плюшку была давно.
Смысл простой до нельзя - надо на стандартном календаре выделять определенные дни. Стандартными средствами этого естественно сделать нельзя. Хачить ui.datepicker.js тоже нельзя, при этом желательно еще передавать список дней прямо в конструктор календаря. Нужно выкрутится, ну в общем как всегда.
Начинаем кое-как обживаемся в тех узких рамках в которые себя загнали - используем замыкания и делегацию и прочие малоиспользуемых плюшки типа функции apply и регулярных выражений.
(function($) {
/**
* autor: CTAPbIu_MABP
* email: ctapbiumabp@gmail.com
* site: http://mabp.kiev.ua/2009/08/11/customized-datepicker/
* license: MIT & GPL
* last update: 11.08.2009
* version: 1.0
*/
// сохраняем старые функции
var old_datepicker = $.fn.datepicker;
var old_generateHTML = $.datepicker._generateHTML;
// и делигируем их новым
$.datepicker._generateHTML = function(inst) {
// получаем календарь ввиде raw-html
var _generateHTML = old_generateHTML.apply(this, arguments),
// выгребаем даты для этого календаря
dates = inst.settings.hightlight.values;
titles = inst.settings.hightlight.titles;
// и начинаем расскрашивать
for (var i in dates){
if (dates[i].getFullYear() == inst.drawYear && dates[i].getMonth() == inst.drawMonth){
_generateHTML = _generateHTML.replace(
// магия регулярок
new RegExp('<a class="([^"]+)" href="#">' + dates[i].getDate() + '</a>','i'),
function(link, classes){
// еще больше магии
return link.replace(classes, classes + ' ui-state-custom' +
(titles[i] ? '" title="'+ titles[i] : ''));
});
}
}
return _generateHTML;
};
// делегируем конструктор
$.fn.datepicker = function(options){
// новые опции преобразовываем к объекту
options.hightlight = $.extend(
{format:$.datepicker._defaults.dateFormat, values:[], titles:[], settings:{}},
options.hightlight
);
// сразу превращаем даты в объекты типа Date для того чтобы сохранить
options.hightlight.values = $.map(options.hightlight.values, function(value){
return $.datepicker.parseDate(options.hightlight.format, value, options.hightlight.settings);
});
return old_datepicker.apply(this, [options]);
};
})(jQuery);
Сначала очень долго думал как же для каждого инстанса календаря сделать свою функцию generateHTML с замкнутыми датами, но потом обнаружил что разработчики тоже сильно не парились и все совали в $.data и я тоже решил этим воспользоваться. Как никак уже готовое решение и переиспользование кода.
Пока писал, обнаружил еще одно забавное недокументированую (кажется) функцию, оказывается есть отдельный CSS класс для выходных, к которому нет реализации. Вот я ее в пример и добавил.
Используется это все вот так.
.ui-datepicker-week-end .ui-state-default{
border: 1px solid #ffa1a1;
}
.ui-state-custom {
border: 1px solid #f0f !important;
}
$("#datepicker").datepicker({
firstDay: 1 ,
hightlight : {
format:"dd/mm/yy",
values:["1/08/2009","5/08/2009","15/08/2009"],
titles:["Рас","Два","Три"],
settings:{}
}
});
Проще не бывает, а скачать можно тут
Свежие комментарии