首頁 >web前端 >js教程 >js如何實作函數防手震與節流

js如何實作函數防手震與節流

藏色散人
藏色散人轉載
2020-05-24 13:34:492328瀏覽

概念理解

防手震:在事件觸發n秒後再執行回調,如果在這n秒內又被觸發,則重新計時。

節流:規定在一個單位時間內,只能觸發一次函數。如果這個單位時間內觸發多次函數,只有一次生效。

相關推薦:《javascript高階教學

js函數防手震與節流的差異:

函數防抖是某一段時間只執行一次,而函數節流是間隔時間執行。

個人踩坑

1、透過理解函數防手震與函數節流的概念後,使用閉包實現函數防手震與節流,沒有考慮到對於節流,如果使用者在下次請求之前已輸入完畢,但是此時不會再進行請求,則會導致最後輸入的文字獲取其他事件改變不發請求,即漏請求,所以需要加一個setTimeout兜底函數,且在每次準備請求的時候,設一個flag,即是否已經發送請求,如果走了正常週期發送請求,改為true,否則即為false,走setTimout,讓setTimeout比剩餘事件略長一些,優先走節流定時器請求;

2、如果使用箭頭函數,則不需要儲存this。

程式碼實作

 <div>
    <div>
        <input type="text" id="unDebounce">
    </div>
    <div>
        <input type="text" id="debounce">
    </div>
    <div>
        <input type="text" id="throttle">
    </div>
</div>
// 函数防抖节流
var elem1 = document.getElementById("unDebounce")
var elem2 = document.getElementById("debounce")
var elem3 = document.getElementById("throttle")
// 不防抖
function ajax1(value){
    console.log("不防抖,不节流")
    console.log(value)
}
elem1.addEventListener(&#39;keyup&#39;,function (e) {
    ajax1(e.target.value);
})
// 防抖
function ajax2(value) {
    console.log(value)
}
function debounce(func,delay){
    console.log("函数防抖")
    let timer = null;
    return function(...args){
        if(timer){
            console.log("清除定时器")
            clearTimeout(timer)
        }
        timer = setTimeout(()=>{
            console.log("重新计时")
            func.call(this,...args)
        },delay)
    }
}
let debounceFn = debounce(ajax2,1000)
elem2.addEventListener(&#39;keyup&#39;,function (e) {
    debounceFn(e.target.value);
})
// // 节流
function ajax3(value){
    console.log(value)
}
function throttle(func,delay){
    console.log("函数节流")
    let lastTime = 0;
    let timer = null;
    return function (...args) {
        let flag = false ; // 还没发送数据
        let now = +new Date().getTime();
        if(timer){
            clearTimeout(timer)
        }
        if(now-lastTime>=delay){
            console.log("当前时间大于设定时间,开始执行函数")
            func.apply(this,args)
            console.log("time1",new Date().getTime())
            lastTime = now;
            flag = true; // 发送了数据
        }else{
            timer = setTimeout(()=>{
                if(!flag){ // 如果没有发送数据成功,再走这个,兜底发送请求
                    func.apply(this,args)
                    console.log("time2",new Date().getTime())
                }
            },delay-(now-lastTime)+1000) // setTimeout多一些,优先执行周期性请求
        }
    }
}
let throttleFn = throttle(ajax3,5000)
elem3.addEventListener(&#39;keyup&#39;,function (e) {
    throttleFn(e.target.value);
})

以上是js如何實作函數防手震與節流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除