手ぶれ・節流を防ぎます

13842 ワード

振れを防ぐ
原理:イベントが発生してからn秒後に実行します.もし一つのイベントがトリガされたn秒以内にまたこのイベントが発生したら、新しいイベントの時間を基準にして、n秒後に実行します.
イベントが停止してから実行しないようにしたいです.直ちに関数を実行して、停止トリガn秒後に実行を再起動できます.
function debounce(func, wait, immediate) {
     

    var timeout, result;

    var debounced = function () {
     
        var context = this;
        var args = arguments;

        if (timeout) clearTimeout(timeout);
        if (immediate) {
     
            //        ,    
            var callNow = !timeout;
            timeout = setTimeout(function(){
     
                timeout = null;
            }, wait)
            if (callNow) result = func.apply(context, args) //  this   event  
        }
        else {
     
            timeout = setTimeout(function(){
     
                func.apply(context, args)
            }, wait);
        }
        return result;
    };

	//     
    debounced.cancel = function() {
     
        clearTimeout(timeout);
        timeout = null;
    };

    return debounced;
}

//  
window.onresize = debounce(XXXfunction, 10000, true);
流れをよくする
イベントを継続的にトリガし、一定期間ごとにイベントのみを実行します.最初の実行の有無と終了後の実行の有無に分けることができます.
optionsパラメータ:
  • eading:falseは、第1回実行禁止
  • を表しています.
  • triling:falseは停止トリガを無効にするコールバック
  • を表しています.
    function throttle(func, wait, options) {
         
        var timeout, context, args, result;
        var previous = 0;
        if (!options) options = {
         };
    
        var later = function() {
         
            previous = options.leading === false ? 0 : new Date().getTime();
            timeout = null;
            func.apply(context, args);
            if (!timeout) context = args = null;
        };
    
        var throttled = function() {
         
            var now = new Date().getTime();
            if (!previous && options.leading === false) previous = now;
            var remaining = wait - (now - previous);
            context = this;
            args = arguments;
            if (remaining <= 0 || remaining > wait) {
         
                if (timeout) {
         
                    clearTimeout(timeout);
                    timeout = null;
                }
                previous = now;
                func.apply(context, args);
                if (!timeout) context = args = null;
            } else if (!timeout && options.trailing !== false) {
         
                timeout = setTimeout(later, remaining);
            }
        };
    	throttled.cancel = function() {
         
    	    clearTimeout(timeout);
    	    previous = 0;
    	    timeout = null;
    	}
        return throttled;
    }