angularjs:只允许在文本框中输入数字

IT技术 javascript ruby-on-rails angularjs numeric
2021-01-30 09:20:02

在 angularjs 中是否有任何可用的功能只允许将数字输入到文本框中,例如

6个回答

此代码显示了如何防止输入非数字符号的示例。

angular.module('app').
  directive('onlyDigits', function () {

    return {
        restrict: 'A',
        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;
            });
        }
    };
});
作为Blowsie笔记,这个代码不工作在所有情况下..这里是我想更新这个答案,使用工作的jsfiddle:jsfiddle.net/thomporter/DwKZh
2021-04-01 09:20:02
双击字母键将使此失败
2021-04-05 09:20:02
如果要明确禁用空格输入,则该指令应与 ng-trim=false 一起使用
2021-04-06 09:20:02
用户可以输入空格。attrs.$set('ngTrim', "false");在解析器之前添加以防止出现空格。
2021-04-06 09:20:02
谢谢你。我简化了非数字剥离,写了一个测试:gist.github.com/henrik/769d49136744ddcaa1dc写的时候代码是JS但是测试的是CoffeeScript。我想很快两者都会成为 CoffeeScript。
2021-04-10 09:20:02

HTML

 <input type="text" name="number" only-digits>

// 只需输入 123

  .directive('onlyDigits', function () {
    return {
      require: 'ngModel',
      restrict: 'A',
      link: function (scope, element, attr, ctrl) {
        function inputValue(val) {
          if (val) {
            var digits = val.replace(/[^0-9]/g, '');

            if (digits !== val) {
              ctrl.$setViewValue(digits);
              ctrl.$render();
            }
            return parseInt(digits,10);
          }
          return undefined;
        }            
        ctrl.$parsers.push(inputValue);
      }
    };
});

// 类型:123 或 123.45

 .directive('onlyDigits', function () {
    return {
      require: 'ngModel',
      restrict: 'A',
      link: function (scope, element, attr, ctrl) {
        function inputValue(val) {
          if (val) {
            var digits = val.replace(/[^0-9.]/g, '');

            if (digits.split('.').length > 2) {
              digits = digits.substring(0, digits.length - 1);
            }

            if (digits !== val) {
              ctrl.$setViewValue(digits);
              ctrl.$render();
            }
            return parseFloat(digits);
          }
          return undefined;
        }            
        ctrl.$parsers.push(inputValue);
      }
    };
 });
为什么代码在 angularjs 中如此冗长,而在普通 javascript 中对于相同的要求很简单??
2021-03-20 09:20:02
我认为我们可以使用以下 if (digits.split('.').length > 2) digits = digits.substring(0, digits.length - 1); 来处理这个问题。
2021-03-21 09:20:02
您的第二个示例(// 类型:123 或 123.45)允许输入多个小数位,例如 11.22..33.....444 将返回有效。
2021-04-01 09:20:02
@Bharath 只限制 2 位小数 --> if (digits.split('.').length > 1) { numbers = digits.substring(0, digits.indexOf('.') + 3); }
2021-04-02 09:20:02
如何将其限制为仅 2 位数?
2021-04-06 09:20:02

我只是在指令中使用了 ng-keypress 作为我的输入。

HTML:

<input type="text" ng-keypress="filterValue($event)"/>

JS:

$scope.filterValue = function($event){
        if(isNaN(String.fromCharCode($event.keyCode))){
            $event.preventDefault();
        }
};
这看起来很简单,虽然非角度方式可能会阻止一些,但我绝对喜欢这种方法。必须添加另外两个必须允许的情况, event.which === 8 和 event.which === 46 (分别用于退格和删除)
2021-03-16 09:20:02
我喜欢这个解决方案,尽管值被修剪 => 我稍微改变了条件以防止按空格键: if( isNaN(String.fromCharCode($event.keyCode)) || $event.keyCode === 32 )
2021-03-16 09:20:02
不错的解决方案!我使用@Markiv 评论在允许编辑、提交和导航新答案改进您的代码
2021-03-29 09:20:02
Keypress 事件已被弃用,某些浏览器(即 Chrome)不支持它。Keydown 事件也很可疑 - 在某些设备上,Nexus4,它不会报告正确的键码。唯一真正的方法(afaik)是不使用字符,而是使用实际的真实文本。
2021-04-07 09:20:02
虽然这并不是真正的“角度方式”,但它似乎是防止用户输入的相对安全的选择
2021-04-13 09:20:02

此功能正是您所需要的。http://docs.angularjs.org/api/ng.directive:input.number

编辑:

您可以将 jquery 插件包装到指令中。我在这里创建了一个例子:http : //jsfiddle.net/anazimok/jTJCF/

HTML:

<div ng-app="myApp">
    <div>
        <input type="text" min="0" max="99" number-mask="" ng-model="message">
            <button ng-click="handleClick()">Broadcast</button>
    </div>

</div>

CSS:

.ng-invalid {
    border: 1px solid red;
}

JS:

// declare a module
var app = angular.module('myApp', []);

app.directive('numberMask', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            $(element).numeric();
        }
    }
});
不完全是 OP 所要求的。您的解决方案提供输入验证(即在检测到非数字时显示错误),但用户仍然可以在文本框中键入非数字。
2021-03-16 09:20:02
@AliHasan 这不应该是正确答案,因为它没有回答问题。
2021-04-06 09:20:02

这是最简单和最快的方法,只允许数字输入。

<input type="text" id="cardno" placeholder="Enter a Number" onkeypress='return event.charCode >= 48 && event.charCode <= 57' required>

谢谢

我想这就是命运的方式
2021-03-16 09:20:02
退格和删除也不起作用 -) 需要添加额外的检查
2021-03-30 09:20:02
如果你能把它放在一个指令中,那就完美了
2021-04-07 09:20:02
问题是只允许输入数字,如果你想要更多,那么当然可以相应地定制。所以这只是一个建议,并不是所有问题的具体答案。
2021-04-12 09:20:02