国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

防抖和節(jié)流及多種實現(xiàn)方式

這篇具有很好參考價值的文章主要介紹了防抖和節(jié)流及多種實現(xiàn)方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

當(dāng)用戶在網(wǎng)頁中進(jìn)行操作時,如點擊、滾動、輸入等,往往會頻繁地觸發(fā)事件。如果每個事件都立即執(zhí)行相應(yīng)的函數(shù),可能會導(dǎo)致性能問題和用戶體驗不佳,因為這些函數(shù)可能需要執(zhí)行復(fù)雜的操作,如計算、網(wǎng)絡(luò)請求等。

為了優(yōu)化這種情況,我們可以使用防抖和節(jié)流來限制函數(shù)的調(diào)用次數(shù),從而提高性能和用戶體驗。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-423492.html


防抖

防抖是指在一定的時間間隔內(nèi),將多次觸發(fā)的事件合并成一次執(zhí)行。

防抖的實現(xiàn)思路是:每次事件被觸發(fā)時,設(shè)置一個計時器,在指定的時間間隔內(nèi),如果該事件被再次觸發(fā),則清除計時器并重新開始計時,直到指定的時間間隔內(nèi)沒有事件觸發(fā)為止,然后調(diào)用函數(shù)。

?

防抖可以用于處理一些頻繁觸發(fā)的事件,如窗口大小改變、輸入框輸入等。以下是一個簡單的防抖函數(shù)實現(xiàn):

function debounce(fn, delay) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  };
}

?

這個函數(shù)接收兩個參數(shù): fn 是要防抖的函數(shù), delay 是防抖時間間隔。返回一個新的函數(shù),在防抖時間間隔內(nèi),重復(fù)調(diào)用這個新函數(shù)不會立即觸發(fā)原函數(shù),只有等時間間隔過去之后才會觸發(fā)。

?



節(jié)流

節(jié)流是指在一定的時間間隔內(nèi),函數(shù)只被調(diào)用一次。如果在這個時間間隔內(nèi)觸發(fā)了多次事件,只有第一次會調(diào)用函數(shù),其余的會被忽略。

節(jié)流的實現(xiàn)思路是:每次事件被觸發(fā)時,如果函數(shù)沒有在指定的時間間隔內(nèi)被調(diào)用過,則調(diào)用函數(shù)并設(shè)置一個計時器,在指定的時間間隔內(nèi)不再觸發(fā)事件。如果在指定的時間間隔內(nèi)再次觸發(fā)了事件,則不調(diào)用函數(shù),直到指定的時間間隔過去,重新開始調(diào)用函數(shù)。

?

節(jié)流可以用于處理一些頻繁觸發(fā)的事件,如頁面滾動、鼠標(biāo)移動等。以下是一個簡單的節(jié)流函數(shù)實現(xiàn):

function throttle(fn, delay) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
        timer = null;
      }, delay);
    }
  };
}

這個函數(shù)接收兩個參數(shù): fn 是要節(jié)流的函數(shù), delay 是節(jié)流時間間隔。返回一個新的函數(shù),在指定的時間間隔內(nèi),只能調(diào)用一次原函數(shù)。

?

?

防抖和節(jié)流的實現(xiàn)方式可以有多種,具體實現(xiàn)應(yīng)該根據(jù)實際場景進(jìn)行調(diào)整。下面介紹一些常見的實現(xiàn)方式。

?


立即執(zhí)行版和非立即執(zhí)行版

防抖和節(jié)流的實現(xiàn)中,可以根據(jù)需求選擇立即執(zhí)行版或非立即執(zhí)行版。

立即執(zhí)行版是指在每次觸發(fā)事件時,立即執(zhí)行一次函數(shù),然后在指定的時間間隔內(nèi)不再執(zhí)行。這種方式適合處理一些需要立即響應(yīng)的事件,如按鈕點擊等。

?

以下是立即執(zhí)行版的防抖函數(shù)實現(xiàn):

function debounce(fn, delay, immediate) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (immediate && !timer) {
      fn.apply(context, args);
    }
    clearTimeout(timer);
    timer = setTimeout(function() {
      if (!immediate) {
        fn.apply(context, args);
      }
      timer = null;
    }, delay);
  };
}

?

這個函數(shù)增加了一個參數(shù) immediate ,用來指定是否立即執(zhí)行函數(shù)。如果設(shè)置為 true ,則在觸發(fā)事件時立即執(zhí)行函數(shù);否則等待指定的時間間隔后再執(zhí)行。

?

?

非立即執(zhí)行版是指在事件停止觸發(fā)指定時間后才執(zhí)行一次函數(shù)。這種方式適合處理一些連續(xù)觸發(fā)的事件,如輸入框輸入等。

以下是非立即執(zhí)行版的防抖函數(shù)實現(xiàn):

