今天我们要讲什么?
有的时候也不知道要写点什么。在掘金摸鱼的时候看到了一个题「第 79 题:input 搜索如何防抖,如何处理中文输入」,感觉挺有意思的。今天我们就来说一说这些相关的知识
- 节流(throttle )、去抖(debounce )
- input 标签支持的事件(和值相关的)
- 正题-搜索框-去抖-处理中文input时候的异常
节流(throttle )、去抖(debounce )
节流(throttle )、去抖(debounce ),之前写过,有现成的,我就不写了。
input 标签支持的事件
键盘事件
- keydown 事件
键盘按下事件
- keypress 事件
按下产生字符值的键时会触发。如字母、数字、标点符号。不产生字符值的键的例子是修饰键如 Alt、Shift、Ctrl、backspace 等
- keyup 事件
键盘弹起事件
值改变事件
- change 事件
值改变事件,在失去焦点的时候判断是否改变,如果改变了会触发。
可以先输入123
,然后改成123456
这个时候把456
删除,就会发现并不会触发change
。测试地址-change事件
- input 事件
值改变事件,在每次改变的时候触发。
同上测试案例,会发现触发了9
次input
事件。测试地址-input事件
输入法事件
- compositionstart
输入法的第一个字母时触发。进去输入法状态
- compositionupdate
输入法的每次更新时触发。输入法状态输入内容。
- compositionend
输入法选择之后触发。退出输入法状态
搜索框-去抖-处理中文input时候的异常
其实看到上面的那些逻辑我们就可以知道,compositionstart
是我们需要监测的事件
事件触发顺序
进入输入法状态:compositionstart=>compositionupdate=>input
输入中:compositionupdate=>input
退出输入法状态:compositionupdate=>input=>compositionend
实现方案
- 触发了
compositionupdate
就把下次input
抛弃。compositionend
触发一下input
的事件;
测试地址-方案1,效果感觉很不错,去抖的话,给 demo5Console = debounce(demo5Console, 3000)
。
compositionstart
的时候改掉value
,当然这个方案没成功,因为会导致输入框都没了。
总结一下
在PC端有输入的时候我们需要通过 compositionupdate
来纠正输入框的内容。
为什么不说移动端呢?因为我还没测试。