js 性能优化收拾之 高频优化

js 性能优化整理之 高频优化

//mousemove 拖拽操作

var count = 0;
elem.onmousemove = function(){
    count++;
    // 当计数器为偶数的时候不执行mousemove
    if( count % 2 === 0 ){
    return;
    }

    // 实现拖拽功能的代码...
};

 

高频事件的简单处理

var throldHold = 200; //两次scroll事件触发之间最小的事件间隔
window.onscroll = function () {
    if (arguments.callee.timer) {
        clearTimeout(arguments.callee.timer);
    }
    arguments.callee.timer = setTimeout(isDivScroll, throldHold);
}
//isDivScroll滚动执行的方法

针对高频事件,我们封装一下

//函数节流(throttle)与函数去抖(debounce)
var throttle = function( fn, timeout ){     
    var timer;
    return function(){
        var self = this,
            args = arguments;
    clearTimeout( timer );
        timer = setTimeout(function(){
            fn.apply( self, args );
        }, timeout );
    };

};

 

//mousewheel 滚轮操作

window.onmousewheel = throttle(function(){
    // 滚轮滚动时的操作代码..
}, 200 );

 

 

//resize  窗口操作  ie每次比其他浏览是多重复触发一次

window.onresize = throttle(function(){  //普通绑定
    // 自适应布局的代码...
}, 200 );


window.addEventListener("resize", throttle(function(){  //监听绑定
		console.log('重置');
},200),false);

 

 

 

参考别的框架的代码  UnderscoreJS 框架

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
  }
 
// 添加resize的回调函数,但是只允许它每300毫秒执行一次
window.addEventListener('resize', debounce(function(event) {
    // 这里写resize过程 
}, 300));