function debounce(fn, delay, immediate) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (timer) {
      clearTimeout(timer);
    }
    if (immediate && !timer) {
      fn.apply(context, args);
    }
    timer = setTimeout(function() {
      if (!immediate) {
        fn.apply(context, args);
      }
      timer = null;
    }, delay);
  };
}

這個函數(shù)與立即執(zhí)行版的實現(xiàn)相似,區(qū)別在于多了一個 if (timer) { clearTimeout(timer); } 判斷。如果計時器已經(jīng)存在,則在重新設(shè)置計時器之前先清除之前的計時器。

?


時間戳版和定時器版

防抖和節(jié)流的實現(xiàn)中,可以根據(jù)需求選擇時間戳版或定時器版。

時間戳版是指在事件觸發(fā)后,記錄下當(dāng)前的時間戳,并在下次事件觸發(fā)時再次記錄時間戳。在指定的時間間隔內(nèi),如果事件再次觸發(fā),則更新時間戳。如果時間戳與當(dāng)前時間的差值超過了指定的時間間隔,則執(zhí)行函數(shù)。這種方式適合處理一些需要立即響應(yīng)的事件,如按鈕點擊等。

?

以下是時間戳版的節(jié)流函數(shù)實現(xiàn):

function throttle(fn, delay) {
  let last = 0;
  return function() {
    const context = this;
    const args = arguments;
    const now = +new Date();
    if (now - last > delay) {
      fn.apply(context, args);
      last = now;
    }
  };

這個函數(shù)中, last 記錄上次執(zhí)行函數(shù)的時間戳,每次事件觸發(fā)時,計算當(dāng)前時間戳與上次執(zhí)行函數(shù)的時間戳的差值,如果超過指定的時間間隔,則執(zhí)行函數(shù)并更新 last 。

?

?


定時器版是指在事件觸發(fā)后,設(shè)置一個定時器,在指定的時間間隔內(nèi)不再觸發(fā)事件。如果在指定的時間間隔內(nèi)再次觸發(fā)了事件,則不執(zhí)行函數(shù),直到定時器到期后再次執(zhí)行函數(shù)。這種方式適合處理一些連續(xù)觸發(fā)的事件,如頁面滾動、鼠標(biāo)移動等。

?

以下是定時器版的節(jié)流函數(shù)實現(xiàn):

function throttle(fn, delay) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
        timer = null;
      }, delay);
    }
  };
}

這個函數(shù)與之前介紹的非立即執(zhí)行版的防抖函數(shù)實現(xiàn)類似,區(qū)別在于將 setTimeout 的時間間隔設(shè)置為指定的時間間隔,而不是事件觸發(fā)后的延遲時間。


防抖和節(jié)流的主要區(qū)別在于它們限制函數(shù)調(diào)用的方式不同。防抖是指在指定的時間間隔內(nèi)將多次觸發(fā)的事件合并成一次執(zhí)行,而節(jié)流是指在指定的時間間隔內(nèi),函數(shù)只被調(diào)用一次。同時,防抖和節(jié)流也有一些缺點,比如可能會導(dǎo)致事件響應(yīng)延遲或事件被忽略等問題。因此,在實際使用中,需要根據(jù)場景進(jìn)行權(quán)衡和選擇。

?

