Главная > JavaScript, Программирование > jQuery UI: Customized datepicker

jQuery UI: Customized datepicker

11 Август 2009

Написать этот код меня подтолкнул комментарий, но идея сделать такую плюшку была давно.

Смысл простой до нельзя - надо на стандартном календаре выделять определенные дни. Стандартными средствами этого естественно сделать нельзя. Хачить 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:{}
	}
});

Проще не бывает, а скачать можно тут

  1. 12 Август 2009 в 11:36 | #1
    ахуенно!
  2. 12 Август 2009 в 11:37 | #2
    какой то плагинчик подтормаживает :( может акисмет?
  3. 12 Август 2009 в 12:05 | #3
    нет не акисмет, я вчера тоже заметил, на сравнении версий очень сильные тормоза были
  4. 12 Август 2009 в 13:55 | #4
    Да, датапикер вообще достаточно тяжёлый... А вот подогнать цвета под свой дизайн.... реально злые люди делали все css-ки, все эти сложные комбинации классов в разных местах... а статья - гут (-:
  5. 12 Август 2009 в 14:07 | #5
    я в цсс даже не лезу, если надо чтото перекрыть пишу !important
  6. 12 Август 2009 в 15:27 | #6
    thx! как раз недавно понадобилось переписать старый календарик
  7. 12 Август 2009 в 15:29 | #7
    ёбни часть на пхп, я рядом поставлю
  8. 12 Август 2009 в 15:34 | #8
    а что от пхп части надо?
  9. 12 Август 2009 в 15:37 | #9
    выгрести даты и заголовки всех постов и засунуть в json, тут кстати надо подумать стоит ли грести все или лучше ajax'ом тянуть для каждого месяца если их стопицот. я просто ебал в нос вордпресс, не хочу в код лесть.
  10. 12 Август 2009 в 15:44 | #10
    @CTAPbIu_MABP это надо применить к вордпресу?
  11. 12 Август 2009 в 15:44 | #11
    угу
  12. 12 Август 2009 в 15:45 | #12
    ой, только не в меня :)
  13. 12 Август 2009 в 15:48 | #13
    тут больше никого нет :)
  14. 12 Август 2009 в 15:51 | #14
    эх... ну давай седня вечером писну только по-месячно, ок
  15. 19 Август 2009 в 07:59 | #15
    мда, а не проще было почитать про и сдедать правильные выводы, а не кидаться регексами на html? http://jqueryui.com/demos/datepicker/#event-beforeShowDay http://docs.jquery.com/UI/Datepicker#event-beforeShowDay
  16. 19 Август 2009 в 08:11 | #16
    а вот вам и пример http://groups.google.com/group/jquery-ui/browse_thread/thread/67b8248000974f79
  17. 19 Август 2009 в 08:15 | #17
    та и вот еще, понять можно об чём http://blog.eschedule.ca/post/2008/12/02/Using-beforeShowDay-to-display-different-employee-schedule-states.aspx
  18. 19 Август 2009 в 08:48 | #18
    maserg, ок, я - лох.
  19. Miller
    16 Сентябрь 2009 в 08:07 | #19
    Неплохо было бы добавить возможность задания ссылки на конкретную дату.
  20. 16 Сентябрь 2009 в 08:41 | #20
    @Miller maserg уже обяснил что я тупанул ;)
Комментирование отключено.