JS防抖

本篇文章參考了以下兩處優秀的鏈接,並以自己更容易理解的方式綜合了兩處的代碼
JavaScript專題之跟着underscore學防抖
JavaScript中的定時控制-Throttle、Debounce、Immediate的基本概念

直接上代碼:

html:無修改

<!DOCTYPE html>
<html lang="zh-cmn-Hans">

<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge, chrome=1">
    <title>debounce</title>
    <style>
        #container{
            width: 100%; height: 200px; line-height: 200px; text-align: center; color: #fff; background-color: #444; font-size: 30px;
        }
    </style>
</head>

<body>
    <div id="container"></div>
    <script src="debounce.js"></script>
</body>

</html>

debounce.js:

"use strict"
var count = 1;
var container = document.getElementById('container');

function getUserAction() {
    container.innerHTML = count++;
};


function debounce(func, wait, immediate) {
  // func: 要debounce的函數
  // wait:等待的事件
  // immediate:是否是immediate,即立即執行後再防抖 
  var timeout; //setTimeout事件ID
  var safe = true; //是否是首次,能否立即執行
  var result; // func返回的結果
  return function() {
    var context = this;
    var args = arguments;
    if (timeout) clearTimeout(timeout);

    if (immediate) { //立即執行
      if (safe) { //首次立即觸發,並關閉可觸發狀態
        result = func.apply(context, args);
        safe = false;
      }
      timeout = setTimeout(function(){
        safe = true; //wait時間後開啓可觸發狀態。若一直抖動,則一直不是可觸發狀態
      }, wait)
    }
    else { //不立即執行
      timeout = setTimeout(function(){
        func.apply(context, args) //wait時間後執行,若一直抖動,則一直不執行
      }, wait);
    }
    return result
  }
}


container.onmousemove = debounce(getUserAction, 1000, false);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章