函数防抖

Published on
发布于·预估阅读2分钟
    Authors
    • Name
      willson-wang
      Twitter

    函数防抖应用于频繁触发的事件,防止浏览器崩溃,常见的应用事件有window对象的resize事件,scroll事件,还有就是mousedown,mousemove,keyup,keydown等事件

    <div class="box"></div>
    
    var box = document.getElementsByClassName("box")[0];
    var WAIT_TIME = 500;
    
    //第一种方式  就是当move事件停止之后500ms触发
    var debounce1 = function (func, time){
    	var timeout;
    	return function (){
    		var _this = this,
    			args = arguments;
    		clearTimeout(timeout);
    		timeout = setTimeout(function (){
    			func.apply(_this, args);
    		},time);
    	}
    }
    
    var getUserAction = function (){
    	console.log(this);
    	console.log(arguments);
    }
    
    //			box.onmousemove = debounce1(getUserAction, WAIT_TIME);
    
    //第二种方式、当move事件开始的时候就触发,然后等到move事件停止后在执行一次
    var debounce2 = function (func, time, immediate){
    	var timeout;
    	return function (){
    		var _this = this,
    			args = arguments;
    		if(timeout) clearTimeout(timeout);
    	
    		if(immediate){
    			var callNow = !timeout;
    			timeout = setTimeout(function (){
    				timeout = null;
    				func.apply(_this, args); //move停止之后执行
    			},time);
    			if(callNow) func.apply(_this, args); //第一次执行
    		}else {
    			timeout = setTimeout(function (){
    				func.apply(_this, args);
    			},time);
    		}
    		
    	}
    }
    
    box.onmousemove = debounce2(getUserAction, WAIT_TIME, true);