<strike id="cy2gs"><menu id="cy2gs"></menu></strike>
  • <del id="cy2gs"><dfn id="cy2gs"></dfn></del>
  • JavaScript防抖與節(jié)流,深入淺出,一本正經(jīng)講透徹

    2021-9-29    前端達人

    目錄

    一、函數(shù)防抖(debounce)

    1. 什么是防抖?

    二.、函數(shù)節(jié)流

    2.1 定時器實現(xiàn)

    2.2 時間戳實現(xiàn)

    2.3 時間戳+定時器

    最后 


    一、函數(shù)防抖(debounce)

    1. 什么是防抖?

    函數(shù)防抖在頻繁觸發(fā)某一個事件時,一段時間內不再觸發(fā)該事件后才會去調用對應的回調函數(shù),在設定間隔時間內如果下一次事件被觸發(fā), 那么就重新開始定時器,直到事件觸發(fā)結束。

    規(guī)定時間內沒有繼續(xù)觸發(fā)事件的前提下,再去調用事件處理函數(shù);

    具體如下面的例子所示:

    
    
    1. /*定義防抖函數(shù)
    2. * func:傳入一個函數(shù),事件不再持續(xù)觸發(fā)時會調用該函數(shù)
    3. * delay:定義持續(xù)多久后執(zhí)行傳入的回調函數(shù)
    4. * */
    5. function debounce(func,delay) {
    6. let timer = null // 用于保存定時器
    7. return function (...args) {
    8. // 如果定時器存在,清除定時器,隨后重新設置timer
    9. if(timer !== null) clearTimeout(timer)
    10. timer = setTimeout(func, delay) // 超過delay為接收到事件會調用這里的func 必要的額時候可以修改func的this指向 由于timer對外部存在引用,因此不會被銷毀
    11. }
    12. }
    13. /*事件處理函數(shù)*/
    14. function testDeBounce(){
    15. console.log('你看我執(zhí)行了幾次??')
    16. }
    17. // 接收debounce返回的函數(shù)
    18. const temp = debounce(testDeBounce(),1000)
    19. /*綁定事件,測試防抖函數(shù)*/
    20. window.addEventListener('scroll',()=>{
    21. temp()
    22. }); // 這樣寫最少調用一次事件處理函數(shù),最多也不會多余下面的寫法執(zhí)行的次數(shù)
    23. window.addEventListener('scroll', testDeBounce); // 如果這樣寫的話,每當頁面滾動就會調用事件處理函數(shù)
    • 總結一下思路

      1.定義一個節(jié)流函數(shù)

      2.函數(shù)內部使用一個變量保存定時器

      3.返回一個函數(shù),函數(shù)內部定義:如果定時器已經(jīng)存在就清除定時器,重新設置定時器

      4.定義一個變量來接收debounce返回的函數(shù)

      5.在事件的回調函數(shù)中直接調用上一步的變量接收的方法


    二.、函數(shù)節(jié)流

    函數(shù)節(jié)流在事件持續(xù)觸發(fā)的前提下,保證一定時間段內只調用一次事件處理函數(shù),就是函數(shù)節(jié)流;

    函數(shù)節(jié)流實現(xiàn)的方式定時器、時間戳、定時器+時間戳;

    2.1 定時器實現(xiàn)

    思路

    1.定義節(jié)流函數(shù)throttle

    2.定義timer保存定時器

    3.返回一個函數(shù)。函數(shù)內部定義:如果定時器不存在,設置定時器,間隔某一時間后將timer設置為null,如果在這之前事件再次觸發(fā),則定時器中的回調無效

    <button>這是一個孤獨的按鈕</button> 
    
    
    1. /*
    2. * 定義定時器節(jié)流函數(shù)
    3. * func:傳入事件處理函數(shù)
    4. * delay:在delay指定的時間內定時器回調無效
    5. * */
    6. function throttle(func,delay) {
    7. let timer = null
    8. const context = this
    9. return function(...args){
    10. // 如果定時器不存在
    11. if(!timer){
    12. timer = setTimeout(()=>{
    13. func.apply(context,args) // 考慮返回的函數(shù)調用的環(huán)境,因此這里不直接使用this
    14. timer = null // delay之后清除定時器
    15. },delay)
    16. }
    17. }
    18. }
    19. function test() {
    20. console.log('啊啊啊!')
    21. }
    22. const temp = throttle(test,1000)
    23. document.querySelector('button').addEventListener('click',()=>{
    24. temp()
    25. })

    2.2 時間戳實現(xiàn)

    
    
    1. var throttle = function(func, delay) {
    2. var prev = Date.now();
    3. return function() {
    4. var context = this;
    5. var args = arguments;
    6. var now = Date.now();
    7. if (now - prev >= delay) {
    8. func.apply(context, args);
    9. prev = Date.now();
    10. }
    11. }
    12. }
    13. function handle() {
    14. console.log(Math.random());
    15. }
    16. window.addEventListener('scroll', throttle(handle, 1000));

    2.3 時間戳+定時器

    
    
    1. // 節(jié)流throttle代碼(時間戳+定時器):
    2. var throttle = function(func, delay) {
    3. var timer = null;
    4. var startTime = Date.now();
    5. return function() {
    6. var curTime = Date.now();
    7. var remaining = delay - (curTime - startTime);
    8. var context = this;
    9. var args = arguments;
    10. clearTimeout(timer);
    11. if (remaining <= 0) {
    12. func.apply(context, args);
    13. startTime = Date.now();
    14. } else {
    15. timer = setTimeout(func, remaining);
    16. }
    17. }
    18. }
    19. function handle() {
    20. console.log(Math.random());
    21. }
    22. window.addEventListener('scroll', throttle(handle, 1000));

    最后 

    想跟博主交朋友的可以查找,公_號?:前端老實人,跟博主一起探討學習哦?


    藍藍設計建立了UI設計分享群,每天會分享國內外的一些優(yōu)秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯(lián)系。

    分享此文一切功德,皆悉回向給文章原作者及眾讀者.

    轉自:csdn
    免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯(lián)系,我們立即更正或刪除。

    藍藍設計www.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業(yè)提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網(wǎng)站建設 、平面設計服務

    日歷

    鏈接

    個人資料

    藍藍設計的小編 http://www.skdbbs.com

    存檔

    主站蜘蛛池模板: 亚洲国产精品嫩草影院在线观看| 亚洲精品97久久中文字幕无码| 精品久久国产一区二区三区香蕉| 午夜精品久久久久久久久| 成人国产精品日本在线观看 | 亚洲国产精品一区| 久久99国内精品自在现线| 日韩精品电影一区亚洲| 国产成人毛片亚洲精品| 大桥未久在线精品视频在线| 偷拍精品视频一区二区三区| 国产成人亚洲精品91专区手机| 99久久人妻无码精品系列| 亚洲国产精品国自产拍AV| 青青青青久久精品国产h久久精品五福影院1421 | 亚洲AV日韩精品久久久久| 欧美亚洲日本久久精品| Aⅴ精品无码无卡在线观看| 国产成人精品天堂| 国产精品视频白浆免费视频| 日韩精品国产另类专区| 亚洲精品黄色视频在线观看免费资源| 精品福利一区二区三区精品国产第一国产综合精品 | 黄床大片免费30分钟国产精品| 国产精品成| 777久久精品一区二区三区无码| 久久亚洲精品视频| 久久精品国产99国产精偷| 国产精品中文字幕在线观看| 国产精品视频白浆免费视频| 国产精品久久午夜夜伦鲁鲁| 国产精品人人爽人人做我的可爱| 久久99国产综合精品免费| 国产精品污WWW在线观看| 国产精品嫩草影院AV| 99精品无人区乱码在线观看| 99视频精品全部在线观看| 国产在线精品一区二区不卡 | 国产成人精品免费视频大| 九九99精品久久久久久| 一本一道久久精品综合|