2 回答
![?](http://img1.sycdn.imooc.com/545846070001a15002200220-100-100.jpg)
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)}`);
}
}
![?](http://img1.sycdn.imooc.com/545867280001ed6402200220-100-100.jpg)
TA贡献1856条经验 获得超11个赞
添加回答
举报