Я пытаюсь написать плагин jQuery для отображения и ввода дат, используя средство выбора даты пользовательского интерфейса jQuery в качестве отправной точки.
Вызов должен выглядеть так:
jQuery(document).ready(function() {
jQuery(document).find('input.mydatepicker').mydatepicker({
myformat : 'mm/dd/yy'
});
});
так что любой ввод, имеющий class="mydatepicker" будет иметь поведение mydatepicker.
Загвоздка в том, что я хотел бы, чтобы myformat
поддерживал множество различных форматов даты, однако всякий раз, когда я использую функцию val()
для получения/установки даты, я хочу, чтобы она была в формате iso8601 yyyy-mm-dd
.
Итак, хотя я указал формат mm/dd/yy
выше для инициализации всех элементов, я хочу:
<input type="text" class="mydatepicker" id="myelement" value="02/23/2019">
var mydate = $('#myelement').val(); //mydate = '2019-02-23'
и
$('#myelement').val('2019-02-24');
<input type="text" class="mydatepicker" id="myelement" value="02/24/2019">
Используя методы, описанные здесь: Переопределить функцию jQuery .val()? это то, что я пробовал :
(function($) {
// options & defaults
var defaultOptions = {
myformat : 'mm/dd/yy'
};
// attach jQuery.UI datepicker with specified options
$.fn.mydatepicker = function(options) {
options = $.extend({}, defaultOptions, options || {});
return this.each( function() {
var jq = $(this);
jq.addClass('plugin-mydatepicker').datepicker({
dateFormat: options.myformat,
prevText: '<i class="fa fa-angle-left"></i>',
nextText: '<i class="fa fa-angle-right"></i>',
constrainInput: true,
onSelect: function(date) {
}
});
});
}
// override val() to get/set in ISO8601 regardless of format
var _origVal = $.fn.val;
$.fn.val = function(value) {
if ( $(this).hasClass('plugin-mydatepicker') ) {
if (arguments.length >= 1) {
// setter
return $(this).val('x' + value);
}
else {
// getter
return 'x' + $(this).val();
}
}
return _origVal.apply(this, arguments);
};
})(jQuery);
Здесь происходит несколько вещей:
- Я получаю ошибку «глубокой рекурсии» всякий раз, когда я вызываю val(), и я действительно не понимаю, почему. У меня нет опыта написания плагинов jQuery.
- Я еще не выполнил преобразование myformat‹->iso8601, поэтому открыт для предложений о том, как это сделать легко. Практически говоря,
myformat
может быть ограничен мм/дд/гг и дд/мм/гг, не нужно сходить с ума. - Чтобы пометить каждый элемент, к которому прикреплен плагин, я добавляю класс
plugin-mydatepicker
. Не уверен, что это лучший способ. - Я видел, как некоторые люди используют опцию
altFormat
в средстве выбора даты. Не заинтересован в этом подходе, если я могу его избежать, так как он требует создания второго скрытого поля ввода и синхронизации между ними. - Я немного нервничаю по поводу переопределения функции
val()
; Я также был бы открыт для альтернативной функции получения/установки в плагине, такой какmydateVal()
- Я очень открыт для использования какого-либо другого плагина, который уже существует! Просто сам не нашел...
Помощь?