我有三个输入类型='范围'字段,它们具有不同的最大值但共享相同的容量。随着三个输入中的任何一个的每次改变,该容量都会降低。当容量达到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
}
});
答案 0 :(得分:6)
好的,您可以使用event.preventDefault()
来停止活动。您应该将函数绑定到这些范围滑块上的onchange
或oninput
事件并计算总和,检查它是否超过最大值,然后停止该事件。
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;" />
我使用 onclick
是因为我希望它在用户每次点击输入范围内的任何地方时都做出响应,而不仅仅是在用户根据浏览器“更改值”时做出响应。显然,如果您只想在用户更改滑块位置时触发事件,请使用 oninput
或 onchange
。
您似乎确实需要手动设置/覆盖 e.target.value
,因为 return false;
并没有真正做任何事情。事实上,上面的代码是一样的,没有返回false。
但是,对于移动设备,您需要使用 ontouchstart
而不是 onclick
。您还需要 return false;
才能使其工作。