亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談JavaScript節(jié)流與防抖

 更新時(shí)間:2021年11月17日 14:33:30   作者:浪漫主義碼農(nóng)  
這篇文章主要為大家介紹了JavaScript的節(jié)流與防抖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

節(jié)流與防抖

背景:當(dāng)我們頻繁去請(qǐng)求資源、接口等其他的時(shí)候,就會(huì)造成操作Dom頻繁,接口壓力大等等,性能下降。比如我有時(shí)候會(huì)每次搜索會(huì)猛地敲回車(chē),在網(wǎng)絡(luò)不很好的時(shí)候,點(diǎn)擊下一頁(yè)按鈕的時(shí)候也會(huì)一直點(diǎn),可能網(wǎng)絡(luò)不好也可能服務(wù)器性能低。

為了避免頻繁觸發(fā)同一事件或請(qǐng)求,這時(shí)候就要用到節(jié)流和防抖了。

what?這是啥?當(dāng)我第一次聽(tīng)到這兩個(gè)名字的時(shí)候,心想是指節(jié)省流量、防止手抖嗎。百思不得其解,趕緊就去學(xué)習(xí)。

概念:

簡(jiǎn)單來(lái)說(shuō):節(jié)流和防抖就是為了防止事件在短時(shí)間內(nèi)多次觸發(fā)的兩種解決方案。都是用過(guò)減少請(qǐng)求的次數(shù),來(lái)降低壓力,提高性能。

區(qū)別

節(jié)流:在一定的時(shí)間內(nèi)只會(huì)請(qǐng)求一次。

可以理解為:公交車(chē),每個(gè)人是一次點(diǎn)擊請(qǐng)求,每十分鐘開(kāi)一趟車(chē),發(fā)送請(qǐng)求

防抖:觸發(fā)事件后n秒后才能執(zhí)行函數(shù),如果在n秒內(nèi)觸發(fā)了事件,則會(huì)重新計(jì)算執(zhí)行時(shí)間。

比如在一段時(shí)間內(nèi),我一直點(diǎn)擊按鈕,以最后一次點(diǎn)擊為準(zhǔn)發(fā)送一次請(qǐng)求。

節(jié)流實(shí)現(xiàn)

解決思路 :

使用時(shí)間戳(發(fā)生在一段時(shí)間的開(kāi)始),就是在計(jì)算

當(dāng)前點(diǎn)擊的時(shí)間 - 上一次執(zhí)行函數(shù)的時(shí)間 > 我設(shè)定的時(shí)間戳 ,就執(zhí)行一次函數(shù)

缺點(diǎn):第一次直接觸發(fā) 最后一次一段時(shí)間內(nèi)無(wú)法觸發(fā)

給一個(gè)場(chǎng)景,當(dāng)我們搜索數(shù)據(jù)的時(shí)候,發(fā)起請(qǐng)求,沒(méi)有做處理是這樣的,請(qǐng)求肯定太過(guò)于頻繁

在這里插入圖片描述

節(jié)流函數(shù)

代碼:

<body>
    <div>
        <span>節(jié)流處理</span><input id="input" type="text">
        <button id="btn">請(qǐng)求</button>
    </div>
</body>
<script>
    var btn = document.getElementById("btn")
    btn.addEventListener("click", throttle(output, 1000))  //添加點(diǎn)擊事件監(jiān)聽(tīng)
    function output(e) {
        console.log(this, e)
        console.log(document.getElementById("input").value)  //模擬發(fā)起一次請(qǐng)求
    }
//節(jié)流函數(shù)
    function throttle(fn, delay) {  // fn為執(zhí)行的函數(shù),delay為延遲時(shí)間
        var last = 0;  //上一次結(jié)束的時(shí)間
        return function () {
            var cur = Date.now()
            console.log(cur-last)
            if (cur - last > delay) {
                fn.apply(this, arguments)  //執(zhí)行函數(shù)
                last = cur //更新上一次時(shí)間
            }
        }
    }
</script>

效果:

在這里插入圖片描述

防抖實(shí)現(xiàn)

解決思路 :

定時(shí)器(發(fā)生在定時(shí)結(jié)束)。缺點(diǎn):第一次不觸發(fā) 最后一次延遲觸發(fā)

就是設(shè)置一個(gè)定時(shí)器,如果一直點(diǎn)擊則清除定時(shí)器,最后一次開(kāi)啟定時(shí)器

防抖函數(shù)

代碼:

<body>
    <div>
        <span>防抖處理</span><input id="input" type="text">
        <button id="btn">請(qǐng)求</button>
    </div>
</body>
<script>
    var btn = document.getElementById("btn")
    btn.addEventListener("click", debounce(output, 1000))  //添加點(diǎn)擊事件監(jiān)聽(tīng)
    function output(e) {
        console.log(this, e)
        console.log(document.getElementById("input").value)  //模擬發(fā)起一次請(qǐng)求
    }
    function debounce(fn, delay) {  // fn為執(zhí)行的函數(shù),delay為延遲時(shí)間
        var time = null;  //定時(shí)器
        return function () {
            clearTimeout(time);  //清除定時(shí)器
            let context = this;  //獲取當(dāng)前button上下文 如果不指定,箭頭函數(shù)就會(huì)一直往外找到window
            let args = arguments;
            time = setTimeout(() => {
                fn.apply(context, args);
            }, delay);
        }
    }
