javascript - Angular2输入在输入时只接受数字,但在复制粘贴时不接受
问题描述
我在 Angular2 中创建了一个如下所示的输入字段,它应该只接受数字。
html
<input type="text" name="streetCode" ngModel [maxlength]="2" (keypress)="onlyNumber($event)">
打字员
onlyNumber(evt) {
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
return true;
}
上面的代码工作正常,只允许键盘输入数字,但问题是当我将某些字母字符复制粘贴到输入字段时,它允许使用字母。
更新1: 实际上当我说复制粘贴时,它是通过鼠标复制粘贴而不是通过键盘。
谁能帮我解决这个问题
更新 2
现在我已经修改了如下所示的代码,不知道这是否是正确的做法:
onlyNumber(evt) {
if (evt.type === 'paste') {
let content = evt.clipboardData.getData('Text');
if (isNaN(content)) {
evt.preventDefault();
}
}
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
evt.preventDefault();
}
}
HTML
<input type="text" name="streetCode" ngModel [maxlength]="2" (keypress)="onlyNumber($event)" (paste)="onlyNumber($event)">
解决方案
理论上,keydown
andkeyup
事件代表按键被按下或释放,而keypress
事件代表一个字符被输入。该理论的实现在所有浏览器中并不相同。
所以我想建议是使用keydown/keyup
事件而不是keypress
如果你不想使用
type="number"
而不是文本,也想听粘贴事件。
推荐阅读
- c - 与 NULL 等效的字符串是什么?
- node.js - 如何使用 Firebase 管理员向设备发送通知
- java - 在 Java 流中读取 HDF5
- r - 检查两个类别中的出现
- database-design - 在 SchemaCrawler 中更改列注释的字体样式
- python - 跟踪图像时迭代陷入循环(无限循环)
- java - 每当有新元素加入时,如何让我的数组中的元素移动 +1
- regex - 使用模式匹配重命名 SAS 列
- ios - SwiftUI 问题 - 调用中的无关参数标签“执行:”(Xcode 11 Swift 5)
- python - 从两个字典之一中检索项目的最优雅方式,如果需要,默认为默认值