說完防抖,下面我們講講節流,規矩就不說了,先上代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>節流</title> </head> <body> <button id="throttle">點我節流!</button> <script> window.onload = function() { // 1、獲取按鈕,綁定點擊事件 var myThrottle = document.getElementById("throttle"); myThrottle.addEventListener("click", throttle(sayThrottle)); } // 2、節流函數體 function throttle(fn) { // 4、通過閉包保存一個標記 let canRun = true; return function() { // 5、在函數開頭判斷標志是否為 true,不為 true 則中斷函數 if(!canRun) { return; } // 6、將 canRun 設置為 false,防止執行之前再被執行 canRun = false; // 7、定時器 setTimeout( () => { fn.call(this, arguments); // 8、執行完事件(比如調用完接口)之后,重新將這個標志設置為 true canRun = true; }, 1000); }; } // 3、需要節流的事件 function sayThrottle() { console.log("節流成功!"); } </script> </body> </html>
很好,看完代碼的小伙伴應該大致清楚是怎么回事了,下面我們看 GIF 實現:
看完代碼和 GIF 實現,我們可以明白,節流即是:
- 節流:指定時間間隔內只會執行一次任務。
那么,節流在工作中的應用?
- 懶加載要監聽計算滾動條的位置,使用節流按一定時間的頻率獲取。
- 用戶點擊提交按鈕,假設我們知道接口大致的返回時間的情況下,我們使用節流,只允許一定時間內點擊一次。
這樣,在某些特定的工作場景,我們就可以使用防抖與節流來減少不必要的損耗。
那么問題來了,假設面試官聽到你這句話,是不是會接着問一句:“為什么說上面的場景不節制會造成過多損耗呢?”
OK,這就涉及到瀏覽器渲染頁面的機制了……
案例2:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title>
</head>
<body>
<input type="text" name="search">
<script type="text/javascript">
var searchInput = document.querySelector('input[name="search"]');
/*綁定事件*/
searchInput.addEventListener('keyup',throttle(getInputValue),false);
/* 節流函數 */
function throttle(fn){
/*通過閉包保存一個標記*/
let timer = true;
return function(){
/*在函數開頭判斷標志是否為 true,不為 true 則中斷函數*/
if(!timer){
return;
}
/*將 timer 設置為 false,防止執行之前再被執行*/
timer = false;
/* 定時器 */
setTimeout(()=>{
fn.call(this,arguments)
/*執行完事件(比如調用完接口)之后,重新將這個標志設置為 true*/
timer = true;
},1000)
}
}
/* 調用獲取輸入值 */
function getInputValue(){
console.dir(this.value)
}
</script>
</body>
</html>
.
