input框输入中文时,输入未完成触发事件。Vue中文输入法不触发input事件?

news/2024/10/23 22:28:52/

前言

在做搜索输入框时,产品期待实时搜索,就是边输入边搜索,然而对于中文输入法出现的效果,不同的产品可能有不同的意见,有的觉得输入未完成也应该触发搜索。但有的却认为应该在中文输入完成后再触发搜索。我发现在vue中通过v-model绑定的输入框的值,确时正常的,在中文输入未完成的时候不会修改value的值。针对这两种情况,分别做了屏蔽输入过程的change事件和vue中触发change事件。毕竟不同的需求有不同的效果,为了满足各种情况,还是都掌握的好。

如何屏蔽中文输入过程的change事件

在输入拼音过程也会触发input事件,效果如下图:
在这里插入图片描述
在输入中文时,拼音输入法会先显示拼音,然后在选定一个拼音后,才把真正的汉字显示在输入框里。默认情况下,输入框的 input 事件会在拼音输入时就触发,这可能会导致一些不希望的情况。

为了解决这个问题,可以使用 compositionstartcompositionend 事件来检测是否拼音输入中。在拼音输入中,设置一个标志(例如 isComposing),表示正在进行拼音输入。然后,在 input 事件中,你可以检查这个标志,如果正在拼音输入,就不触发 input 事件的处理,直到拼音输入结束,你才处理最终的字符输入。

这个方法就像是在输入之前检查你是否正在输入拼音,如果是,就等拼音输入完了再处理最终的文字输入,以避免不必要的 input 事件触发。

示例
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>中文输入法拼音输入示例</title>
</head>
<body><input type="text" id="textInput" oninput="onInput(event)" placeholder="oninput" /><script>let isComposing = false;const input1 = document.getElementById('textInput');console.log("111111", input1)input1.addEventListener('compositionstart', e=>{console.log("监听开始");isComposing = true;})input1.addEventListener('compositionend', e=>{console.log("监听结束", );isComposing = false;const value = e?.target?.value;// 处理console.log("最终的值是:", value)})const onInput = (e)=>{setTimeout(()=>{if(!isComposing)console.log("输入完成了", e?.target?.value)},0)}</script>
</body>
</html>

在这里插入图片描述

  • compositionstart 事件:当用户开始使用输入法输入中文拼音时,这个事件会触发。在这个事件触发时,通常会显示拼音输入的提示或候选项。

  • compositionend 事件:当用户完成拼音的选择,输入法将真正的中文字符显示在输入框中时,这个事件会触发。这表示拼音输入结束,真正的字符已经确定。

如何解决vue中文不触发change事件

然而在vue中却是解决过此问题的,比如我有如下代码,input绑定value,watch监听value的变化,然后打印出value。我这里是vue3

<template><div><input v-model="value" /></div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
const value = ref('');
watch(value, (value) => console.log('输出value', value));
</script>

控制台输出如下:
在这里插入图片描述
如果你做的功能类似百度或者谷歌搜索就算是中文输入法,在输入的过程中也触发input事件,此时也需要去解决这个问题。
然而这个代码也就使用了v-model,又在官网上看到,v-model等同于:value+@input。那就试一试这个
在这里插入图片描述
然而将代码替换之后,效果就出来了,哈哈哈皆大欢喜,问题解决了
在这里插入图片描述
为什么会这样呢,看一下源码,
Vue 3 源码仓库:https://github.com/vuejs/vue-next

在这里插入图片描述
分析
根据提供的 Vue 3 的 vModel 源码,确实没有处理中文输入过程中的 change 事件,这是因为Vue 3 为了提高性能和减少不必要的事件触发,采取了一种更精细的事件处理策略。具体来说:

  1. vModel 指令在 created 钩子中监听了 input 事件,而不是 change 事件。这是因为 input 事件更加实时,而 change 事件通常在输入框失去焦点时触发。所以 vModel 更关注实时的文本输入变化。

  2. 在处理 input 事件时,源码中通过检查 (e.target as any).composing 来避免在中文输入法输入过程中触发事件。这是因为在中文输入法输入时,文本可能会在用户还未完成输入时进行多次变化,如果每次都触发 input 事件可能导致性能问题。因此,只有当输入法输入完成时,才手动触发 input 事件。

具体来说,这段代码:

addEventListener(el, lazy ? 'change' : 'input', e => {if ((e.target as any).composing) return// ...
})

使用 (e.target as any).composing 来判断是否正在中文输入法的“组合”过程中,如果是,就不处理事件,直到输入法输入完成。这是为了避免不必要的事件触发。

中文输入过程是否需要触发事件,这个都是看需求怎么定,不同的场景有不同的需要,所以也不能算bug吧,但是作为程序员,问题总该要解决的。


http://www.ppmy.cn/news/1172409.html

相关文章

Redis的开发利用

在Redis中&#xff0c;可以使用两个数据结构来实现阅读量和点赞量的计数。 1. 使用字符串来计数阅读量和点赞量 在Redis中&#xff0c;字符串类型的数据可以通过 INCR 和 DECR 命令来实现原子递增和递减。 例如&#xff0c;假设要对一篇文章进行阅读量统计&#xff0c;可以使…

【Linux系统编程】命令模式2

目录 一&#xff0c;Linux下的初阶认识 1&#xff0c;管道 2&#xff0c;时间戳 二&#xff0c;Liunx系统命令操作 1&#xff0c;date时间指令 2&#xff0c;cal日历指令 3&#xff0c;which和find查找指令 3-1&#xff0c;which指令&#xff1a; 3-2&#xff0c;find…

数字化转型“黑话”知多少?一文让你不仅听得懂、还会落地执行

何为OEE&#xff1f;如何提升OEE&#xff1f; 从上图可知&#xff0c;客户是机加工行业的&#xff0c;而机加工行业属于重资产行业&#xff0c;主要以设备生产为主&#xff0c;管好设备、提升设备的综合效率&#xff08;OEE&#xff09;。效率高了&#xff0c;毛利率自然也会增…

Proteus仿真--量程自动切换数字电压表(仿真+程序)

本文主要介绍基于51单片机的量程自动切换数字电压表Proteus仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 简介 硬件电路主要分为单片机主控模块、AD转换模块、量程选择模块以及数码管显示模块 &#xff08;1&#xff09;单片机主控模块&#xff1a;单片…

YOLO V8训练自己的数据集并测试

目录 1 YOLOV8部署 2 标注软件labelme安装 3 将labelme转化为YOLOV8支持的数据格式 4 开始训练 5 利用训练结果进行测试 1 YOLOV8部署 我的一篇博客已经提到&#xff0c;这里不再赘述&#xff1a; YOLO V8语义分割模型部署-CSDN博客YOLO V8语义分割模型部署https://blog.cs…

全局下载报错怎么办

举个例子&#xff0c;当你要全局下载create-react-app&#xff0c;报如下图所示的错 这个时候&#xff0c;关闭掉git base,再以管理员身份运行 你再次下载&#xff0c;ok了

Redis为什么变慢了

一、Redis为什么变慢了 1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了。 所以,你只有了解了你的…

62 最小路径和

最小路径和 题解1 DP 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条 从左上角到右下角的路径&#xff0c;使得路径上的 数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 题解1 DP class Solution { public:int minPathSum(vector&l…