5

我有三个输入 type='range' 字段,它们具有不同的最大值但共享相同的容量。随着三个输入中的任何一个的每次更改,此容量都会降低。当容量达到 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
    }
});
4

2 回答 2

10

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

这是一个纯 JS 解决方案(小提琴链接),可以很容易地用 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 );
});
于 2013-09-30T09:15:45.427 回答
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它是因为我希望它在用户每次点击输入范围内的任意位置时做出响应,而不仅仅是在用户根据浏览器“更改值”时做出响应。显然,使用oninputoronchange如果您只想在用户更改滑块位置时触发事件。

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


但是,对于移动设备,您需要使用ontouchstart而不是onclick. 你还需要return false;让它工作。

于 2021-02-22T17:12:43.647 回答