html 输入框 oninput 事件,输入中文时多次被触发导致无法正常输入

问题:在开发公司的一个项目(scala、scalajs开发)时,遇到中文输入法无法正常输入的情况,如下图所示。

在这里插入图片描述

经过同学提醒后,发现是oninput的问题,在中文输入法中,每输入一个拼音都会触发一次oninput而不是每输入一个字。那么解决办法呢,答案是使用compositionstart事件和compositionend事件。参考其他博客整理了一下js和scalajs版本。
js版本
//此部分代码摘自https://www.jianshu.com/p/e9c837eba083
var typing = false;
$('#ipt').on('compositionstart',function(){
    typing = true;
})
$('#ipt').on('compositionend',function(){
    typing = false;
})
//oninput在oncompositionend之前执行,需加定时器
$('#ipt').on('input',function(){
    setTimeout(function() {
        if(!typing) {
            //To do something...
        }
    },0);
})

//或用keyup代替input
$('#ipt').on('input',function(){
    if(!typing) {
        //To do something...
    }
})
改写的scalajs版本
 var isInputZh = false //判断是否正在输入中文
 <input mhtml-onmount={(e: HTMLElement) =>
 	e.addEventListener("compositionstart", (e: Event) => {
                         isInputZh = true
                       })
	e.addEventListener("compositionend", (e: Event) => {
                         isInputZh = false
                         //To do something
                         checkWord(e.target.asInstanceOf[Input])
                       })
                     }
 	oninput={(e: Event) => 
 						//To do something
 						checkWord(e.target.asInstanceOf[Input]);  
 						}>
</input>

最后来看看解决后的效果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值