修复ie8&chrome下window的resize事件多次执行

复制代码 代码如下:

  /**

  * window.onresize 事件 专用事件绑定器 v0.1 Alucelx

  * http://www.cnblogs.com/Alucelx/archive/2011/10/20/2219263.html

  * <description>

  * 用于解决 lte ie8 & chrome 及其他可能会出现的 原生 window.resize 事件多次执行的 BUG.

  * </description>

  * <methods>

  * add: 添加事件句柄

  * remove: 删除事件句柄

  * </methods>

  */

  var onWindowResize = function(){

  //事件队列

  var queue = [],

  indexOf = Array.prototype.indexOf || function(){

  var i = 0, length = this.length;

  for( ; i < length; i++ ){

  if(this[i] === arguments[0]){

  return i;

  }

  }

  return -1;

  };

  var isResizing = {}, //标记可视区域尺寸状态, 用于消除 lte ie8 / chrome 中 window.onresize 事件多次执行的 bug

  lazy = true, //懒执行标记

  listener = function(e){ //事件监听器

  var h = window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || document.body.clientHeight,

  w = window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || document.body.clientWidth;

  if( h === isResizing.h && w === isResizing.w){

  return;

  }else{

  e = e || window.event;

  var i = 0, len = queue.length;

  for( ; i < len; i++){

  queue[i].call(this, e);

  }

  isResizing.h = h,

  isResizing.w = w;

  }

  }

  return {

  add: function(fn){

  if(typeof fn === 'function'){

  if(lazy){ //懒执行

  if(window.addEventListener){

  window.addEventListener('resize', listener, false);

  }else{

  window.attachEvent('onresize', listener);

  }

  lazy = false;

  }

  queue.push(fn);

  }else{ }

  return this;

  },

  remove: function(fn){

  if(typeof fn === 'undefined'){

  queue = [];

  }else if(typeof fn === 'function'){

  var i = indexOf.call(queue, fn);

  if(i > -1){

  queue.splice(i, 1);

  }

  }

  return this;

  }

  };

  }.call(this);

  绑定window 的 resize 事件,请使用这个对象

  示例:

  

复制代码 代码如下:

  var _fn = function(){document.body.innerHTML += "1"};

  onWindowResize.add(_fn)

  .add(function(){document.body.innerHTML += "2"})

  .add(function(){document.body.innerHTML += "3"})

  .remove(_fn);