Установить min / max для каждого дескриптора диапазона в слайдере jQuery UI?

Я использую слайдер jQuery, где пользователи могут выбрать временной диапазон от 00:00 до 1d + 12: 00. 36 часов вместе. Так или иначе.

Я хотел бы применить минимальные и максимальные значения к своим ручкам в зависимости от того, на что они установлены. Вот мои требования:

  1. левая ручка никогда не может перейти за полночь на следующий день (максимум 24 часа)
  2. левая ручка никогда не может отклоняться более чем на -24 часа от правой ручки (мин - значение правой ручки минус 24 часа)
  3. правая ручка никогда не может выходить более чем на +24 часа от левой ручки (макс. значение левой ручки плюс 24 часа)

Насколько я понимаю, минимальные и максимальные значения могут применяться только к элементу управления ползунком с одним дескриптором, а не к ползунку диапазона?

Можно ли установить минимальные и максимальные значения отдельно для обоих маркеров?

Я пробовал инициализировать его таким образом, но не повезло:

$(".timing-slider", timing).slider({
    range: true,
    min: [0, 0],
    max: [24, 36],
}

person Robert Koritnik    schedule 11.08.2011    source источник


Ответы (1)


Этот слайдер jQuery UI расширение удовлетворяет всем верхним требованиям.

Мне удалось изменить слайдер пользовательского интерфейса jQuery по умолчанию, чтобы включить еще несколько свойств конфигурации:

  • minRangeSize - устанавливает минимальный размер диапазона, поэтому диапазоны не могут быть уже, чем это значение.
  • maxRangeSize - устанавливает максимальный размер диапазона, поэтому диапазоны не могут быть шире этого значения
  • autoShift - если установлено в true, он автоматически перетаскивает другой дескриптор, когда ширина диапазона достигает максимума; при установке на false дескриптор просто не может быть перемещен за пределы максимальной ширины диапазона
  • lowMax - устанавливает верхнюю границу нижнего дескриптора, поэтому невозможно установить нижний дескриптор за пределами этого значения
  • topMin - устанавливает нижнюю границу верхнего маркера, поэтому невозможно установить верхний маркер ниже этого значения

Это рабочий пример такого ползунка диапазона.

Это дополнительный код, который нужно запускать после слайдера jQuery. Фактически он переписывает одну из своих внутренних функций, чтобы также проверить новые настройки. Этот код изменит код ползунка только после загрузки скрипта ползунка (следовательно, первый оператор if, который проверяет, загружен ли виджет ползунка):

(function ($) {
    if ($.ui.slider)
    {
        // add minimum range length option
        $.extend($.ui.slider.prototype.options, {
            minRangeSize: 0,
            maxRangeSize: 100,
            autoShift: false,
            lowMax: 100,
            topMin: 0
        });

        $.extend($.ui.slider.prototype, {
            _slide: function (event, index, newVal) {
                var otherVal,
                newValues,
                allowed,
                factor;

                if (this.options.values && this.options.values.length)
                {
                    otherVal = this.values(index ? 0 : 1);
                    factor = index === 0 ? 1 : -1;

                    if (this.options.values.length === 2 && this.options.range === true)
                    {
                        // lower bound max
                        if (index === 0 && newVal > this.options.lowMax)
                        {
                            newVal = this.options.lowMax;
                        }
                        // upper bound min
                        if (index === 1 && newVal < this.options.topMin)
                        {
                            newVal = this.options.topMin;
                        }
                        // minimum range requirements
                        if ((otherVal - newVal) * factor < this.options.minRangeSize)
                        {
                            newVal = otherVal - this.options.minRangeSize * factor;
                        }
                        // maximum range requirements
                        if ((otherVal - newVal) * factor > this.options.maxRangeSize)
                        {
                            if (this.options.autoShift === true)
                            {
                                otherVal = newVal + this.options.maxRangeSize * factor;
                            }
                            else
                            {
                                newVal = otherVal - this.options.maxRangeSize * factor;
                            }
                        }
                    }

                    if (newVal !== this.values(index))
                    {
                        newValues = this.values();
                        newValues[index] = newVal;
                        newValues[index ? 0 : 1] = otherVal;
                        // A slide can be canceled by returning false from the slide callback
                        allowed = this._trigger("slide", event, {
                            handle: this.handles[index],
                            value: newVal,
                            values: newValues
                        });
                        if (allowed !== false)
                        {
                            this.values(index, newVal, true);
                            this.values((index + 1) % 2, otherVal, true);
                        }
                    }
                } else
                {
                    if (newVal !== this.value())
                    {
                        // A slide can be canceled by returning false from the slide callback
                        allowed = this._trigger("slide", event, {
                            handle: this.handles[index],
                            value: newVal
                        });
                        if (allowed !== false)
                        {
                            this.value(newVal);
                        }
                    }
                }
            }
        });
    }
})(jQuery);
person Robert Koritnik    schedule 12.08.2011
comment
Это просто УДИВИТЕЛЬНО! У вас есть это на GitHub? - person Pedro Peixoto; 10.10.2013
comment
@PedroPeixoto: пока нет, но это было в плане уже давно. Пока что я всего лишь написал сообщение в блоге со всем необходимым кодом. Не стесняйтесь проверить это. - person Robert Koritnik; 10.10.2013
comment
@RobertKoritnik. Это отличный материал! Огромное спасибо! - person BernardA; 07.12.2013