首页 > 其他分享 >解决input中输入中文过程中会触发input事件的问题

解决input中输入中文过程中会触发input事件的问题

时间:2023-04-04 17:04:29浏览次数:55  
标签:触发 中文 compositionend flag 事件 input ev

问题描述:

监听文本输入框的input事件,在拼写汉字时会触发input事件,如下图:

解决input中输入中文过程中会触发input事件的问题_html

需求:

选词完成后触发input事件,只触发一次。

解决办法:

通过查阅资料得知在输入中文(包括语音识别时)会先后触发compositionstartcompositionupdatecompositionend事件。

触发compositionstart时,文本框会填入 “虚拟文本”(待确认文本),同时触发input事件;在触发compositionend时,就是填入实际内容后(已确认文本)。

mdn中composition相关事件的描述

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

compositionend: 当文本段落的组成完成或取消时,compositionend 事件将被触发 (具有特殊字符的触发,需要一系列键和其他输入,如语音识别或移动中的字词建议)。

个人理解:

  • compositionstart 在输入一段需要确认的文本如拼音->汉字/语音时会触发
  • compositionend 在拼音选词完成/语音输入完毕时会触发

思路如下:

  1. 声明一个标记flag=false
  2. 在compositionstart两个事件中将flag设置为true
  3. 在compositionend两个事件中将flag设置为false(由于该事件晚于input事件,所有需要在该事件中执行一遍input事件所作的工作)
  4. 在input事件中通过flag的值来判断当前输入的状态

完整代码

<!DOCTYPE html>
<html lang="zh">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Input</title>
</head>
<body>
   <input id="text" type="text" style="width: 400px;height: 40px;">
</body>
<script>
   let flag = false
   const textEle = document.querySelector("#text");
   const search = (val)=>{
   	console.log(val)
   }
   textEle.addEventListener('input', ev=>{
   	if(!flag){
   		search(ev.target.value)
   	}
   })
   
   textEle.addEventListener('compositionstart', (ev)=>{
   	flag = true;
   	console.log('start:', ev.target.value)
   })
   textEle.addEventListener('compositionupdate', (ev)=>{
   	console.log('update:', ev.target.value)
   })
   textEle.addEventListener('compositionend', (ev)=>{
   	flag = false;
   	console.log('end:', ev.target.value)
   })
</script>
</html>

输出截图

解决input中输入中文过程中会触发input事件的问题_compositionstart_02



标签:触发,中文,compositionend,flag,事件,input,ev
From: https://blog.51cto.com/jikun/6169046

相关文章

  • Microsoft Remote Desktop(微软远程连接软件)v10.8.1中文正式版
    MicrosoftRemoteDesktopmac版是Macos上一款微软远程连接软件,RemoteDesktop下载可以通过Mac电脑进行远程管理Windows平台的程序访问与文件管理等操作,十分好用。在MicrosoftRemoteDesktop客户端中使用RemoteFX体验Windows的强大功能,旨在帮助您在任何地方完成工作。Macw提供mic......
  • QT中文字符显示问题
    解决方案有两个(1)使用QString::fromLocal8Bit(constQByteArray&str)(2)直接在头文件加上#pragmaexecution_character_set("utf-8")此外将int类型转为QString的方式不是QString(num),这样转换在qDebug会输出unicode。正确方式为QString::number(num)......
  • InvokeFieldUpdateService未触发插件值更新
    K3BillView.InvokeFieldUpdateService("F_JNXM_Supplier",0);经验分享:.InvokeFieldUpdateService触发值更新这个方法执行有个前提,必须进行了不同值的赋值,才会触发,例如,下推的时候,如果在转换规则给字段配置了数据,在表单中单独调这个方法是不会执行的,必须得现有一个......
  • 如何给文件批量重命名?选中文件后F2,还有比它更好的方法?​
    电脑键盘上的F2确实是一个重命名键,但是它需要一个个手动点,缺少了点速度,而且电脑永久了文件就会越来越多,不好手动弄,下面随小编一起用这个新的处理技巧来快速重命名文件。需要哪些工具?安装一个文件批量改名高手文件素材若干怎么快速重命名?步骤1:打开【文件批量改名高手】,在“文件批量......
  • 为什么 B 页面的 unload 事件在刷新后点击浏览器的返回按钮不触发?
    ......
  • Calibre修改保存电子书为中文
    已知路径肯定是英文的,,,保存到文件夹的时候可以有中文。3张图解决问题......
  • 达芬奇中文入门到精通视频教程DaVinci Resolve(附软件下载)
    今天给大家分享的是达芬奇(DaVinciResolve)中文入门到精通视频教程。达芬奇是一款专业的影视后期制作软件,它可以帮助影视制作人员进行视频调色、视觉特效、音频编辑和剪辑等方面的处理。达芬奇18破解版是迄今最先进的调色工具。DaVinciResolveStudio破解版和专业多轨道剪辑功......
  • 【AGC】引入AGC插件SDK后应用出现中文名乱码问题
    【关键字】AGC、android、插件 【问题描述】开发者反馈应用集成了AGCAppLinking服务,在引入AGC插件时遇到了一些问题。引入AGC插件后应用的中文名出现乱码的问题,具体如下所述:在应用级的build.gradle中引入com.huawei.agconnect后应用中文名乱码1.在android/app/build.gradl......
  • Swift中文教程(十七) 可选链
    可选链(OptionalChaining)是一种可以请求和调用属性、方法及子脚本的过程,它的自判断性体现于请求或调用的目标当前可能为空(nil)。如果自判断的目标有值,那么调用就会成功;相反,如果选择的目标为空(nil),则这种调用将返回空(nil)。多次请求或调用可以被链接在一起形成一个链,如果任何一个节点为......
  • Android与STM32通信中巧妙解决中文乱码问题
    前言网上一大堆都是要多种格式相互转换,并且要很大的字库文件,对于小应用工程,小容量的STM32芯片,额外多出这些开销会感到蛮不舒服的,而且绝大部分的乱码问题时发生在STM32这边,所以本文是从Android端解决编码格式转化的问题,STM32那边稍做处理即可,我做的转换是从UTF-8转到GBK解决方案......