antd的输入框用不同的输入法会出现不同的结果

发布于 2022-09-13 00:25:30 字数 624 浏览 22 评论 0

各位大佬:
antd版本:3.x
我在输入框的onchange事件中添加了正则表达式,去除特殊字符,在搜狗输入法中出现的时正常的结果,但在微软自带的和qq输入法都出现不同的bug。

这个是我的正则表达式,用来去除特殊字符:

e.target.value = e.target.value.replace(/[^a-zA-Z0-9\u4E00-\u9FA5]/g,'')

比如:在微软自带的输入框中文情况下,连续输入ww,输入框的内容自动变成了w'ww'wwwww(我想要的结果是两个中文)
截图如下:
image.png
在qq输入法的情况下,连续输入ww,输入框的内容自动变成了w'w(也是直接变成英文了,我想要的结果也是两个中文)
截图如下:
image.png
在使用搜狗输入法的情况下,连续输入ww,结果是正确的。
截图如下:
image.png
就很奇怪,有大佬遇到过吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泛泛之交 2022-09-20 00:25:30

已经解决这个问题了。
input输入框输入中文的时候有三个过程,onCompositionStart->onChange->onCompositionEnd,第一个和最后一个只会出发一次,而onChange方法会在输入值的时候一直触发,所以可以存一个变量,在onCompositionEnd只会把这个变量设为false,再进行一次正则判断,也就是onCompositionStart和onChange的时候不做正则校验,就不会有问题了。

handleChange=(ev)=>{
        if (ev.type === 'compositionend') {
            this.isComposition = false
            if (navigator.userAgent.indexOf('Chrome')>-1) {
                this.changeAreaName(ev)
            }
        } else {
            this.isComposition = true
        }
    }

这个是onCompositionStart和onCompositionEnd的方法。

changeAreaName = (e)=>{
        if(!this.isComposition){
            let pattern = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;%:”“'。、?]", 'g');
            e.target.value = e.target.value.replace(pattern, '');
        }
        this.setState({areaName:e.target.value})

    }

这个是输入的时候触发的方法。
火狐浏览器的输入过程不太一样,onCompositionStart->onCompositionEnd->onChange,所以火狐浏览器不需要在onCompositionEnd之后再触发一次changeAreaName方法,因为会自动触发。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文