如何防止用户拖动HTML输入类型='范围'对吗?

时间:2013-09-30 08:29:13

标签: javascript jquery html

我有三个输入类型='范围'字段,它们具有不同的最大值但共享相同的容量。随着三个输入中的任何一个的每次改变,该容量都会降低。当容量达到0时,我应该阻止输入字段向右移动(从增加它们的值)并且只向左移动,但我不知道如何使用JS和jQuery来做它

这是输入的html

<input type="range" class="slider" id="woodSlider" min="0" value="0" max="1558">
<input type="range" class="slider" id="ironSlider" min="0" value="0" max="2555">
<input type="range" class="slider" id="stoneSlider" min="0" value="0" max="2451">

以下是降低容量的代码:

$("input").change(function() {  
    $("#capacityLeft").html(parseInt(holding.capacity) - 
         $("#woodSlider").val() -
         $("#ironSlider").val() -
         $("#stoneSlider").val());
    if(parseInt($("#capacityLeft").html()) <= 0) {
    // TODO: FIND OUT HOW TO STOP THE SLIDERS FROM MOVING
    }
});

2 个答案:

答案 0 :(得分:6)

好的,您可以使用event.preventDefault()来停止活动。您应该将函数绑定到这些范围滑块上的onchangeoninput事件并计算总和,检查它是否超过最大值,然后停止该事件。

Here's a pure JS solution(小提琴链接),可以很容易地用jQuery重写。

var maxTotal = 150, // define the max sum of values
    inputs = [].slice.call(document.getElementsByTagName('input')), // refrence to the elements
    getTotal = function(){ // helper function to calculate the sum
        var sum = 0;
        inputs.forEach( function(input){
           sum += parseInt(input.value, 10); 
        });
        return sum;
    },
    maxReached = function(e){  // check if the max is reached
        var sum = getTotal(), target;
        if(sum > maxTotal){
            target = e.target;
            // set the max possible value if the user, for example, clicks too far to the right
            target.value = target.value - (sum - maxTotal);
            // next line is just for demonstrational purposes
            document.getElementById('total').innerHTML = getTotal();

            // prevent increasing the value
            e.preventDefault();
            return false;
        }
        // next line is just for demonstrational purposes
        document.getElementById('total').innerHTML = getTotal();

        // everything's fine, nothing to do.
        return true;
    };

// attach the maxReached function to your inputs
inputs.forEach( function(input){
    input.addEventListener('input', maxReached );
});

答案 1 :(得分:0)

我摆弄了一段时间,这就是我能够自定义设置输入范围的值的方法(这段代码基本上实现了一个“切换”按钮):

let input = document.getElementById('myInput');
let currentValue = 0;
input.onclick = function(e) {
  currentValue = 1 - currentValue;
  e.target.value = currentValue;
  return false;
}
<input id="myInput" type="range" min="0" max="1" value="0" style="width: 600px;" />

JSFiddle

我使用 onclick 是因为我希望它在用户每次点击输入范围内的任何地方时都做出响应,而不仅仅是在用户根据浏览器“更改值”时做出响应。显然,如果您只想在用户更改滑块位置时触发事件,请使用 oninputonchange

您似乎确实需要手动设置/覆盖 e.target.value,因为 return false; 并没有真正做任何事情。事实上,上面的代码是一样的,没有返回false


但是,对于移动设备,您需要使用 ontouchstart 而不是 onclick。您还需要 return false; 才能使其工作。