Ответ 1
Вы можете попробовать использовать $.datepicker.parseDate( format, value, settings )
в событии blur
, если функция возвращает и исключение, например
Можно выделить несколько исключений:
"Недопустимые аргументы", если формат или значение равно null
'Отсутствует номер в позиции nn', если в формате указано числовое значение это не обнаружено
'Неизвестное имя в позиции nn', если формат указан день или месяц это не обнаружено
'Неожиданный литерал в позиции nn', если формат указывает буквальный значение, которое затем не найдено
Если вы подняли в catch, вы можете показать свое предупреждение и принудительно сфокусироваться на поле.
код:
$(".datepicker").datepicker({
dateFormat: "dd-M-yy",
showOtherMonths: true
}).on("blur", function (e) {
var curDate = $(this).val();
try {
var r = $.datepicker.parseDate("dd-M-yy", curDate);
} catch(e) {
alert('Not VALID!');
$(this).focus()
}
});
Демо: http://jsfiddle.net/IrvinDominin/L6e6q/
UPDATE
Вы можете создать собственный виджет, например ui.datepicker2
usinf ui.widget.factory
.
Создавать плагины jQuery с поддержкой состояния, используя ту же абстракцию, что и все Виджеты jQuery UI.
Используя его, вы можете расширить значения по умолчанию и связать события keydown
и keyup
.
В keydown хранятся старое значение, а на клавиатуре проверяют ввод, а если нет, восстановите старое значение.
код:
$.widget("ui.datepicker2", {
_init: function () {
var $el = this.element;
$el.datepicker(this.options);
if (this.options && this.options.checkDate) {
$el.on("keydown", function (e) {
var curDate = $el.val();
$el.attr("oldValue", curDate);
return true;
});
$el.on("keyup", function (e) {
var curDate = $el.val();
try {
var r = $.datepicker.parseDate("dd-M-yy", curDate);
} catch (ex) {
alert('Not VALID!');
$el.val($el.attr("oldValue"));
$el.focus();
}
});
}
}
});
$(".datepicker").datepicker2({
dateFormat: "dd-M-yy",
showOtherMonths: true,
checkDate: true
})