到了這里,關(guān)于防抖和節(jié)流及多種實現(xiàn)方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • axios、跨域與JSONP、防抖和節(jié)流

    axios、跨域與JSONP、防抖和節(jié)流

    Axios 是專注于 網(wǎng)絡(luò)數(shù)據(jù)請求 的庫。 相比于原生的 XMLHttpRequest 對象,axios 簡單易用 。 相比于 jQuery,axios 更加 輕量化 ,只專注于網(wǎng)絡(luò)數(shù)據(jù)請求。 axios.get(\\\'url\\\', { params: { /*參數(shù)*/ } }).then(callback) 例如: axios.post(\\\'url\\\', { /*參數(shù)*/ }).then(callback) 例如: 例如: 如果兩個頁面的 協(xié)議

    2024年02月08日
    瀏覽(20)
  • 防抖和節(jié)流 含義及區(qū)別圖文詳解秒懂

    防抖和節(jié)流 含義及區(qū)別圖文詳解秒懂

    防抖和節(jié)流都是為解決短時間內(nèi)頻繁觸發(fā)某個功能函數(shù)而導(dǎo)致的性能問題。比如,觸發(fā)頻率過高而導(dǎo)致響應(yīng)速度跟不上,以致出現(xiàn)延遲,假死或卡頓的現(xiàn)象。? 圖解:一件事情,計劃5s以后觸發(fā),結(jié)果中途意外觸發(fā)了,那么就重新從0開始5秒的計時,這就導(dǎo)致本身計劃的事情就

    2024年02月06日
    瀏覽(19)
  • 【js】防抖和節(jié)流的使用場景和區(qū)別:

    【js】防抖和節(jié)流的使用場景和區(qū)別:

    一、防抖 (多次觸發(fā) 只執(zhí)行最后一次) 作用: 高頻率觸發(fā)的事件,在指定的單位時間內(nèi),只響應(yīng)最后一次,如果在指定的時間內(nèi)再次觸發(fā),則重新計算時間 防抖類似于英雄聯(lián)盟回城6秒,如果回城中被打斷,再次回城需要再等6秒 二、節(jié)流 (規(guī)定時間內(nèi) 只觸發(fā)一次) 作用:

    2024年02月10日
    瀏覽(22)
  • 了解同源策略 JSONP 案例-淘寶搜索 防抖和節(jié)流

    什么是跨域 同源指的是兩個 URL 的協(xié)議、域名、端口一致,反之,則是跨域。 出現(xiàn)跨域的根本原因:瀏覽器的同源策略不允許非同源的 URL 之間進(jìn)行資源的交互。 網(wǎng)頁:http://www.test.com/index.html 接口:http://www.api.com/userlist 瀏覽器對跨域請求的攔截 注意:瀏覽器允許發(fā)起跨域請

    2024年02月05日
    瀏覽(30)
  • JS手寫防抖和節(jié)流函數(shù)(超詳細(xì)版整理)

    JS手寫防抖和節(jié)流函數(shù)(超詳細(xì)版整理)

    防抖(debounce) :每次觸發(fā)定時器后,取消上一個定時器,然后重新觸發(fā)定時器。防抖 一般用于用戶未知行為的優(yōu)化 ,比如搜索框輸入彈窗提示,因為用戶接下來要輸入的內(nèi)容都是未知的,所以每次用戶輸入就彈窗是沒有意義的,需要等到用戶輸入完畢后再進(jìn)行彈窗提示。

    2024年02月04日
    瀏覽(20)
  • 了解防抖和節(jié)流:提升前端交互體驗的實用策略

    本文將重點介紹前端性能優(yōu)化方法之一的防抖和節(jié)流。首先解釋了它們的概念和原理,然后探討了它們在前端開發(fā)中的應(yīng)用場景,如輸入框搜索、滾動事件等。最后,通過簡單的代碼示例展示了如何實現(xiàn)防抖和節(jié)流函數(shù)。通過學(xué)習(xí)和應(yīng)用這兩種技術(shù),我們可以有效地減少不必

    2024年02月05日
    瀏覽(22)
  • 前端性能優(yōu)化的利器 ——— 淺談JavaScript中的防抖和節(jié)流

    防抖和節(jié)流函數(shù)是工作中兩種常用的前端性能優(yōu)化函數(shù),今天我就來總結(jié)一下什么是防抖和節(jié)流,并詳細(xì)說明一下如何在工作中應(yīng)用防抖和節(jié)流函數(shù) 在 JavaScript 中,防抖(debounce)和節(jié)流(throttle)是用來限制函數(shù)執(zhí)行頻率的兩種常見技術(shù)。 防抖(debounce) 是指在某個時間段

    2024年02月14日
    瀏覽(30)
  • Vue 3 中的極致防抖/節(jié)流(含常見方式防抖/節(jié)流)

    Vue 3 中的極致防抖/節(jié)流(含常見方式防抖/節(jié)流)

    各位朋友你們好呀。今天是立春,明天就是正月十五元宵節(jié)了,這種立春 + 元宵相隔的時候,可是很難遇到的,百年中就只有幾次。在這提前祝大家元宵快樂。 今天給大家?guī)淼氖?Vue 3 中的極致防抖/節(jié)流(含常見方式防抖/節(jié)流) 這篇文章,文章中不僅會講述原來使用的防

    2024年02月01日
    瀏覽(17)
  • uni-app 實現(xiàn)節(jié)流與防抖

    提示:這次要講的前端關(guān)于節(jié)流和防抖 防抖是指在頻繁觸發(fā)某一個事件時,一段時間內(nèi)或者一定條件下不再觸發(fā)該事件對應(yīng)調(diào)用的函數(shù)。 代碼如下(示例): 對按鈕點擊觸發(fā)函數(shù)的防抖控制?:?按鈕事件執(zhí)行未完成時不多次重復(fù)執(zhí)行對應(yīng)按鈕的業(yè)務(wù)邏輯。 在事件持續(xù)觸發(fā)的

    2024年02月11日
    瀏覽(21)
  • js實現(xiàn)防抖(debounce)與節(jié)流(throttle)

    一句話概括:防抖是給定一個時間周期,如果觸發(fā)事件的周期小于該時間(也就是觸發(fā)過快),則不會觸發(fā)事件。 舉個例子:我給定的時間周期是1s,如果我在觸發(fā)第一次事件后1s內(nèi)觸發(fā)該事件,則重新開始計時,直到觸發(fā)周期大于1s才會執(zhí)行事件的方法。 一句話概括:節(jié)流

    2023年04月23日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包