</script>

效果:

在這里插入圖片描述

防抖升級(jí)版

第一次觸發(fā)和最后一次延遲觸發(fā)

代碼:

    function throttle(fn, delay) {  // fn為執(zhí)行的函數(shù),delay為延遲時(shí)間
        let time = null
        let flag=true  //標(biāo)識(shí)是不是第一次觸發(fā)
        return function () {
            clearTimeout(time)
            if (flag) { 
                fn.apply(this, arguments)
                flag=false
            }
            time = setTimeout(() => {  //觸發(fā)定時(shí)器
                fn.apply(this, arguments)
                flag=true
            }, delay)
        }
    }

效果:

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

節(jié)流與防抖

背景:當(dāng)我們頻繁去請(qǐng)求資源、接口等其他的時(shí)候,就會(huì)造成操作Dom頻繁,接口壓力大等等,性能下降。比如我有時(shí)候會(huì)每次搜索會(huì)猛地敲回車(chē),在網(wǎng)絡(luò)不很好的時(shí)候,點(diǎn)擊下一頁(yè)按鈕的時(shí)候也會(huì)一直點(diǎn),可能網(wǎng)絡(luò)不好也可能服務(wù)器性能低。

為了避免頻繁觸發(fā)同一事件或請(qǐng)求,這時(shí)候就要用到節(jié)流和防抖了。

what?這是啥?當(dāng)我第一次聽(tīng)到這兩個(gè)名字的時(shí)候,心想是指節(jié)省流量、防止手抖嗎。百思不得其解,趕緊就去學(xué)習(xí)。

概念:

簡(jiǎn)單來(lái)說(shuō):節(jié)流和防抖就是為了防止事件在短時(shí)間內(nèi)多次觸發(fā)的兩種解決方案。都是用過(guò)減少請(qǐng)求的次數(shù),來(lái)降低壓力,提高性能。

區(qū)別

節(jié)流:在一定的時(shí)間內(nèi)只會(huì)請(qǐng)求一次。

可以理解為:公交車(chē),每個(gè)人是一次點(diǎn)擊請(qǐng)求,每十分鐘開(kāi)一趟車(chē),發(fā)送請(qǐng)求

防抖:觸發(fā)事件后n秒后才能執(zhí)行函數(shù),如果在n秒內(nèi)觸發(fā)了事件,則會(huì)重新計(jì)算執(zhí)行時(shí)間。

比如在一段時(shí)間內(nèi),我一直點(diǎn)擊按鈕,以最后一次點(diǎn)擊為準(zhǔn)發(fā)送一次請(qǐng)求。

節(jié)流實(shí)現(xiàn)

解決思路 :

使用時(shí)間戳(發(fā)生在一段時(shí)間的開(kāi)始),就是在計(jì)算

當(dāng)前點(diǎn)擊的時(shí)間 - 上一次執(zhí)行函數(shù)的時(shí)間 > 我設(shè)定的時(shí)間戳 ,就執(zhí)行一次函數(shù)

缺點(diǎn):第一次直接觸發(fā) 最后一次一段時(shí)間內(nèi)無(wú)法觸發(fā)

給一個(gè)場(chǎng)景,當(dāng)我們搜索數(shù)據(jù)的時(shí)候,發(fā)起請(qǐng)求,沒(méi)有做處理是這樣的,請(qǐng)求肯定太過(guò)于頻繁

在這里插入圖片描述

節(jié)流函數(shù)

代碼:

<body>
    <div>
        <span>節(jié)流處理</span><input id="input" type="text">
        <button id="btn">請(qǐng)求</button>
    </div>
</body>
<script>
    var btn = document.getElementById("btn")
    btn.addEventListener("click", throttle(output, 1000))  //添加點(diǎn)擊事件監(jiān)聽(tīng)
    function output(e) {
        console.log(this, e)
        console.log(document.getElementById("input").value)  //模擬發(fā)起一次請(qǐng)求
    }
//節(jié)流函數(shù)
    function throttle(fn, delay) {  // fn為執(zhí)行的函數(shù),delay為延遲時(shí)間
        var last = 0;  //上一次結(jié)束的時(shí)間
        return function () {
            var cur = Date.now()
            console.log(cur-last)
            if (cur - last > delay) {
                fn.apply(this, arguments)  //執(zhí)行函數(shù)
                last = cur //更新上一次時(shí)間
            }
        }
    }
</script>

效果:

在這里插入圖片描述

防抖實(shí)現(xiàn)

解決思路 :

定時(shí)器(發(fā)生在定時(shí)結(jié)束)。缺點(diǎn):第一次不觸發(fā) 最后一次延遲觸發(fā)

就是設(shè)置一個(gè)定時(shí)器,如果一直點(diǎn)擊則清除定時(shí)器,最后一次開(kāi)啟定時(shí)器

防抖函數(shù)

