【问题标题】:Don't allow typing numbers between max and min value不允许在最大值和最小值之间输入数字
【发布时间】:2017-09-20 15:02:59
【问题描述】:

我正在开发一个 Angular 4 项目。我有一个 HTML <input type="number">min maxstep 属性。我的目标是防止输入超出用户友好的最小-最大范围的数字。我该怎么做?

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 example

【问题讨论】:

  • 您无法阻止某人输入不正确的值。而是向他们提供反馈,解释问题所在。

标签: javascript html user-experience


【解决方案1】:

出于用户体验的原因,我会推荐类似的东西。如果他们只是认为他们的键盘不工作,可能会使用户感到困惑。

$('.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>

【讨论】:

  • 你有一个不使用 jQuery 的答案吗?
  • 我手头没有(我通常不会写很多非库 JavaScript),但这应该可以在 jQuery 之外实现。
【解决方案2】:

我看到的第一个问题是你向 parseFloat 提供了 2 个参数,它只接受 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"
        >

如果输入不在 keyup 范围内,输入将重置为空。根据上面的评论,您可以使用它来通知用户问题。

【讨论】:

  • 谢谢,非常好的方法。但是不可能用点来输入值。例如:'15.65'
  • 我修复了样本以使用浮点数
  • 我更新了示例,如果用户输入的数字不在范围内,则将输入重置为空。如果能以某种方式告诉用户出了什么问题,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多