输入框组合输入时input事件处理

这篇博客探讨了在前端开发中如何处理日语输入法下数字输入的特殊情况。用户需求是input框只能接受数字,但日语输入法可能导致非数字字符的组合输入。文章详细介绍了遇到的问题,包括日语输入法下按下数字键可能组合出非数字字符,以及在tab键切换或上下键选择时input事件处理异常。为解决这些问题,提出了使用compositionstart、compositionend和input事件来监听输入状态,避免在组合输入期间误处理input事件。通过这种方法,可以确保在各种输入法环境下正确过滤非数字字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

用户要求input框仅能输入数字,不允许失焦时才处理非数字字符。

初次方案: v-modl绑定数据。onkeypress禁止键盘非数字按键,input处理半角全角和非数字字符。

问题

问题1.
日语输入法下,按下数字字符可以组合出非数字字符。
在这里插入图片描述
问题2.
日语输入法下,tab键切换/↑↓频繁切换时。会导致input事件处理异常。
例如:input中重复赋值、input框中的值异常清理。
原因:输入法待选文字切换时会频繁触发input事件,并且在框中显示的待选文字,也会在value中出现。

解决方案

compositionstart事件、compositionend事件、input事件
输入法输入时,会先触发compositionstart、compositionupdate、compostionend事件,之后才会触发input事件。但是直接输入数字/字母不会触发compostionstart/compositionupdate/compostitionend事件,只会触发input事件。

//此处是通过当input框focus事件给当前input框添加input相关事件
inputResultCheck(element) {
  let inCompositionEvent = false; //是否组合输入flag
  let vm = this;
  let inputEvent = function () {
    //普通input输入会直接触发
     if(!inCompositionEvent){
        //do something
       //vue下通过$nextTick触发单独事件,普通js下通过setTimeout函数触发单独事件。原因是为了调整被触发事件的优先度。防止与compositionend事件冲突
     } 
  };
  let inputStratEvent = function () {
    //触发组合输入事件,设置flag,禁止触发input事件
    inCompositionEvent = true;
  };
  let inputEndEvent = function () {
    //组合输入事件结束,修改falg,触发input事件
    inCompositionEvent = false;
    //可以针对组合输入做一些单独的操作
  };
  element.target.removeEventListener('input', inputEvent);
  element.target.removeEventListener('compositionstart', inputStratEvent);
  element.target.removeEventListener('compositionend', inputEndEvent);
  element.target.addEventListener('input', inputEvent);
  element.target.addEventListener('compositionstart', inputStratEvent);
  element.target.addEventListener('compositionend', inputEndEvent);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值