/**
* 防抖函数,且必须等待方法(回调函数)执行完成,才能继续触发
* 说明:在单位时间内触发多次事件时,只为最后一次执行方法(同步this、事件类型)
* 注意:由于未知原因,当在方法(回调函数)执行过程中,再次触发事件,会产生同步执行的现象
* 即当前触发后会在上次的执行完成后立即执行(代码逻辑上不会执行,更不会同步)。若各位有解决办法请指正
* @param {Function} fn 执行的方法
* @param {Number} delay (0)监听时的延迟时间
* @return {Function} 具体防抖函数
*/
function debounce(fn, delay) {
let timer, flag = false
return function (e) {
if (flag === true) return
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
flag = true
fn.call(this, e)
flag = false
}, delay)
}
}
/**
* 节流函数,且必须等待方法(回调函数)执行完成,才能继续触发
* 说明:在单位时间内触发多次事件时,只为首次执行方法(同步this、事件类型)
* @param {Function} fn 执行的方法
* @param {Number} delay (0)监听时的延迟时间
* @return {Function} 具体节流函数
*/
function throttle(fn, delay) {
let timer = 0,flag = false
return function (e) {
if (timer === 0 && flag === false) {
timer = setTimeout(() => timer = 0, delay)
flag = true
fn.call(this, e)// 因首次无需等待延迟,所以必须在计时器之后执行
flag = false
}
}
}
/**
* [同步]让程序暂停若干毫秒后执行
* 说明:经过测试,无参数时,实例化Blob对象的运算时长是最合适的,且高度兼容
* @param {Number} ms [无延迟]要延迟的毫秒;强制转为数字后若不大于0则无效果
*/
function sleep(ms) {
ms = Math.ceil(+ms)
if (ms > 0) {
ms += Date.now()
while (Date.now() < ms) new Blob()
}
}
JS:实现完整的防抖和节流方法,且触发时必须等待执行完成才会继续触发
于 2024-08-16 18:33:56 首次发布