js、vue防抖函數、節流函數,工具類封裝


 防抖函數(可用於防止重復提交)

 當持續觸發事件時,一定時間段內沒有再觸發事件,事件處理函數才會執行一次, 如果設定時間到來之前,又觸發了事件,就重新開始延時。也就是說當一個用戶一直觸發這個函數,且每次觸發函數的間隔小於既定時間,那么防抖的情況下只會執行一次。

/**
 * 防抖函數(可用於防止重復提交)
 * 當持續觸發事件時,一定時間段內沒有再觸發事件,事件處理函數才會執行一次,
 * 如果設定時間到來之前,又觸發了事件,就重新開始延時。也就是說當一個用戶一直觸發這個函數,
 * 且每次觸發函數的間隔小於既定時間,那么防抖的情況下只會執行一次。
 *
 * @param func 執行函數
 * @param wait 間隔時間
 * @param immediate 立即執行
 */
function debounce(fn, wait, immediate) {
    let timer;
    return function() {
        if (timer) clearTimeout(timer);
        if (immediate) {
            // 如果已經執行過,不再執行
            var callNow = !timer;
            timer = setTimeout(() => {
                timer = null;
            }, wait)
            if (callNow) {
                fn.apply(this, arguments)
            }
        } else {
            timer = setTimeout(() => {
                fn.apply(this, arguments)
            }, wait);
        }
    }
}

 節流函數

當持續觸發事件時,保證在一定時間內只調用一次事件處理函數,意思就是說,假設一個用戶一直觸發這個函數,且每次觸發小於既定值,函數節流會每隔這個時間調用一次
用一句話總結防抖和節流的區別:防抖是將多次執行變為最后一次執行,節流是將多次執行變為每隔一段時間執行
實現函數節流我們主要有兩種方法:時間戳和定時器

/**
 * 節流函數
 * 當持續觸發事件時,保證在一定時間內只調用一次事件處理函數,意思就是說,假設一個用戶一直觸發這個函數,且每次觸發
 * 小於既定值,函數節流會每隔這個時間調用一次
 * 用一句話總結防抖和節流的區別:防抖是將多次執行變為最后一次執行,節流是將多次執行變為每隔一段時間執行
 * 實現函數節流我們主要有兩種方法:時間戳和定時器
 *
 * @param func 執行函數
 * @param wait 間隔時間
 * @param options 立即執行
 * options中  leading:false 表示禁用第一次執行 trailing: false 表示禁用停止觸發的回調
 */
function throttle(fn, wait, options = {}) {
    let timer;
    let previous = 0;
    let throttled = function() {
        let now = +new Date();
        // remaining 不觸發下一次函數的剩余時間
        if (!previous && options.leading === false) previous = now;
        let remaining = wait - (now - previous);
        if (remaining < 0) {
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            previous = now;
            fn.apply(this, arguments)
        } else if (!timer && options.trailing !== false) {
            timer = setTimeout(() => {
                previous = options.leading === false ? 0 : new Date().getTime();
                timer = null;
                fn.apply(this, arguments);
            }, remaining);
        }
    }
    return throttled;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM