91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript實現函數防抖與節流

發布時間:2020-05-25 15:03:16 來源:億速云 閱讀:231 作者:鴿子 欄目:web開發

概念理解

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

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

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('keyup',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('keyup',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('keyup',function (e) {
    throttleFn(e.target.value);
})

以上就是js如何實現函數防抖與節流的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

舒城县| 宝山区| 聂荣县| 南城县| 若尔盖县| 白河县| 沁水县| 邯郸市| 夏河县| 荥经县| 永丰县| 洛隆县| 三门县| 周至县| 岱山县| 炎陵县| 区。| 元氏县| 咸宁市| 白水县| 阳城县| 济阳县| 汉源县| 那曲县| 个旧市| 西乡县| 广南县| 清新县| 株洲县| 闸北区| 咸阳市| 凤山县| 南安市| 溧阳市| 手机| 江油市| 济南市| 高碑店市| 通化市| 庄浪县| 彭泽县|