js添加多个窗口监听事件

看过一个文章,说js有相对较多的瑕疵,对此,我是比较认同的,就如我将要说的js的窗口监听事件,如窗口改变大小事件需要定义window.resize函数。

但,相当多的情况是:不只在一地方或者一个时刻监听window.resize,此时就需要有多个回调函数,如果再定义window.resize函数就会覆盖之前定义好的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);


定义一个这个的方法,之后使用该方法:

function onResizeEvent() {
	console.log(window.innerWidth, window.innerHeight);
}
onWindowResize.add(onResizeEvent);

完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值