【问题标题】:Allow setting of jquery ui slider to above max value or below the min value允许将 jquery ui 滑块设置为高于最大值或低于最小值
【发布时间】:2013-02-22 15:31:14
【问题描述】:

我有一个链接到数字文本框的 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,滑块将滑到最小值。

【问题讨论】:

  • 问题是调用了this function,这将强制您分配滑块的值适合最小和最大范围。简短的回答是“不,不可能在滑块上设置超出其范围的值”,除非您愿意覆盖我链接到的函数。
  • 重写该函数有多容易?我认为扩展 jquery-ui 库可能是实现这一目标的唯一方法。
  • 可能还不错。我看看我能不能想出点什么:)

标签: jquery-ui knockout.js slider


【解决方案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/

【讨论】:

  • 谢谢安德鲁...成功了!有什么办法可以阻止滑块调整大小吗?
  • @woggles:哎呀,没注意到……让我们看看
  • 实际上在我的情况下这并不重要,因为滑块设置为其封闭 div 宽度的 100%...尽管在其他情况下它可能会创建一些有趣的可用性场景 :)跨度>
  • 不幸的是,设置滑块宽度的代码隐藏在另一个函数中——我认为我也必须覆盖那个函数
  • 哦,听起来最终会变得相当复杂......我认为 Pauls 回答他在哪里调整滑块的最小值或最大值可能是一个更好的解决方案
【解决方案2】:

改编自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

【讨论】:

  • 等一下,要为此设置一个小提琴,不太对。
  • 谢谢,好主意,但问题是它会永久更改滑块最小值。我希望滑块保留其范围,用户使用它来更改值。
  • 啊,明白了。我会看看我能做什么。 :)
  • 站在巨人的肩膀上等等,所以我不能承担太多的功劳! :)
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多