Диапазон выбора даты jQuery с клонированными элементами формы

#jquery #jquery-ui #datepicker #clone #jquery-ui-datepicker

#jquery #jquery-пользовательский интерфейс #выбор даты #клонировать #jquery-пользовательский интерфейс-выбор даты

Вопрос:

У меня есть динамическая форма, которую можно клонировать, но пользовательская функция выбора диапазона ограничивает конечную дату каждого клона первым элементом даты начала.

Я использую SheepIt! плагин для клонирования моих элементов формы.

Рабочий пример:http://jsfiddle.net/YWdV7/15 /

* Примечание: добавление / удаление функций, не работающих в fiddle, но пример ограничения диапазона дат, как описано ранее

Начальная функция для первых полей даты и функция клонирования:

 <script type="text/javascript">
$(document).ready(function() {

    var container = $('#container').sheepIt(
    {
            separator: '',
            allowRemoveLast: true,
            allowRemoveCurrent: false,
            allowRemoveAll: false,
            allowAdd: true,
            allowAddN: false,
            maxFormsCount: 10,
            minFormsCount: 0,
            iniFormsCount: 1
        }   
        );
    });

    $(function() {
        $( ".date" ).datepicker({   
            showOn: "both",
            buttonImage: "../../media/icons/calendar.png",          
            changeMonth: true,
            changeYear: true,
            yearRange: '2011:2050',
            beforeShow: customRange 
        }); 
    });

    function customRange(input) {
        if ($(input).hasClass('end_date')) {
            var minDate = new Date($('.start_date').val());
            minDate.setDate(minDate.getDate()   1)
            return {
                minDate: minDate
            };
        }
    };
</script>
  

Функция для повторного запуска выбора даты при нажатии кнопки клонирования:

 <script type="text/javascript">
$('#container_add').live('click', function() {  
    $('.date').datepicker({
        showOn: "both",
        buttonImage: "../../media/icons/calendar.png",          
        changeMonth: true,
        changeYear: true,
        yearRange: '2011:2050',
        beforeShow: customRange 
    })

    function customRange(input) {
        if ($(input).hasClass('end_date')) {
            var minDate = new Date($('.start_date').val());
            minDate.setDate(minDate.getDate()   1)
            return {
                minDate: minDate
            };
        }
    };

});
</script>
  

Ответ №1:

Несколько вещей о вашем коде:

  • $(function() {}) такой же, как $(document).ready(function() {}) .
  • customRange(input) требуется определить только один раз. Если он определен несколько раз, последний определенный переопределит предыдущие (точно так же, как переназначение переменной).
  • В customRange(input) вы действительно хотите получить соответствующий, .start_date а не просто любой .start_date . Итак, вам следует использовать $(input).prevAll('.start_date') вместо $('.start_date') .
  • Чтобы сохранить код СУХИМ, вы можете повторно использовать параметры выбора даты.

Вот пример:http://jsfiddle.net/william/YWdV7/18 /.

Комментарии:

1. Большое спасибо за помощь, я почти на месте! В моем реальном приложении есть дополнительные разделы (отличные от образца, который я опубликовал). Когда я захожу, чтобы добавить дополнительные разделы, функция пользовательского диапазона больше не работает. Смотрите jsfiddle.net/YWdV7/23 Есть идеи?

2. Это вопрос изменения селектора: jsfiddle.net/william/YWdV7/24 . Сделайте перерыв и ознакомьтесь с методами обхода jQuery . Это сэкономит вам много времени в долгосрочной перспективе.

3. Спасибо за ссылку и за помощь! Я действительно ценю это!