IOS emdash删除前一个字符



我有一个文本文件,其中只允许使用字母和数字。然而,当ios用户通过双击短划线"-"它会删除之前的任何字符。这只发生在ios设备上

我正在使用regex即时过滤输入。这是我的代码:

let text = event.target.value;
let regref = new RegExp(/[^a-zA-Z0-9]/g);
text  = text.replace(/[^a-zA-Z0-9s-—]/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-9s-—]/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中的通知=text.replacement(/[^a-zA-Z0-9\s-\--]/g,"(;我允许-和-,希望我能显示一条错误消息,而不是阻止它的输入,然而,即使有了它,如果o输入:";aaabbb";然后用双破折号将字符串更改为"0";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);
}

我想分享这个,以防将来有人遇到同样的问题。这可能会给一些基于网络的超级应用程序带来麻烦。如果输入是双"字符",则安卓设备将删除前一个字符;空间";使用一些android键盘。而iPhone的双"-"性格正如@A Haworth所提到的,ios或android将角色处理为双重角色,这是导致问题的原因。

看起来您的代码有可能遇到时间问题-系统在处理短划线的同时也在处理它。

IOS接收"-"字符的活动是查看输入中的前一个字符是否也是"-"。如果是,它会将两者转换为单个字符的emspace。不过,到那时,任何事件侦听代码都已看到两个连字符。

如果我们"干扰"并从字符串中删除第一个连字符,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或任何其他系统是否有其他特殊的双字符映射到单字符方法。

一位同事用_.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);
}

我想分享这个,以防将来有人遇到同样的问题。这可能会给一些基于网络的超级应用程序带来麻烦。如果输入是双"字符",则安卓设备将删除前一个字符;空间";使用一些android键盘。而iPhone的双"-"性格正如@A Haworth所提到的,ios或android将角色处理为双重角色,这是导致问题的原因。

最新更新