防抖
多次事件触发后,事件处理函数只执行一次,并且是在触发操作结束时执行
原理
对处理函数进行延时操作,若设定的延时到来之前,再次触发事件,则清楚上一次的延时操作定时器,重新定时。
搜索
当输入完最后一个字才调用查询接口,这个时候适用延迟执行的防抖函数,它总是在一连串(间隔小于wait的)函数触发之后调用。
点赞功能
当用户按下点赞的时候立即执行点赞回调,它总是在第一次调用,并且下一次调用必须与前一次调用的时间间隔大于wait才会触发。
代码
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
|
let debounce = (func, wait = 50, immediate = true) =>{ let timer, context, args
const later = () => setTimeout(() => { timer = null if (!immediate) { func.apply(context, args) context = args = null } }, wait)
return function (...params) { if (!timer) { timer = later() if (immediate) { func.apply(this, params) } else { context = this args = params } } else { clearTimeout(timer) timer = later() } } }
|
节流
防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行。
代码
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 61 62 63 64 65 66 67 68
| function _now() { return +new Date() }
let throttle = (func, wait, options)=> { var context, args, result; var timeout = null; var previous = 0; if (!options) options = {}; var later = function() { previous = options.leading === false ? 0 : _now(); timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; return function() { var now = _now(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; result = func.apply(context, args); if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; };
|
简版防抖节流
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
| //函数节流 const throttle = (fun, delay) => { let last = null return () => { const now = + new Date() if (now - last > delay) { fun() last = now } } } //实例 const throttleExample = throttle(() => console.log(1), 1000) //调用 throttleExample() throttleExample() throttleExample()
//函数防抖 cosnt debouce = (fun, delay) => { let timer = null return () => { clearTimeout(timer) timer = setTimeout(() => { fun() }, delay) } } //实例 const debouceExample = debouce(() => console.log(1), 1000) //调用 debouceExample() debouceExample() debouceExample()
|
最后更新时间:
如果您有什么想法或者好的建议,可以在下方留言