屏蔽进行输入法时的监听事件

问题

vue3文档中由于中日韩需要拼音,在输入框输入的时候有可能会出现在拼字的时候也会被监听到

image-20230830184046769

在vue的v-model的输入框中,正常输入字母和汉字可以监听到,但是输入法中的不会监听到,如上图

但是如果直接使用原生的input事件去监听,我们可以发现拼字的时候也会被监听到,我们该怎么去实现他这个功能呢?

<!-- 无法控制监听 -->
<input type="text" class="input" @input="oninput()" id="input1" />
<script>
    var oninput = function (e) {
      console.log("e", e)
      document.querySelector(".text").textContent = e.target.value;
    };
</script>

监听输入法事件

通过MDN我们可以发现一个属性compositionstart compositionend

compositionstart文本合成系统如 input method editor(即输入法编辑器)开始新的输入合成时会触发 compositionstart 事件。

说人话就是你在开始拼字的时候触发这个事件compositionstart,拼字结束的时候调用compositionstart这个事件,于是我们就可以写一个flag,当flag为false就让其输入

      let composition = false;

      let input1 = document.querySelector("#input1");

      input1.addEventListener("compositionstart", (e) => {
        composition = true;
      });
      input1.addEventListener("compositionend", (e) => {
        composition=false
        //此处再调用input因为在你确认字之后,并不会触发这个事件导致字不上屏
        oninput(e)
      })
      var oninput = function (e) {
        if(composition)return
        document.querySelector(".text").textContent = e.target.value;
      };

监听e中的输入法标识(推荐)

​ 这种精简,原理一样,需要再结束的时候再次调用input事件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <input type="text" class="input" @input="oninput()" id="input1" />
    <span class="text">12123</span>
    <script>
      var oninput = function (e) {
        if (e.isComposing) return; // 如果正在进行拼字,直接返回
        console.log("text", document.querySelector(".text").innerText);
        document.querySelector(".text").textContent = e.target.value;
      };

      var input1 = document.querySelector("#input1");
      input1.addEventListener("compositionend", oninput);
    </script>
  </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值