javascript - IOS emdash删除前一个字符
问题描述
我有一个文本文件,它只允许字母和数字。但是,当 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));
注意文本 = 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 正在处理导致问题的双重字符。
解决方案
看起来您的代码有可能遇到计时问题 - 系统正在处理破折号,同时代码正在尝试处理它。
IOS 接收'-' 字符的活动是查看输入中的前一个字符是否也是'-'。如果是,则将两者转换为单个字符空间。到那时,尽管任何事件监听代码都看到了两个连字符。
如果我们“干扰”并从字符串中删除第一个连字符 IOS 是“混淆”并删除它认为是两个“-”字符,这意味着它将删除输入值字符串中的下一个字符。
为了解决这个问题,我们可以查找连字符而不是立即将其从输入值中删除。
这是一个片段,将事件视为 keyup 事件:
const input = document.querySelector('input');
let timing = false; //set to true if we have a timeout set
let lastChWasHyphen = false; //set to true on every odd numbered hyphen
function keyup(event) {
if ( event.key == '-' ) {
if (!lastChWasHyphen) { alert('You cannot have a - character'); }
lastChWasHyphen = !lastChWasHyphen;
}
else { lastChWasHyphen = false; }
if (!lastChWasHyphen) { input.value = input.value.replace(/[^a-zA-Z0-9]/g,""); }
}
input.addEventListener('keyup',keyup);
<input />
缺点:在键入另一个字符之前,连字符不会被删除。例如,在此设置超时是不安全的,因为用户可以键入连字符两次并留有间隙以在 IOS 上获得 emspace。在这里唯一要做的就是在问题中建议的奇数字符上发出警告消息。
警告:这个问题专门关于 IOS 允许输入 emspace。我不知道IOS,或者任何其他系统,是否有其他特殊的双字符映射到单字符的方法。
推荐阅读
- vba - 从 SlideMaster 打印
- azure-active-directory - 用于获取 microsoft graph 访问令牌的 OAuth2 流程
- python - 找出所有可能的分配组合
- azure - 错误 MSB4086:尝试对“$(MSBuildVersion)”进行数值比较,结果为“”而不是数字
- microsoft-graph-api - 获取修改后的团队和团队频道
- python - 我使用 TFLiteConvert post_training_quantize=True 但我的模型仍然太大而无法托管在 Firebase ML Kit 的自定义服务器中
- python - 使用 Discord.py 制作一个在预定日期发送消息的机器人
- python - 如何在不更改原始代码的情况下编写以下代码?
- python - 将函数参数名称作为字符串传递
- c - 设置 DMA 双缓冲模式以仅在 STM32 上使用 SPI rx 时出现问题