HTML5输入类型范围 - 非线性序列?

时间:2014-10-29 21:58:06

标签: javascript html5 angularjs

我想使用滑块控件输入选择。可能的值为:5000,25000,50000,75000和100000.但是,我无法获得范围输入以限制这些选择。我最接近的是:

<datalist id="valid-options">
  <option>5000</option>
  <option>25000</option>
  <option>50000</option>
  <option>75000</option>
  <option>100000</option>
</datalist>
<input type="range" min="5000" max="100000" step="5000" list="valid-options" ng-model="selectedValue" />

您可以在此处查看完整示例:http://jsfiddle.net/au14Lv2t/1/

此解决方案的问题在于它允许使用无效值,如10000,15000等。

我正在寻找一个AngularJS(或纯HTML5 / JS / CSS)解决方案。我宁愿不介绍jQuery。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以搜索最接近的有效值,并将输入值设置为每个值更改事件的值

var inputElement = document.getElementById('customRangeInput');

inputElement.oninput = setInput;
inputElement.onchange = setInput;   // IE fix

function setInput(){
    inputElement.value = closestValue(inputElement.value);
}

var validValues = [5000,25000,50000,75000,100000];
function closestValue(input)
{
    var differences = [];
    for (var i = 0; i < validValues.length; i++)    
        differences.push( Math.abs(validValues[i] - input));

    var index = indexOfSmallest(differences);
    return validValues[index];      
}

function indexOfSmallest(inputArray) {
    var lowest = 0;
    for (var i = 1; i < inputArray.length; i++) {
        if (inputArray[i] < inputArray[lowest]) lowest = i;
    }
    return lowest;
}

html应该是这样的

<input id="customRangeInput" type="range" min="5000" max="100000" step="5000" list="valid-options" ng-model="selectedValue" />Selected Value: {{ selectedValue }}</div>

答案 1 :(得分:1)

你需要使用属性步骤,让你决定每一步的数量,对于你的例子,大多数值是25000 所以make step =&#34; 25000&#34;

<input type="range" min="0" max="100000" step="25000">

并解决5000值......在你的例子中你的第一个值是5000,你所做的就是如果你得到的是0这是你的低值5000 ...其他值增加25000 ...希望这有帮助。

在这种情况下你不需要数据专家。

答案 2 :(得分:1)

您可以使用范围滑块操作的地图,而不是尝试直接使用这些值,因此您的ng模型类似于myrangeIndex,当您绑定输出元素时,使用{{1}获取价值。同样,当您在其他地方使用该值时,您需要先查找它。如果您知道元素列表可能会在以后增长/缩小,则可以使用rangeValues[myrangeIndex],这样您只需要在一个位置更新代码。如果可以从序数值计算值,则可以在加载控制器时简单地填充rangeValues,例如,对于任何给定的max="{{rangeValues.length}}"$scope.rangeValues = f(1,100);