第 79 题:input 搜索如何防抖,如何处理中文输入
防抖就不说了,主要是这里提到的中文输入问题,其实看过 elementui 框架源码的童鞋都应该知道,elementui 是通过 compositionstart & compositionend 做的中文输入处理:
相关代码:
<input ref="input" @compositionstart="handleComposition" @compositionupdate="handleComposition" @compositionend="handleComposition" >
这3个方法是原生的方法,这里简单介绍下,官方定义如下 compositionstart 事件触发于一段文字的输入之前(类似于 keydown 事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)
简单来说就是切换中文输入法时在打拼音时(此时 input 内还没有填入真正的内容),会首先触发 compositionstart,然后每打一个拼音字母,触发 compositionupdate,最后将输入好的中文填入 input 中时触发 compositionend。触发 compositionstart 时,文本框会填入 虚拟文本(待确认文本),同时触发 input 事件;在触发 compositionend 时,就是填入实际内容后(已确认文本),所以这里如果不想触发 input 事件的话就得设置一个 bool 变量来控制。
根据上图可以看到
输入到 input 框触发 input 事件,失去焦点后内容有改变触发 change 事件,识别到你开始使用中文输入法触发 compositionstart 事件,未输入结束但还在输入中触发 compositionupdate 事件
输入完成(也就是我们回车或者选择了对应的文字插入到输入框的时刻)触发 compositionend 事件。
那么问题来了 使用这几个事件能做什么?因为 input 组件常常跟 form 表单一起出现,需要做表单验证
为了解决中文输入法输入内容时还没将中文插入到输入框就验证的问题,我们希望中文输入完成以后才验证。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
throttle这个是节流
防抖
贴个完整的
function debounce(func,wait,immediate){
// wait 延迟执行毫秒数, immediate true 表立即执行,false 表非立即执行
let timeout;
return function () {
let context = this;
let args = arguments;
}
}
vue版本:
防抖就不说了
哈哈哈 就是没区别
我发现需要注意的是input事件是会在compositionend之前被触发:
有问题欢迎指正!
我怎么感觉你们两个没什么区别?
你这不对哦,不是防抖
我看怎么像节流
'jieliu',拼音没有那么棒棒hhh
参考vue源码对v-model的实现中,对输入中文的处理
https://segmentfault.com/a/1190000012490380
简易防抖
有一个onpaste 事件
这个在复制粘贴中文内容的时候不会触发事件