防止用户在数字类型的输入元素中输入负数

时间:2016-08-09 14:42:28

标签: javascript jquery validation input

我在这里有另外一个关于如何防止用户输入负数的问题的代码,但它涵盖了所有输入。我有2个number类型的输入元素和2个text类型的输入元素。我显然希望允许用户在文本字段中添加任何字符,但希望阻止用户输入负数/非数字内容到number输入。

下面的代码适用于number类型的一个输入,而不适用于另一个输入。如何更改我的代码以允许其他number输入?任何帮助将不胜感激。

HTML

<div class="cpNewTemplateDetailsWrap">
    <div class="col-sm-3">
        <label>Course Id</label>
    </div>
    <div class="col-sm-9">
        <input id="courseIdInput" type="text" class="form-control input-lg" placeholder="e.g. CT001" />
    </div>
    <div class="col-sm-3">
        <label>Course Description</label>
    </div>
    <div class="col-sm-9">
        <input id="courseDescInput" type="text" class="form-control input-lg" placeholder="e.g. Cadet Training" />
    </div>
    <div class="col-sm-3">
        <label>Course Duration <small>(Days)</small>
        </label>
    </div>
    <div class="col-sm-9">
        <input id="courseDurationInput" type="number" min="0" class="form-control input-lg" placeholder="5" />
    </div>
    <div class="col-sm-3" id="courseDemandTitle">
        <label>Course Demand</label>
    </div>
    <div class="col-sm-9">
        <input id="courseDemandInput" type="number" min="0" class="form-control input-lg" placeholder="5" />
    </div>
</div>

的Javascript

var myInput = document.querySelectorAll("input[type=number]")[0];
myInput.addEventListener('keypress', function(e) {
  var key = !isNaN(e.charCode) ? e.charCode : e.keyCode;
  function keyAllowed() {
    var keys = [8,9,13,16,17,18,19,20,27,46,48,49,50,
                51,52,53,54,55,56,57,91,92,93];
    if (key && keys.indexOf(key) === -1)
      return false;
    else
      return true;
  }
  if (!keyAllowed())
    e.preventDefault();
}, false);

// Disable pasting of non-numbers
myInput.addEventListener('paste', function(e) {
  var pasteData = e.clipboardData.getData('text/plain');
  if (pasteData.match(/[^0-9]/))
    e.preventDefault();
}, false);

JS Fiddle Here!

修改

对于一些重复的问题,它们只涵盖一个输入或所有输入。我只是想防止2个输入的负数。如果我想添加更多具有number类型的输入元素,我不想为每次迭代重复代码。例如,如果我有12个输入,我不想再使用该代码12次。

7 个答案:

答案 0 :(得分:3)

您只是将事件侦听器添加到第一个数字输入。

https://jsfiddle.net/tpsbnp9q/5/

var myInput = document.querySelectorAll("input[type=number]");

function keyAllowed(key) {
  var keys = [8, 9, 13, 16, 17, 18, 19, 20, 27, 46, 48, 49, 50,
    51, 52, 53, 54, 55, 56, 57, 91, 92, 93
  ];
  if (key && keys.indexOf(key) === -1)
    return false;
  else
    return true;
}

myInput.forEach(function(element) {
  element.addEventListener('keypress', function(e) {
    var key = !isNaN(e.charCode) ? e.charCode : e.keyCode;
    if (!keyAllowed(key))
      e.preventDefault();
  }, false);

  // Disable pasting of non-numbers
  element.addEventListener('paste', function(e) {
    var pasteData = e.clipboardData.getData('text/plain');
    if (pasteData.match(/[^0-9]/))
      e.preventDefault();
  }, false);
})

答案 1 :(得分:0)

您的querySelectorAll方法返回类型为number的所有输入元素的数组。您当前在所选数组中有第一个元素,因此这是检查输入的唯一输入框。

答案 2 :(得分:0)

仅导致一个输入受限的代码是此行末尾的[0]

var myInput = document.querySelectorAll("input[type=number]")[0];

现在你可以有第二个变量,比如myOtherInput,并为它添加一个事件监听器:

var myOtherInput = document.querySelectorAll("input[type=number]")[1];
myOtherInput.addEventListener('keypress', function(e) {
  var key = !isNaN(e.charCode) ? e.charCode : e.keyCode;
  function keyAllowed() {
    var keys = [8,9,13,16,17,18,19,20,27,46,48,49,50,
                51,52,53,54,55,56,57,91,92,93];
    if (key && keys.indexOf(key) === -1)
      return false;
    else
      return true;
  }
  if (!keyAllowed())
    e.preventDefault();
}, false);

但它会添加重复的代码,如果你想限制输入量,可能无法帮助你。

答案 3 :(得分:0)

您可以为所有选择性输入元素指定类名,并使用循环在每个输入上附加事件[type =&#39; number&#39;]。

答案 4 :(得分:0)

  1. 获取所有号码字段。
  2. 将keypress侦听器添加到每个元素,如果按下的键为零,则不添加它。
  3. 这不包括粘贴负数的情况。

    // get all number fields
    var numInputs = document.querySelectorAll('input[type="number"]');
    
    // Loop through the collection and call addListener on each element
    Array.prototype.forEach.call(numInputs, addListener); 
    
    
    function addListener(elm,index){
      elm.setAttribute('min', 0);  // set the min attribute on each field
      
      elm.addEventListener('keypress', function(e){  // add listener to each field 
         var key = !isNaN(e.charCode) ? e.charCode : e.keyCode;
         str = String.fromCharCode(key); 
        if (str.localeCompare('-') === 0){
           event.preventDefault();
        }
        
      });
      
    }
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>JS Bin</title>
    </head>
    <body>
      <lable>Number: <input type="number"></label>
      <br>
      <lable>Number: <input type="number"></label>
      <br>
      <lable>Text: <input type="text"></label>
        <br>
      <lable>Text: <input type="text"></label>
    
      
    </body>
    </html>

答案 5 :(得分:0)

通常只需在min="0"字段上使用type="number"属性即可。

<input type="number" min="0" step="0.1" name="whatever" />

如果您需要坚持<input type="text" />或支持非常旧的浏览器,或者想确保用户不要通过键盘输入负数(在某些浏览器上可能使用min="0"),使用jQuery可以覆盖否定具有特定类属性的所有输入的focusOut上的值包含以下代码:

$(document).ready(function(){
    $("body").on('focusout', '.my-input-number-positive', function(){
        if($(this).val() < 0){
            $(this).val('0'); // alternatively show a hint – or whatever
        }
    });
});

这不会取代服务器端验证!

答案 6 :(得分:-1)

你可以直接在输入上使用js - 我认为这是解决问题的简单而干净的解决方案:

只需将其放在每个输入上:onkeypress='return event.charCode >= 48 && event.charCode <= 57'

https://jsfiddle.net/tpsbnp9q/3/