Динамическое создание средства выбора даты jQuery с помощью altFields

Я динамически генерирую средство выбора даты, просто добавляя поле HTML в div:

<input type="text" value="" readonly="readonly" name="tier[2][publication_date]" id="publication_date_2" size="10" maxlength="10" tabindex="6" class="publication_date hasDatepicker">
<input type="hidden" name="tier[2][publication_date_db]" id="publication_date_db_2" value="">

Из-за того, как мы храним даты, у нас есть отдельное поле (altfield) для средства выбора даты, в котором хранится дата в формате нашей базы данных, выбранная пользователем.

Чтобы обработать выбор нескольких средств выбора даты, я назначаю класс и использую livequery для обнаружения onClicks после загрузки страницы:

$(".publication_date").livequery(function() {
                $(this).datepicker({
                    dateFormat: "dd M yy",
                    changeYear: true,
                    changeMonth: true,
                    onSelect: function(dateText, inst) {
                        console.log(inst);
                    }
                });
            });

У меня проблема в том, как средство выбора даты узнает, какое альтернативное поле заполнять? В одном средстве выбора даты обычно включают:

altField: '#start_date_datepicker_altfield', 
altFormat: 'yy-mm-dd',

для возникновения популяции.


person Community    schedule 07.09.2010    source источник


Ответы (2)


Я знаю, что в документации говорится, что для этого требуется селектор, но он также может принимать объект jQuery, поэтому просто используйте $(this).next() чтобы получить скрытое поле, например:

$(".publication_date").livequery(function() {
   $(this).datepicker({
      altField: $(this).next(), 
      altFormat: 'yy-mm-dd',
      dateFormat: "dd M yy",
      changeYear: true,
      changeMonth: true,
      onSelect: function(dateText, inst) {
        console.log(inst);
      }
   });
});

Поскольку большинство плагинов сводятся к $(input), этот ввод может быть селектором или объектом jQuery или элементом DOM, и он все равно будет работать нормально :)

person Nick Craver    schedule 07.09.2010
comment
Tsk tsk, создание двух jQuery вместо одного... ;-) (Хороший подход, однако.) - person T.J. Crowder; 07.09.2010
comment
@TJCrowder - в любом случае он создает объект jQuery при каждом щелчке (любой подход): $(altField).each(function() { $(this).val(dateStr); });, небольшие затраты + гораздо проще в обслуживании IMO :) - person Nick Craver; 07.09.2010
comment
Правильно, но ваша функция итератора создает один дважды при каждом щелчке: сначала в первой строке функции ($(this).datepicker), а затем снова во второй строке (altField: $(this).next(),). Просто дружеская придирка (на самом деле, просто шутка), любое влияние на производительность значительно подавляется тем фактом, что это обработчик событий в любом случае... :-) - person T.J. Crowder; 07.09.2010
comment
@TJCrowder - я думаю, вы что-то пропустили :) .livequery() != .live() :) Понижение производительности на самом деле заключается в том, что он .livequery() ищет новые элементы :) - person Nick Craver; 07.09.2010

Я не использовал livequery, но, судя по всему, вы можете получить id соответствующего элемента из this.id. В вашем примере HTML это будет «publication_date_2», из которого относительно легко создать необходимый идентификатор для альтернативного поля «publication_date_db_2» (вы можете сделать это еще проще, изменив свою стратегию именования поля).

Итак, возможно:

$(".publication_date").livequery(function() {
    $(this).datepicker({
        dateFormat: "dd M yy",
        changeYear: true,
        changeMonth: true,
        onSelect: function(dateText, inst) {
            console.log(inst);
        },
        altField: "#" + this.id.replace("_date_", "_date_db_"),
        altFormat: 'yy-mm-dd'
    });
});
person T.J. Crowder    schedule 07.09.2010
comment
Спасибо, я только что понял это. - person ; 07.09.2010
comment
Как вы предлагаете изменить соглашение об именах полей? - person ; 07.09.2010
comment
@ user275074: На самом деле тот, что у вас есть, достаточно прост (см. Выше). Я бы, наверное, использовал префикс, но это не имеет значения... - person T.J. Crowder; 07.09.2010