javascript - html <input type ="text"/> 仅包含最小值和最大值的数字

标签 javascript html validation input

我正在尝试让 min=""和 max=""属性适用于仅数字输入。使用<input type="number">由于浏览器对本地化的支持很差,这是不可能的(在输入和提交中,点应该是千位分隔符,逗号作为小数分隔符)。 最佳情况下,在每个表单提交时,它会检查这些特定字段的数字是否遵循模式并且在正确的范围内,就像它本身对 type="number"输入所做的那样。

或者,如果可能或更简单,我也愿意使用 <input type="number" />只要值=“123,12”、用户输入和提交给服务器的值都接受模式、货币符号和最重要的逗号。

到目前为止,我使用pattern="-?(\d+|\d{1,3}(\.\d{3})*)(,\d+)?"它已经验证了除最小值和最大值之外的输入。

预期的行为是在<input type="text" pattern"-?(\\d+|\\d{1,3}(\\.\\d{3})*)(,\\d+)?" min="0" max="1500" />上它可以让我输入任何我想要的值,但是在提交表单时,检查该字段的数字解析值(省略货币符号或点,将逗号理解为小数)是否在 0 到 1500 之间的范围内。最佳,但是这个没关系,我还想要带有step =“0.01”的增量和减量箭头,例如type =“number”输入。

遗憾的是,我完全不知道如何在每个字段的基础上实现这一点,并且不在每个表单提交按钮上运行全局 JavaScript,如果不是每个输入都符合条件,就会阻止默认值。但即使我这样做了,我将如何显示 type="number"给我的正确(本地化)警告?

最佳答案

$("input[data-type='currency']").on({
    keyup: function() {
      formatCurrency($(this));
    },
    blur: function() { 
      validateCurrency($(this));
      formatCurrency($(this), "blur");
    }
});

function validateCurrency(input){
    var c = parseFloat(input.val().replace(/\,|$/g,'').replace('$',''));
    if(c<input.attr('min')){
        input.val(input.attr('min'));
    }else if(c>input.attr('max')){
        input.val(input.attr('max'));
    }
}
function formatNumber(n) {
  // format number 1000000 to 1,234,567
  return n.replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",")
}


function formatCurrency(input, blur) {
  // appends $ to value, validates decimal side
  // and puts cursor back in right position.
  
  // get input value
  var input_val = input.val();
  
  // don't validate empty input
  if (input_val === "") { return; }
  
  // original length
  var original_len = input_val.length;

  // initial caret position 
  var caret_pos = input.prop("selectionStart");


  // check for decimal
  if (input_val.indexOf(".") >= 0) {

    // get position of first decimal
    // this prevents multiple decimals from
    // being entered
    var decimal_pos = input_val.indexOf(".");

    // split number by decimal point
    var left_side = input_val.substring(0, decimal_pos);
    var right_side = input_val.substring(decimal_pos);

    // add commas to left side of number
    left_side = formatNumber(left_side);

    // validate right side
    right_side = formatNumber(right_side);
    
    // On blur make sure 2 numbers after decimal
    if (blur === "blur") {
      right_side += "00";
   }
    
    // Limit decimal to only 2 digits
    right_side = right_side.substring(0, 2);

    // join number by .
    input_val = "$" + left_side + "." + right_side;

  } else {
    // no decimal entered
    // add commas to number
    // remove all non-digits
    input_val = formatNumber(input_val);
    input_val = "$" + input_val;
    
    // final formatting
    if (blur === "blur") {
      input_val += ".00";
    }
  }
  
  // send updated string to input
  input.val(input_val);

  // put caret back in the right position
  var updated_len = input_val.length;
  caret_pos = updated_len - original_len + caret_pos;
  input[0].setSelectionRange(caret_pos, caret_pos);
}
input {
  border: 2px solid #333;
  border-radius: 5px;
  color: #333;
  font-size: 32px;
  margin: 0 0 20px;
  padding: .5rem 1rem;
  width: 50%;

}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" name="currency-field" id="currency-field" pattern="^\$\d{1,3}(,\d{3})*(\.\d+)?$" value="" data-type="currency" min="1000" max="1000000" placeholder="$200,000.00">
Minimum: 1000, Maximum: 1,000,000

代码作者:Wade Williams @559wade

调整:我刚刚添加了 validateCurrency() 函数并在 blur 事件上执行它以检查 min最大

关于javascript - html &lt;input type ="text"/> 仅包含最小值和最大值的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56956871/

相关文章:

javascript - 放慢我的 javascript!如何让我的代码在执行之前等待转换完成?

javascript - React JS fetch 作为 POST 跨域,PHP 返回 200 但没有正文响应

javascript - 如何有效地从字节中读取位?

html - CSS 中的 BEM 概念

PHP $_GET 撇号

jQuery:将内联元素插入 DOM

asp.net-mvc - 唯一性的 MVC 验证

javascript - jQuery - getJSON 数据到数组

正则表达式:验证美国邮政编码

javascript - 验证单选按钮被选中