對防抖和節流的理解及其應用場景

在開發中,咱們經常會去監聽滾動事件或者用戶輸入框驗證事件,若是事件處理沒有頻率限制,就會加劇瀏覽器的負擔,影響用戶的體驗感,瀏覽器

所以,咱們能夠採起防抖(debounce)和節流(throttle)來處理,減小調用事件的頻率,達到較好的用戶體驗。緩存

防抖(debounce):閉包

  在事件被觸發n秒後再執行回調,若是在這n秒內又被觸發,則從新計時,從新出發定時器。
 
  
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .box {
      width: 200px;
      height: 200px;
      overflow: auto;
    }
  </style>
</head>
<body>
  <div class="box" id="container">
    <p>防抖演示</p>
    <p>防抖演示</p>
    <p>防抖演示</p>
    <p>防抖演示</p>
    <p>防抖演示</p>
    <p>防抖演示</p>
    <p>防抖演示</p>
    <p>防抖演示</p>
    <p>防抖演示</p>
  </div>
</body>
 
function debounce(fn, wait) { var timeout = null;// 使用閉包,緩存變量
 return function() {
if(timeout !== null) { console.log('清除定時器啦') clearTimeout(timeout); //清除這個定時器 } timeout = setTimeout(fn, wait); } } // 處理函數 function handle() { console.log(Math.random()); } var container = document.getElementById('container') container.addEventListener('scroll', debounce(handle, 1000));


 

 

 咱們能夠發現,當連續觸發scroll事件,handle函數只會在1秒時間內執行一次,在若是繼續滾動執行,就會清除定時器,從新計時。至關於就是屢次執行,只執行一次。app

 

節流(throttle):dom

  規定在一個單位時間內,只能觸發一次函數。若是這個單位時間內觸發屢次函數,只有一次生效。
 
var throttle = function(func, delay) { var timer = null; // 使用閉包,緩存變量 var prev = Date.now(); // 最開始進入滾動的時間
    return function() { var context = this;   // this指向window
      var args = arguments; var now = Date.now(); var remain = delay - (now - prev); // 剩餘時間
 clearTimeout(timer); // 若是剩餘時間小於0,就馬上執行
      if (remain <= 0) { func.apply(context, args); prev = Date.now(); } else { timer = setTimeout(func, remain); } } } function handle() { console.log(Math.random()); } var container = document.getElementById('container') container.addEventListener('scroll', throttle(handle, 1000));

 

 

在節流函數內部使用開始時間prev、當前時間now和剩餘時間remain,當剩餘時間小於等於0意味着執行處理函數,這樣保證第一次就能當即執行函數而且每隔delay時間執行一次;函數

若是還沒到時間,就會在remaining以後觸發,保證最後一次觸發事件也能執行函數,若是在remaining時間內又觸發了滾動事件,那麼會取消當前的計數器並計算出新的remaing時間。ui

經過時間戳定時器的方法,咱們實現了第一次當即執行,最後一次也執行,規定時間間隔執行的效果。this

 

總結,看完了防抖和節流的分別介紹,咱們來看看他們的區別:spa

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

  防抖是將屢次執行變爲只執行一次,節流是將屢次執行變爲每隔一段時間執行。3d

 

結合應用場景

  防抖(debounce)

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

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

  節流(throttle)

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

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

 

本文轉載多出,爲了讓本身看得明白一點。

相關文章
相關標籤/搜索