【发布时间】:2021-04-08 15:27:29
【问题描述】:
我有一个文本文件,它只允许使用字母和数字。但是,当 ios 用户通过双击破折号“ - ”插入破折号时,它将删除它之前的任何字符。这只发生在 ios 设备上
我正在使用正则表达式来立即过滤输入。这是我的代码:
let text = event.target.value;
let regref = new RegExp(/[^a-zA-Z0-9]/g);
text = text.replace(/[^a-zA-Z0-9\s\-\—]/g,"");
let str = event.target.value;
let text = event.target.value;
let regref = new RegExp(/[^a-zA-Z0-9]/g);
text = text.replace(/[^a-zA-Z0-9\s\-\—]/g,"");
let str = event.target.value;
if (str.length > 6) {
event.preventDefault();
return;
}
setTimeout(function(){
if (!regref.test(text)) {
event.preventDefault();
}
text = text.replace('_', "");
text = text.replace('-',"");
}, 200);
setReferralCode((referralCode = caps));
notice in text = text.replace(/[^a-zA-Z0-9\s-\—]/g,"");我已经允许 - 和 - 希望我可以显示错误消息而不是阻止其输入,但是即使如果输入:“aaabbb”后跟双破折号字符串更改为“aaabb-”
**FIXED UPDATE**
一位同事通过使用 _.debounce(); 帮助我解决了这个问题。 并且有一个临时变量来存储以前的有效代码。 它看起来像这样:
let text = event.target.value as string;
console.log(text);
var emRegExp = new RegExp(/[–—\s\.]/g);
if (text[text.length - 1] == "-" || emRegExp.test(text[text.length - 1])) {
text = lastReferralCode
.replace(/[^a-zA-Z0-9]/g, "")
.replace(/\s/g, "")
.toUpperCase()
.trim()
.substr(0, 6);
} else {
text = text
.replace(/[^a-zA-Z0-9]/g, "")
.replace(/\s/g, "")
.toUpperCase()
.trim()
.substr(0, 6);
setIsDashBefore(false);
}
我想分享这个,以防将来有人遇到同样的问题。这对于一些基于 Web 的超级应用程序来说可能很麻烦。如果使用某些 android 键盘输入双“空格”,Android 设备将删除前一个字符。而 iPhone 的双“-”字符也是如此。 正如@A Haworth 提到的那样,ios 或 android 正在处理导致问题的双重字符。
【问题讨论】:
-
你能不能把你的代码变成一个可以工作的sn-p,因为它更容易测试。谢谢。
-
你能解释一下 setTimeout 的原因是什么,特别是为什么 200 毫秒?
-
超时是为了延迟用户输入,以便正则表达式可以正确测试,但我认为 ios 仍然会将字符更改为 emspace。
标签: javascript ios reactjs validation