2 回答
TA贡献1827条经验 获得超4个赞
问题
HTMLInput 元素的 maxlength 应该是 5,否则一旦您以编程方式在其中添加斜杠,它就不允许用户添加 4 位数字。
在同样的问题存在
const trimmed = input.value.replace(/\s+/g, '').slice(0,4);如果它包含一个斜杠,切片应在5而不是4月底。在
return声明中return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(2)}`);
如果斜线被添加一次,${trimmed.slice(2)将返回/\d{1,2}。所以你需要避免斜线并从3开始。
解决方案
将最大长度从 4 更改为 5
<input ... maxlength="5">
现在,input-mask.directive.ts需要一些改变
改变
const trimmed = input.value.replace(/\s+/g, '').slice(0,4);
到
const trimmed = input.value.replace(/\s+/g, '').slice(0, input.value.indexOf('/')==-1?4:5);因为当你加上 时/,长度会变成 5。
不要使用,
.slice(0)因为它允许用户粘贴 5 位数字,当您添加斜杠时,它将变为 6。因此日期看起来像11/111而不是11/11
改变
return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(2)}`);到
return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(trimmed.indexOf('/')==-1?2:3)}`);这就是您的代码混乱的地方。如果它包含斜线,那么你应该从 3 开始切片。否则从 2 开始切片。
输入掩码指令中 HostListener 的最终代码
@HostListener('input', ['$event'])
onKeyDown(event: KeyboardEvent) {
const input = event.target as HTMLInputElement;
const trimmed = input.value.replace(/\s+/g, '').slice(0, input.value.indexOf('/')==-1?4:5);
if (trimmed.length > 3) {
return (input.value = `${trimmed.slice(0, 2)}/${trimmed.slice(trimmed.indexOf('/')==-1?2:3)}`);
}
}
TA贡献1856条经验 获得超11个赞
添加回答
举报
