Ваша проблема в том, что вы устанавливаете неправильный value
на range
, когда вы вводите value
во входном тексте.
Поскольку вы устанавливаете значение на closestVal
в то время как он должен быть соответствующим index
из closestVal
, поэтому он попадает только в середину, когда closestValue
равен 10
, и до конца для других значений, которые выше max
.
Решение:
Вам необходимо изменить это:
$(this).next('input[type=range]').val(closestVal);
Чтобы получить индекс этого значения из массива stepVal
при вводе значенияв input
.
$(this).next('input[type=range]').val(stepVal.indexOf(closestVal));
Демо:
stepVal = [10, 35, 50, 90, 100, 135, 155, 170, 190, 220, 230, 250, 270, 290, 310, 320, 350, 365, 400];
$('.box').each(function() {
$(this).on('input', 'input[type="range"]', function() {
$(this).prev('input[type=text]').val(stepVal[this.value]);
});
$(this).on('blur', 'input[type="text"]', function() {
var textVal = $(this).val();
var closestVal = stepVal.reduce(function(prev, curr) {
return (Math.abs(curr - textVal) < Math.abs(prev - textVal) ? curr : prev);
});
$(this).val(closestVal);
$(this).next('input[type=range]').val(stepVal.indexOf(closestVal));
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="box">
<input type="text" value="10">
<input type="range" min="0" value="0" max="18" step="1">
</div>
<div class="box">
<input type="text" value="10">
<input type="range" min="0" value="0" max="18" step="1">
</div>