代碼:

<body>
    <div>
        <span>防抖處理</span><input id="input" type="text">
        <button id="btn">請(qǐng)求</button>
    </div>
</body>
<script>
    var btn = document.getElementById("btn")
    btn.addEventListener("click", debounce(output, 1000))  //添加點(diǎn)擊事件監(jiān)聽(tīng)
    function output(e) {
        console.log(this, e)
        console.log(document.getElementById("input").value)  //模擬發(fā)起一次請(qǐng)求
    }
    function debounce(fn, delay) {  // fn為執(zhí)行的函數(shù),delay為延遲時(shí)間
        var time = null;  //定時(shí)器
        return function () {
            clearTimeout(time);  //清除定時(shí)器
            let context = this;  //獲取當(dāng)前button上下文 如果不指定,箭頭函數(shù)就會(huì)一直往外找到window
            let args = arguments;
            time = setTimeout(() => {
                fn.apply(context, args);
            }, delay);
        }
    }
</script>

效果:

在這里插入圖片描述

防抖升級(jí)版

第一次觸發(fā)和最后一次延遲觸發(fā)

代碼:

    function throttle(fn, delay) {  // fn為執(zhí)行的函數(shù),delay為延遲時(shí)間
        let time = null
        let flag=true  //標(biāo)識(shí)是不是第一次觸發(fā)
        return function () {
            clearTimeout(time)
            if (flag) { 
                fn.apply(this, arguments)
                flag=false
            }
            time = setTimeout(() => {  //觸發(fā)定時(shí)器
                fn.apply(this, arguments)
                flag=true
            }, delay)
        }
    }

效果:

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 原生JS實(shí)現(xiàn)幾個(gè)常用DOM操作API實(shí)例

    原生JS實(shí)現(xiàn)幾個(gè)常用DOM操作API實(shí)例

    下面小編就為大家?guī)?lái)一篇原生JS實(shí)現(xiàn)幾個(gè)常用DOM操作API實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • JavaScript中判斷變量是數(shù)組、函數(shù)或是對(duì)象類(lèi)型的方法

    JavaScript中判斷變量是數(shù)組、函數(shù)或是對(duì)象類(lèi)型的方法

    這篇文章主要介紹了JavaScript中判斷變量是數(shù)組、函數(shù)或是對(duì)象類(lèi)型的方法,需要的朋友可以參考下
    2015-02-02
  • js自己實(shí)現(xiàn)一個(gè)大文件切片上傳+斷點(diǎn)續(xù)傳的示例代碼

    js自己實(shí)現(xiàn)一個(gè)大文件切片上傳+斷點(diǎn)續(xù)傳的示例代碼

    本文主要介紹了js自己實(shí)現(xiàn)一個(gè)大文件切片上傳+斷點(diǎn)續(xù)傳的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • javascript函數(shù)的call、apply和bind的原理及作用詳解

    javascript函數(shù)的call、apply和bind的原理及作用詳解

    javascript函數(shù)的call、apply和bind?本質(zhì)是用來(lái)實(shí)現(xiàn)繼承的,專(zhuān)業(yè)點(diǎn)說(shuō)法就是改變函數(shù)體內(nèi)部this的指向,當(dāng)一個(gè)對(duì)象沒(méi)有某個(gè)功能時(shí),就可以用這3個(gè)來(lái)從有相關(guān)功能的對(duì)象里借用過(guò)來(lái),文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • JavaScript彈出對(duì)話框的三種方式

    JavaScript彈出對(duì)話框的三種方式

    本文主要介紹了javascript中的三種彈出對(duì)話框,分別是alert()方法,confirm()方法,prompt()方法,對(duì)javascript彈出對(duì)話框相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • 淺談Sublime Text 3運(yùn)行JavaScript控制臺(tái)

    淺談Sublime Text 3運(yùn)行JavaScript控制臺(tái)

    下面小編就為大家?guī)?lái)一篇淺談Sublime Text 3運(yùn)行JavaScript控制臺(tái)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • js設(shè)置function參數(shù)默認(rèn)值(適合沒(méi)有傳參情況)

    js設(shè)置function參數(shù)默認(rèn)值(適合沒(méi)有傳參情況)

    div+css模擬js信息框的類(lèi)庫(kù)時(shí)遇到一個(gè)問(wèn)題當(dāng)沒(méi)有傳遞參數(shù)過(guò)去時(shí)自動(dòng)使用提示信息作為窗口標(biāo)題,具體的實(shí)現(xiàn)如下
    2014-02-02
  • 我也種棵OO樹(shù)JXTree[js+css+xml]

    我也種棵OO樹(shù)JXTree[js+css+xml]

    我也種棵OO樹(shù)JXTree[js+css+xml]...
    2007-04-04
  • 第二篇Bootstrap起步

    第二篇Bootstrap起步

    這篇文章主要介紹了第二篇Bootstrap起步的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • js原生方法被覆蓋,從新賦值原生的方法

    js原生方法被覆蓋,從新賦值原生的方法

    下面小編就為大家分享一篇js原生方法被覆蓋,從新賦值原生的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論