2013-03-07 66 views
3

我有一个jQuery UI滑块链接到数字文本框。滑块具有最大值和最小值。允许将jquery UI滑块设置为高于最大值或低于最小值

请参阅ui slider with text box inputUsing knockout js with jquery ui sliders淘汰js实施。

我的问题是:是否可以将滑块的值设置为高于最大值或低于最小值?

如果value超出范围设置为范围的最大值或最小值:

$(element).slider("value", value); 

因此,例如,说的滑块代表月薪50和100月薪的百分比设置为10000.如果滑动滑块,它将从5000到10000变化,但我仍然希望用户能够输入范围以外的值。因此,如果用户输入12000,则滑块将滑动到最大值,并且如果用户输入2000,则滑块将滑动到最小值。

+0

的问题是,[此功能](https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.slider.js#L505 )被调用,这将强制您将滑块分配到最小和最大范围内的值。简短的回答是“不,不可能在其范围之外的滑块上设置一个值”,除非您愿意覆盖我链接的功能。 – 2013-03-07 12:56:43

+0

重写该功能有多容易?我认为扩展jquery-ui库可能是实现这一目标的唯一途径。 – woggles 2013-03-07 13:05:04

+0

可能不会太糟糕。我会看看我能不能拿出一些东西:) – 2013-03-07 13:05:46

回答

1

从答案适应于Using knockout js with jquery ui sliders

<h2>Slider Demo</h2> 
Savings: 
<input data-bind="value: savings, valueUpdate: 'afterkeydown'" 
/> 
<div style="margin: 10px" data-bind="slider: savings, sliderOptions: {min: 0, max: 100, range: 'min', step: 1}"></div> 

而这里的自定义绑定:

ko.bindingHandlers.slider = { 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     var options = allBindingsAccessor().sliderOptions || {}; 
     $(element).slider(options); 
     ko.utils.registerEventHandler(element, "slidechange", function (event, ui) { 
      var value = valueAccessor(); 
      if(!(value < $(element).slider('option', 'min') || value > $(element).slider('option', 'max'))) 
      { 
      valueAccessor(ui.value); 
      } 
     }); 
     ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
      $(element).slider("destroy"); 
     }); 
     ko.utils.registerEventHandler(element, "slide", function (event, ui) { 
      var observable = valueAccessor(); 
      observable(ui.value); 
     }); 
    }, 
    update: function (element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     if (isNaN(value)) value = 0; 
     if (value < $(element).slider('option', 'min')) { 
      value = $(element).slider("option", "min"); 
     } else if (value > $(element).slider('option', 'max')) { 
      value = $(element).slider("option", "max"); 
     } 
     $(element).slider("value", value); 

    } 
}; 


var ViewModel = function() { 
    var self = this; 

    self.savings = ko.observable(10); 
    self.spent = ko.observable(5); 
    self.net = ko.computed(function() { 
     return self.savings() - self.spent(); 
    }); 
}; 

ko.applyBindings(new ViewModel()); 

我改编自这个答案的jsFiddle了。

+0

挂起,为此设置一个小提琴,这是不正确的。 – 2013-03-07 12:50:28

+0

谢谢,好主意,但问题在于它会永久更改滑块分钟。我希望滑块保留其范围,用户使用它来更改值。 – woggles 2013-03-07 12:55:08

+0

啊,知道了。我会看看我能做什么。 :) – 2013-03-07 13:02:56

1

您可以通过重写_trimAlignValue功能,我在我的评论指出实现这一目标:

$.ui.slider.prototype._trimAlignValue = function (val) { 
    var step = (this.options.step > 0) ? this.options.step : 1, 
     valModStep = val % step, 
     alignValue = val - valModStep; 

    if (Math.abs(valModStep) * 2 >= step) { 
     alignValue += (valModStep > 0) ? step : (-step); 
    } 
    return parseFloat(alignValue.toFixed(5)); 
}; 

这将影响每一个滑块在页面上 - 如果这不是你应该换此功能所需的效果在你自己的插件中(如果需要的话,我可以提供一个例子)。

这与您现有的KnockoutJS自定义绑定结合起来似乎效果不错。

实施例:http://jsfiddle.net/Aa5nK/7/

+0

谢谢安德鲁...诀窍!有什么办法可以阻止滑块的大小调整吗? – woggles 2013-03-07 13:29:37

+0

@woggles:哎呀,甚至没有注意到...让我们看看 – 2013-03-07 13:30:25

+0

其实它并不重要在我的情况下,因为滑块设置为其封闭div的宽度的100%...虽然它可能会在其他情况下创建一些有趣的可用性场景:) – woggles 2013-03-07 13:33:46

相关问题