【问题标题】:html <input type="text" /> number-only with min and max valuehtml <input type="text" /> 数字只有最小值和最大值
【发布时间】:2019-11-19 06:20:50
【问题描述】:

我正在尝试让 min="" 和 max="" 属性在仅数字输入上起作用。使用&lt;input type="number"&gt; 是不可能的,因为浏览器对本地化的支持很糟糕(点应该是千位分隔符,逗号作为十进制分隔符,在输入和提交中一样)。 最理想的情况是,在提交每个表单时,它会检查那些特定的字段,如果数字遵循模式并且在正确的范围内,就像它本身对 type="number" 输入所做的那样。

或者,如果可能或更简单,我也愿意使用&lt;input type="number" /&gt;,只要模式、货币符号,最重要的是,逗号在 value="123,12"、用户输入和提交给服务器的值。

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

预期的行为是,在 &lt;input type="text" pattern"-?(\\d+|\\d{1,3}(\\.\\d{3})*)(,\\d+)?" min="0" max="1500" /&gt; 上它可以让我输入我想要的任何值,但是在提交表单时,检查字段的数字解析值(省略货币符号或点,将逗号理解为十进制)是在 0 到 1500 之间的范围内。理想情况下,但这并不重要,我还想要带有 step="0.01" 的递增和递减箭头,例如 type="number" 输入。

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

【问题讨论】:

  • Here 是模式输入字段的示例。你有没有尝试过任何事情来实现你的目标?
  • 你能把你的完整代码贴在这里吗?
  • @Kryptur 我不确定你是否读过这个问题,但我的模式正在工作。问题根本不是这个问题。您发布的代码与问题完全无关。我想为输入 type="text" 强制执行 "min" 和 "max" 之间的值,就像浏览器对 type="number" 执行此操作一样。
  • @Ouroborus 是的,它们用于输入 type="number"。由于对 type="number" 的本地化支持很差,问题是如何让它们输入文本类型。
  • 所以坚持我给你的问题。你试过什么?

标签: javascript html validation input


【解决方案1】:

$("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 事件上执行它以检查minmax

【讨论】:

  • 感谢您的建议,但我正在寻找的是与输入 type="number" 字段具有相同的行为。我不希望输入在输入后被覆盖为最小/最大值,而是在提交时 - 并相应地显示一条消息。见:i.imgur.com/MLRdbFy.gifv
  • 当然@mhpcc,但number 输入的问题是,它们不接受$, 之类的字符。您获得所有minmax$, 的唯一方法是使用text 输入并用JS 覆盖
  • “我不希望在输入后将输入覆盖为最小值/最大值,而是在提交时 - 并相应地显示一条消息。参见:i.imgur.com/MLRdbFy.gifv”
  • 是的,但是没有提到如何以一种好的方式实现这一点。我唯一的想法是全局检查表单并将每个字段的验证绑定到提交事件 - 但即便如此我也不知道如何让相同的对话框显示为浏览器本机类型 =“数字” " 如果值超出范围,则使用最小值/最大值。使用静默更正检查字段本身的输入或模糊事件不是我想要的,而是 imgur gif 中的行为。
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2023-04-02
  • 2018-04-09
相关资源
最近更新 更多