中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

JS的防抖與節流

發布時間:2020-05-08 13:55:04 來源:億速云 閱讀:329 作者:Leah 欄目:web開發

今天小編給大家分享的是JS的防抖與節流的詳細介紹,相信大部分人都不太了解,為了讓大家更加了解,所以給大家總結了以下內容,話不多說,一起往下看吧。

概念和例子

函數防抖(debounce)

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

看一個(栗子):

//模擬一段ajax請求
function ajax(content) {
  console.log('ajax request ' + content)
}
let inputa = document.getElementById('unDebounce')
inputa.addEventListener('keyup', function (e) {
    ajax(e.target.value)
})

復制代碼看一下運行結果:

JS的防抖與節流

可以看到,我們只要按下鍵盤,就會觸發這次ajax請求。不僅從資源上來說是很浪費的行為,而且實際應用中,用戶也是輸出完整的字符后,才會請求。下面我們優化一下:

//模擬一段ajax請求
function ajax(content) {
  console.log('ajax request ' + content)
}
function debounce(fun, delay) {
    return function (args) {
        let that = this
        let _args = args
        clearTimeout(fun.id)
        fun.id = setTimeout(function () {
            fun.call(that, _args)
        }, delay)
    }
}
    
let inputb = document.getElementById('debounce')
let debounceAjax = debounce(ajax, 500)
inputb.addEventListener('keyup', function (e) {
        debounceAjax(e.target.value)
    })

復制代碼看一下運行結果:

JS的防抖與節流

可以看到,我們加入了防抖以后,當你在頻繁的輸入時,并不會發送請求,只有當你在指定間隔內沒有輸入時,才會執行函數。如果停止輸入但是在指定間隔內又輸入,會重新觸發計時。

再看一個:

let biu = function () {
    console.log('biu biu biu',new Date().Format('HH:mm:ss'))
}
let boom = function () {
    console.log('boom boom boom',new Date().Format('HH:mm:ss'))
}
setInterval(debounce(biu,500),1000)
setInterval(debounce(boom,2000),1000)

復制代碼看一下運行結果:
JS的防抖與節流

這個就很好的解釋了,如果在時間間隔內執行函數,會重新觸發計時。biu會在第一次1.5s執行后,每隔1s執行一次,而boom一次也不會執行。因為它的時間間隔是2s,而執行時間是1s,所以每次都會重新觸發計時

個人理解 函數防抖就是法師發技能的時候要讀條,技能讀條沒完再按技能就會重新讀條。

函數節流(throttle)

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

看一個:

function throttle(fun, delay) {
        let last, deferTimer
        return function (args) {
            let that = this
            let _args = arguments
            let now = +new Date()
            if (last && now < last + delay) {
                clearTimeout(deferTimer)
                deferTimer = setTimeout(function () {
                    last = now
                    fun.apply(that, _args)
                }, delay)
            }else {
                last = now
                fun.apply(that,_args)
            }
        }
    }
    let throttleAjax = throttle(ajax, 1000)
    let inputc = document.getElementById('throttle')
    inputc.addEventListener('keyup', function(e) {
        throttleAjax(e.target.value)
    })

復制代碼看一下運行結果:

JS的防抖與節流

可以看到,我們在不斷輸入時,ajax會按照我們設定的時間,每1s執行一次。

結合剛剛biubiubiu的:

    let biubiu = function () {
        console.log('biu biu biu', new Date().Format('HH:mm:ss'))
    }
    setInterval(throttle(biubiu,1000),10)

JS的防抖與節流

不管我們設定的執行時間間隔多小,總是1s內只執行一次。

個人理解 函數節流就是fps游戲的射速,就算一直按著鼠標射擊,也只會在規定射速內射出子彈。

總結

函數防抖和函數節流都是防止某一時間頻繁觸發,但是這兩兄弟之間的原理卻不一樣。

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

結合應用場景

debounce

search搜索聯想,用戶在不斷輸入值時,用防抖來節約請求資源。

window觸發resize的時候,不斷的調整瀏覽器窗口大小會不斷的觸發這個事件,用防抖來讓其只觸發一次

throttle

鼠標不斷點擊觸發,mousedown(單位時間內只觸發一次)

監聽滾動事件,比如是否滑到底部自動加載更多,用throttle來判斷

關于JS的防抖與節流就分享到這里了,希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

宜宾市| 营口市| 时尚| 嘉义县| 公主岭市| 葫芦岛市| 永善县| 金湖县| 民县| 永定县| 凤凰县| 双桥区| 富蕴县| 大同县| 鄂温| 黄大仙区| 永和县| 福海县| 金坛市| 尉犁县| 大悟县| 阿鲁科尔沁旗| 射洪县| 定陶县| 阳新县| 互助| 奈曼旗| 庆城县| 大丰市| 西贡区| 双城市| 丹阳市| 灌阳县| 蒙自县| 合阳县| 商丘市| 河津市| 根河市| 综艺| 阳原县| 屏东县|