【问题标题】:Text Input allow only Integer input in angularjs文本输入只允许在 angularjs 中输入整数
【发布时间】:2016-03-04 22:58:14
【问题描述】:

我想将 html 输入[数字] <input type="number" /> 设置为允许仅整数输入(不是浮点数)。

基本上,html input[number] 允许'.'输入浮点输入,我不希望这样。

有没有在 AngularJS 中快速完成的方法?

【问题讨论】:

标签: javascript angularjs angularjs-validation


【解决方案1】:

input[type=number] 根据定义只接受整数作为输入。自己尝试一下。尝试输入字母,它不会让你。

不需要 JavaScript,因为它已经内置了。您的意思是 input[type=text] 吗?

您可以通过角度指令来实现。它看起来像这样(虽然不确定我的语法)

app.directive('onlyNumbers', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            element.bind("keydown", function(event) {
                if ((event.keyCode > 47 && event.keyCode < 58) && !event.shiftKey) {
                    event.preventDefault();
                    return false;
                }
            });
        }
    });

语法可能有一些错误,但我会分解基本公式。

由于我们使用的是输入元素,因此我们使用attribute 指令是有意义的。我们可以通过将restrict 属性设置为 A 来做到这一点。

由于我们将监听按键事件,我们应该使用link 函数。我们想监听keydown 事件,以检测何时开始按下某个键。

要查找用户是否输入了数字,我们将使用keyCodes,其中的数字键是 48 到 57,分别代表 0 到 9。但是,我们没有考虑需要按数字键的特殊字符。所以我们要确保 shift 键也没有被按下。

然后我们可以将此指令作为属性添加到我们的输入元素上。

<input type="text" only-numbers />

【讨论】:

  • input[type=number] 不能工作,因为它允许 '.'被输入。 OP 不希望输入浮点值
【解决方案2】:

请找到小提琴 http://jsfiddle.net/8a4sg0mo/

angular.module('myApp', []).directive('numbersOnly', function(){
   return {
     require: 'ngModel',
     link: function(scope, element, attrs, modelCtrl) {
       modelCtrl.$parsers.push(function (inputValue) {

       if (inputValue == undefined) return '' 
       var transformedInput = inputValue.replace(/[^0-9]/g, ''); 
       if (transformedInput!=inputValue) {
          modelCtrl.$setViewValue(transformedInput);
          modelCtrl.$render();
       }         

       return transformedInput;         
   });
 }
   };
});

function MyCtrl($scope) {
    $scope.number = ''
}

它将只允许输入数字,完全使用 Angular js 完成。

【讨论】:

  • 是的,代码有效。不幸的是,如果我在指令中使用它,我会得到一个错误“inputValue.replace 不是函数”。我错过了什么吗?
【解决方案3】:

这是如何实现的。

  1. 使用输入类型 - '文本'

    指令:

    app.directive('onlyNumbers', function () {
        return  {
            restrict: 'A',
            link: function (scope, elm, attrs, ctrl) {
                elm.on('keydown', function (event) {
                    if(event.shiftKey){event.preventDefault(); return false;}
                    //console.log(event.which);
                    if ([8, 13, 27, 37, 38, 39, 40].indexOf(event.which) > -1) {
                        // backspace, enter, escape, arrows
                        return true;
                    } else if (event.which >= 48 && event.which <= 57) {
                        // numbers 0 to 9
                        return true;
                    } else if (event.which >= 96 && event.which <= 105) {
                        // numpad number
                        return true;
                    } 
                    // else if ([110, 190].indexOf(event.which) > -1) {
                    //     // dot and numpad dot
                    //     return true;
                    // }
                    else {
                        event.preventDefault();
                        return false;
                    }
                });
            }
        }
    });
    

    HTML:

    <input type="text" only-numbers>
    
  2. 使用输入类型 - '数字'

    指令:

    app.directive('noFloat', function () {
    return  {
        restrict: 'A',
        link: function (scope, elm, attrs, ctrl) {
            elm.on('keydown', function (event) {
              if ([110, 190].indexOf(event.which) > -1) {
                    // dot and numpad dot
                    event.preventDefault();
                    return false;
                }
                else{
                  return true;
                }
            });
        }
    }
    });
    

    HTML: &lt;input type="number" step="1" no-float&gt;

查看Plunker

【讨论】:

  • Tanx 哥们,我很感激
【解决方案4】:

使用模式属性:

&lt;input type="number" ng-model="price" name="price_field" ng-pattern="/^[0-9]{1,7}$/" required&gt;

请看演示:https://jsfiddle.net/JBalu/vfbgrd5n/

可能有帮助。

【讨论】:

  • '5.'和“5”不应该是有效的。
【解决方案5】:

完整的工作示例:自定义指令 以下工作正常

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>

<body ng-app="myApp" ng-controller="AppCtrl">

  <input type="text" allow-numbers-only />

  <script>
    var app = angular.module("myApp", []);

    app.controller("AppCtrl", function($scope) {
      $scope.title = "App"
    })



    app.directive("allowNumbersOnly", function() {
      return {
        restrict: "A",
        link: function(scope, element, attrs) {
          element.bind("keydown", function(event) {
            if (event.keyCode == 8) {
              return false;
            } else if (!(event.keyCode > 47 && event.keyCode < 58) || event.shiftKey) {
              event.preventDefault();
              return false;
            }
          });



        }
      }
    });
  </script>

</body>

</html>

【讨论】:

    【解决方案6】:

    这个我找了很多次,之前的项目中使用过指令,但终于找到了一个angular js自己提供的方式,从而可以摆脱指令。看看这个链接上给出的代码angularJs

    那里显示的代码如下:

    <script>
      angular.module('numberExample', [])
        .controller('ExampleController', ['$scope', function($scope) {
          $scope.example = {
            value: 12
          };
        }]);
    </script>
    <form name="myForm" ng-controller="ExampleController">
      <label>Number:
        <input type="number" name="input" ng-model="example.value"
               min="0" max="99" required>
     </label>
      <div role="alert">
        <span class="error" ng-show="myForm.input.$error.required">
          Required!</span>
        <span class="error" ng-show="myForm.input.$error.number">
          Not valid number!</span>
      </div>
      <tt>value = {{example.value}}</tt><br/>
      <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
      <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
      <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
      <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
     </form>
    

    【讨论】:

      【解决方案7】:

      (function () {
          angular
          .module('urModule').directive('numbersOnly', numbersOnly);
          function numbersOnly() {
              return {
                  require: 'ngModel',
                  link: function (scope, element, attr, ngModelCtrl) {
                      function fromUser(text) {
                          if (text) {
                              var transformedInput = text.replace(/[^0-9]/g, '');
      
                              if (transformedInput !== text) {
                                  ngModelCtrl.$setViewValue(transformedInput);
                                  ngModelCtrl.$render();
                              }
                              return transformedInput;
                          }
                          return undefined;
                      }
                      ngModelCtrl.$parsers.push(fromUser);
                  }
              };
          }
      })();

      【讨论】:

      • 您能否提供更多信息。参考文献等
      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2013-08-05
      • 2018-03-06
      相关资源
      最近更新 更多