Не разрешать вводить числа между максимальным и минимальным значением

Я работаю над проектом Angular 4. У меня есть HTML <input type="number"> с minmax а также step атрибутов. Моя цель - не набирать цифры за пределами минимального и максимального диапазона, что удобно для пользователя. Как я могу это сделать?

function myFunction(e) {
    var min = -100;
    var max = 100;

    var txtValue = document.getElementById("txt").value;
    var pressedValue = e.key;

    var combined = parseFloat(txtValue, pressedValue);
    console.log(`OLD:${txtValue}\nNEW:${pressedValue}\nCOMBINED:${combined}`);
    if (combined > max) {

        e.preventDefault();
        console.log('ohhw snapp');
    }
}
<input type="number" id="txt" value="Hello" onkeydown="myFunction(event)" min="-100" max="100" step="0.05">

Мой пример JSFiddle

2 ответа

По причинам UX, я бы порекомендовал что-то подобное. Это может запутать пользователя, если он просто думает, что его клавиатура не работает.

$('.range-enforced').on('change', function(e){
  var min=parseFloat($(this).attr('min'));
  var max=parseFloat($(this).attr('max'));
  var curr=parseFloat($(this).val());
  if (curr > max) { $(this).val(max); var changed=true; }
  if (curr < min) { $(this).val(min); var changed=true; }
  if (changed) {
    $warning = $(this).siblings('.warning')
    $warning.text('Only ' + min + ' through ' + max + ' allowed');
    $warning.show()
    $warning.fadeOut(2500);
  }
});
input + .warning {
  background: #ffff99;
  display: inline-block
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" class="range-enforced" min="-100" max="100" />
<div class="warning" style="display: none;"></div>

Первая проблема, которую я вижу, это то, что вы предоставляете 2 параметра для parseFloat, который принимает только 1 (возможно, вы запутались с parseInt, который принимает 2 параметра - строку и основание. Сначала вы должны объединить числа и выполнить 1 анализирование с плавающей запятой для объединенного значения,

например

function myFunction() {
  var min = -100;
  var max = 100;
  
  var inputRef = document.getElementById("txt");
  var txtValue = inputRef.value;
  if(isNaN(parseFloat(txtValue))){
    console.log("warning input is not a number");
    return;
  }
  var newNum = parseFloat(txtValue);
  console.log(`NEW:${newNum}`);
  if (newNum > max || newNum < min) {
    console.log('input not in range (' + min + ", " + max + ")");
    inputRef.value = "";
  }
}
<input type="number" id="txt"
        onkeyup="myFunction()"
        min="-100"
        max="100"
        step="0.05"
        >

Вход вернется к пустому состоянию, если вход не находится в диапазоне при включении. Согласно комментарию выше, вы можете использовать это, чтобы уведомить пользователя о проблеме.

Другие вопросы по тегам