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

Я хочу использовать jquery ui, чтобы создать ползунок с двумя ручками, которые поддерживают минимальное расстояние между ними. Если левая ручка пытается пересечь правую ручку, правую ручку следует подтолкнуть вперед. И наоборот. Вот пример (не говоря уже о перекрытии, это не важно):

http://jsfiddle.net/SP5VQ/

Это работает до тех пор, пока движение медленное, но если мышь движется слишком быстро, она не работает в сценарии «толкания». Я думаю, что установка значений ползунков из события «ползунок» может быть ошибкой.


person Eyal    schedule 20.07.2012    source источник
comment
Я протестировал ваш jsFiddle в Chrome, Firefox и IE8 без каких-либо проблем при слишком быстром перемещении мыши после удержания ручки. Пожалуйста, попробуйте использовать jsFiddle с другой мышью, поскольку та, которую вы используете, может иметь неисправную кнопку левой кнопки мыши (кратковременный перерыв во время перемещения - это все, что требуется для возникновения проблемы, которую вы описываете). Кроме того, удалите в своем ответе неважную часть, так как это противоречит требованию о минимальном расстоянии между ручками. Сказав это, вы, возможно, захотите пересмотреть свой вопрос, чтобы спросить, как иметь минимальное расстояние между каждой ручкой. Ваше здоровье!   -  person arttronics    schedule 21.07.2012


Ответы (1)


Это сработало. Я скопировал код из $.ui.slider.prototype._slide и удалил часть, которая проверяла, больше ли левая ручка, чем правая. Теперь работает хорошо.

http://jsfiddle.net/Nk8ap/

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

          if ( this.options.values && this.options.values.length ) {
            otherVal = this.values( index ? 0 : 1 );
            if ( newVal !== this.values( index ) ) {
              newValues = this.values();
              newValues[ index ] = newVal;
              // 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
              } );
              otherVal = this.values( index ? 0 : 1 );
              if ( allowed !== false ) {
                this.values( index, newVal, 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 );
              }
            }
          }
        }
person Eyal    schedule 20.07.2012
comment
Я думаю, что это намного лучше, чем поведение ползунка пользовательского интерфейса по умолчанию. Хорошая работа. - person zuallauz; 23.08.2012