最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

節(jié)流與防抖

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

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

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

概念:

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

區(qū)別

節(jié)流:在一定的時間內(nèi)只會請求一次。

可以理解為:公交車,每個人是一次點擊請求,每十分鐘開一趟車,發(fā)送請求

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

比如在一段時間內(nèi),我一直點擊按鈕,以最后一次點擊為準發(fā)送一次請求。

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

解決思路 :

使用時間戳(發(fā)生在一段時間的開始),就是在計算

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

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

給一個場景,當我們搜索數(shù)據(jù)的時候,發(fā)起請求,沒有做處理是這樣的,請求肯定太過于頻繁

在這里插入圖片描述

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

代碼:

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

效果:

在這里插入圖片描述

防抖實現(xiàn)

解決思路 :

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

就是設置一個定時器,如果一直點擊則清除定時器,最后一次開啟定時器

防抖函數(shù)

代碼:

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

效果:

在這里插入圖片描述

防抖升級版

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

代碼:

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

效果:

在這里插入圖片描述

總結(jié)

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

節(jié)流與防抖

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

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

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

概念:

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

區(qū)別

節(jié)流:在一定的時間內(nèi)只會請求一次。

可以理解為:公交車,每個人是一次點擊請求,每十分鐘開一趟車,發(fā)送請求

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

比如在一段時間內(nèi),我一直點擊按鈕,以最后一次點擊為準發(fā)送一次請求。

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

解決思路 :

使用時間戳(發(fā)生在一段時間的開始),就是在計算

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

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

給一個場景,當我們搜索數(shù)據(jù)的時候,發(fā)起請求,沒有做處理是這樣的,請求肯定太過于頻繁

在這里插入圖片描述

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

代碼:

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

效果:

在這里插入圖片描述

防抖實現(xiàn)

解決思路 :

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

就是設置一個定時器,如果一直點擊則清除定時器,最后一次開啟定時器

防抖函數(shù)

代碼:

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

效果:

在這里插入圖片描述

防抖升級版

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

代碼:

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

效果:

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • javascript + jquery實現(xiàn)定時修改文章標題

    javascript + jquery實現(xiàn)定時修改文章標題

    用javascript+jquery寫的一個定時器,定時修改文章標題,需要的朋友可以參考下
    2014-03-03
  • JSONP解決同源策略限制引起跨域問題原理

    JSONP解決同源策略限制引起跨域問題原理

    這篇文章主要為大家介紹了JSONP解決同源策略限制引起跨域問題原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • javascript實現(xiàn)京東登錄顯示隱藏密碼

    javascript實現(xiàn)京東登錄顯示隱藏密碼

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)京東登錄顯示隱藏密碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • js獲取元素的外鏈樣式的簡單實現(xiàn)方法

    js獲取元素的外鏈樣式的簡單實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s獲取元素的外鏈樣式的簡單實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • JS 實現(xiàn)banner圖片輪播效果(鼠標事件)

    JS 實現(xiàn)banner圖片輪播效果(鼠標事件)

    js實現(xiàn)banner圖片輪播效果,通過鼠標點擊左右可切換圖片,具體實現(xiàn)代碼大家參考下本文
    2017-08-08
  • JS設計模式之狀態(tài)模式的用法使用方法

    JS設計模式之狀態(tài)模式的用法使用方法

    JavaScript狀態(tài)模式是一種行為型設計模式,核心是對象在其內(nèi)部狀態(tài)改變時改變其行為,狀態(tài)模式將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同狀態(tài)下可以選擇不同的行為,本文給大家詳細的介紹一下狀態(tài)設計模式在Js中的使用,需要的朋友可以參考下
    2023-08-08
  • js 分欄效果實現(xiàn)代碼

    js 分欄效果實現(xiàn)代碼

    原創(chuàng)JS分欄效果,面向?qū)ο螅?使用簡單。
    2009-08-08
  • JS百度地圖搜索懸浮窗功能

    JS百度地圖搜索懸浮窗功能

    這篇文章主要為大家詳細介紹了JS百度地圖搜索懸浮窗功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • JavaScript使用promise處理多重復請求

    JavaScript使用promise處理多重復請求

    處理重復請求的文章想必大家也看過了很多,大多數(shù)都是分為在response返回之前發(fā)現(xiàn)重復請求就return掉的和使用節(jié)流/防抖來間接規(guī)避用戶頻繁操作兩種版本的。本文主要介紹了JavaScript使用promise處理多重復請求,感興趣的可以了解一下
    2021-05-05
  • 解決javascript 全局變量失效的問題

    解決javascript 全局變量失效的問題

    這篇文章主要介紹了解決javascript 全局變量失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2016-04-04

最新評論

沁水县| 濮阳县| 神池县| 玉溪市| 平利县| 建昌县| 泊头市| 玛沁县| 手机| 新邵县| 乐都县| 南投县| 澜沧| 金乡县| 高青县| 山西省| 开鲁县| 丰台区| 峨山| 霍城县| 合川市| 河北区| 惠水县| 芷江| 岑溪市| 庆云县| 白山市| 类乌齐县| 海门市| 建德市| 芷江| 青川县| 平潭县| 长白| 奉节县| 长寿区| 望江县| 屯留县| 平阴县| 基隆市| 安丘市|