防抖
函数防抖和节流,都是控制事件触发频率的方法。具体实现可以看我的这篇文章
input 如何处理中文输入
如果只是单纯的使用 input 事件来监听 input 值的改变,那么每次敲击键盘,输入一个字母都会触发 input 事件,其实我们想要的是获取用户输入的中文再进行后续操作。
我们可以假象一下,输入中文时的字母都是预输入,只有当选择候选词之后,input得到的值才是我们想要的。
现在,向大家介绍两个新的 DOM 事件:compositionstart、compositionend
compositionstart:compositionstart事件触发于一段文字的输入之前compositionend:当文本段落的组成完成或取消时,compositionend事件将被触发
<input type="text">
let inputElement = document.querySelector('input')
let canRun = true
inputElement.addEventListener('compositionstart', function(){
console.log('start')
canRun = false
})
inputElement.addEventListener('compositionend', function(){
console.log('end')
canRun = true
})
inputElement.addEventListener('input', debounce(fn))
function debounce(fn) {
let timer = null;
return function() {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, arguments)
}, 500)
};
}
function fn(e){
if(canRun){
console.log(e.target.value)
}
}
当我们切换到中文输入法输入时开始在 input 中输入时,compositionstart 的回调函数被调用,将 canRun 状态切换为 false,半秒后执行 fn 时,canRun 状态为 false,不进行任何操作,当中文输入结束后,compositionend 的回调函数被调用,将 canRun 变为 true,此时 input 的回调函数调用,就可以执行后续的操作了,其实就是利用了 compositionstart 和 compositionend 来切换状态机的状态