我不知道为什么,但是经过几个小时的处理,我可以说有些不对劲。
我有一个简单的输入
<input type="number">
我希望它接受仅数字(数字[0-9]),仅此而已。为了实现这一点,我添加了一个事件监听器来控制事件的密钥代码。
没有什么特别的东西,几乎所有平台上的一切都在工作,问题来自于Android。
型=&#34;数&#34;
导致数字键盘出现 - 这很棒 - 还有一些其他字符(逗号,点,连字符......)。当您按下其中一个特殊字符时,行为很奇怪:
我错过了什么?
我的环境由AngularJs驱动,所以我在一个指令中设置了事件监听器。但是使用jQuery做同样的事情并不能解决问题。
有人可以建议使用&#34; $解析器&#34;推送我的自定义值没有不需要的字符。无论如何,我认为这不起作用,因为输入的类型是&#34;数字&#34;并且它只期望数字(另一种说法是Android上的浏览器做错了...)
这里有一个working Fiddle,在Android上打开它。
由于
答案 0 :(得分:6)
keypress
事件未被触发,仅keydown
和keyup
。 onkeydown
您可以调用preventDefault()
方法。但要防止什么? charCode
始终为0
,keyCode
为229
。你应该检查所有的输入。
这样的事情:
if(!event.charCode) {
this.removeInvalidChar();
return;
}
private removeInvalidChar(): void {
setTimeout(() => {
let input = this.control.control.value;
if (input) {
input.split('').forEach((char: string) => {
if (!this.pattern.test(char)) {
input = input.replace(char, '');
}
});
this.control.control.setValue(input);
}
});
}
答案 1 :(得分:2)
使用$parsers.unshift
的指令怎么样:
app.directive('format', ['$filter', '$window', function($filter, $window) {
return {
require: '?ngModel',
link: function(scope, elem, attrs, ctrl) {
if (!ctrl) return;
scope.plainNumber = scope.test+'';
ctrl.$parsers.unshift(function(viewValue) {
if(!viewValue){
viewValue = scope.plainNumber;
}
scope.plainNumber = viewValue.replace(/[^\d]/g, '');
elem.val(scope.plainNumber);
return scope.plainNumber;
});
}
};
}]);
用法:
<input type="number" ng-model="test" format />
在Android上测试
答案 2 :(得分:1)
使用inputType =“numberSigned”它只会为你提供0-9之间的数字,至少在原生android中它可以完美无缺地工作。