在Angular2中,如何屏蔽输入字段(文本框),使其仅接受数字而不接受字母?
我有以下HTML输入:
<input type="text" *ngSwitchDefault class="form-control" (change)="onInputChange()" [(ngModel)]="config.Value" focus)="handleFocus($event)" (blur)="handleBlur($event)"/>
上面的输入是通用文本输入,可以用作简单文本字段或数字字段(例如显示年份) .
使用angular2,我如何使用相同的输入控件并在此字段上应用某种过滤器/蒙版,这样它只接受数字?我可以通过哪些不同方式实现这一目标?
Note: I need to achieve this using only textbox and not using input number type.
22 回答
您可以使用angular2指令 . Plunkr
并且您需要在输入中将指令名称作为属性编写
不要忘记在模块的声明数组中编写指令 .
通过使用正则表达式,您仍然需要功能键
如果你不想要一个指令
https://stackblitz.com/edit/numeric-only
in component.html
in component.ts
我想 Build @omeralper给出的答案,我认为这为一个可靠的解决方案提供了良好的基础 .
我建议的是一个简化的最新版本,其中包含最新的Web标准 . 请务必注意,event.keycode已从Web标准中删除,未来的浏览器更新可能不再支持它 . 见https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
此外,该方法
不保证与用户按下的键有关的keyCode映射到用户's keyboard, since different keyboard configurations will result in a particular keycode different characters. Using this will introduce bugs which are difficult to identify, and can easily break the functionality for certain users. Rather I' m上提出的使用event.key时标识的预期字母,请参阅此处的文档https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
此外,我们只希望结果输出是有效的小数 . 这意味着应接受数字1,11.2,5000.2341234,但不应接受值1.1.2 .
请注意,在我的解决方案中,我不包括剪切,复制和粘贴功能,因为它打开了窗口中的错误,尤其是当人们在相关字段中粘贴不需要的文本时 . 这需要在keyup处理程序上进行清理过程;这不是这个帖子的范围 .
这是我提出的解决方案 .
我知道这是一个老问题,但由于这是一个常见的功能,我想分享我所做的修改:
自定义小数点分隔符(点或逗号)
仅支持整数或整数和小数
仅支持正数或正数和负数
验证减号( - )在开头
支持鼠标粘贴(尽管有一些限制https://caniuse.com/#feat=clipboard)
支持Mac命令键
替换“.33”和“33”之类的字符串 . 对于正确的版本:0.33和33.0
用法:
您需要使用type =“number”而不是文本 . 您还可以指定最大和最小数字
你可以像这样实现它
希望这会帮助你 .
更简洁的解决方案 . 试试这个指令 .
如果您正在使用ReactiveForms,也可以使用它 .
在输入上使用它如下:
使用
pattern
属性进行如下输入:为了实现这一点,我将一个函数绑定到onInput方法,如下所示:
(input)="stripText(infoForm.get('uin'))
这是我的表单中的示例:
然后我将以下函数添加到我的组件:
这个正则表达式
/[^0-9]/g
搜索任何不是数字的东西并使用.replace
我将它设置为什么都没有替换 . 因此,当用户尝试输入不是数字的字符(在这种情况下是一个非零到九的字符)时,看起来好像文本框中没有任何内容 .只需创建一个指令并添加到hostlistener下面:
用空替换无效文本 . 所有键和键组合现在可以在所有浏览器中使用,直到IE9 .
我在上面的指令中做了一些修改并实现了min,max,maxlength .
来自@omeralper的回答 . 我改变了一点不接受句号ascii(键代码110,190) . 并使用let ch =(e.key);当您更改语言(例如泰语或日语)时,要与正则表达式进行比较,它将不接受这些语言的字符
希望这个帮助:)
您可以创建此Validator并将其导入组件中 .
基本上验证表单输入字符串:
检查没有点
将字符串转换为数字
check是一个整数
检查大于零
要在您的项目中实现它:
app文件夹中的建议路径:src / app / validators / number.validator.ts
导入您的组件
import { NumberValidator } from '../../validators/number.validator';
将其添加到表单控件
inputNumber: ['', [NumberValidator.isInteger]],
如果您不想显示无效的char,请将
(change)="deleteCharIfInvalid()"
绑定到输入,如果form.get('inputNumber').hasError('isInteger')
是true
,则删除最后插入的char .这里很简单:Simple指令在keydown事件中,它检查一个键的长度是1,键不是
preventDefault()
的数字,它不会呈现该字符 .HTML:
限制:它允许使用鼠标粘贴,这将接受其他char . 为了避免这种情况,您可以将模型作为输入传递给指令,并将
ngOnChage
传递给该模型,将值更改为仅数字:如下所示:
EDIT: Added Code to detect change in Model and update the input's value
HTML:
有效手机号码模式的模式('^((\ 91 - ?)| 0)?[0-9] {10} $')
仅接受来自文本框模式的数字的模式('[0-9] *')
仅接受具有特定数字的数字的模式,例如:Pincode . 图案( '^ [0-9] {5} $')
当按下小键盘'1'时,fromCharCode返回'a',因此应避免使用此方法
(管理员:无法照常发表评论)
支持清理粘贴的内容:
我看到很多关于处理复制/粘贴的评论 .
为了减少@omeralper的答案,你可以在onlyNumber指令中添加一个粘贴事件处理程序来处理复制/粘贴:
这仅允许将内容复制并粘贴到文本框中(如果它是数字) . 这是最简单的解决方案 . 更改剪贴板的内容以删除非数字更复杂,可能不值得 .
要从IE获取粘贴文本,您可以使用以下内容:
只需使用HTML5,输入类型=“数字”
你可以使用正则表达式:
使用指令限制用户以下列方式仅输入数字:
在HTML中:
Angular2:
并且需要在输入中将指令名称作为属性编写 .