js防抖节流extend

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
当用户使用中文 IME 在搜索框里输入文字时,输入法里的备选词还没上屏,AJAX 请求就已经开始了,导致产生了一堆无意义的搜索请求。
根因:使用 IME 在文本框输入时,通常需要一连串的键盘操作、语音识别或者点击输入法的备选词,IME 关闭前文本框内输入的内容属于非直接输入,而非直接输入会触发 input 事件。
简版代码
let isComposing = false;

inputElm.addEventListener('compositionstart', e => isComposing = true);

inputElm.addEventListener('compositionend', e => {
isComposing = false;

// 派发 input 事件
const inputEvt = new Event('input');
e.target.dispatchEvent(inputEvt);
});

inputElm.addEventListener('input', e => {
// 如当前 IME 未关闭(文本未上屏),则拦截
if (isComposing) return;
console.log(e.target.value)
// ajax search...
});

高级代码
inputElm.addEventListener('compositionend', e => {
// 派发 input 事件
const inputEvt = new Event('input');
e.target.dispatchEvent(inputEvt);
});

inputElm.addEventListener('input', e => {
// 如当前 IME 未关闭(文本未上屏),则拦截
if (e.isComposing) return;
console.log(e.target.value)
// ajax search...
});
兼容 IE 和 Safari
inputElm.addEventListener('compositionstart', function(e) {
e.target.isComposing = true; // 把判断合成状态的变量保存到当前元素上(DOM)
});

inputElm.addEventListener('compositionend', function(e) {
e.target.isComposing = false;

var inputEvt;
if (typeof Event === 'function') {
inputEvt = new Event('input')
} else {
inputEvt = document.createEvent('Event');
inputEvt.initEvent('input', true, true);
}

e.target.dispatchEvent(inputEvt);
});

inputElm.addEventListener('input', function(e) {
// 如当前 IME 未关闭(文本未上屏),则拦截
if (e.target.isComposing) return;
console.log(e.target.value)
// ajax search...
});