存档

文章标签 ‘util’

代码分享之js事件处理

2010年8月7日 effect 1 条评论

此方法提供跨浏览器的事件操作。
提供的API有addEvent、removeEvent、getEvent等。具体的见代码:

var util=util || {};
util.Event = (function(){
	var sUserAgent = navigator.userAgent;
	var fAppVersion = parseFloat(navigator.appVersion);
	var isOpera = sUserAgent.indexOf("Opera") > -1;
	var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;
	var isIE = sUserAgent.indexOf("compatible") > -1
           && sUserAgent.indexOf("MSIE") > -1
           && !isOpera;
	var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
 
	return {
		//获得事件对象,比如util.Event.addEvent(dom,'click',function(){var e=util.Event.getEvent();})
		getEvent: function(){
			if (window.event) {
				return util.Event.formatEvent(window.event);
			} else {
				return util.Event.getEvent.caller.arguments[0];//调用此方法的函数的第一个参数
			}
		},
		//获得时间的target,也就是事件的发生地,返回dom对象
		getTarget: function(e) {
			return e.target || e.srcElement;
		},
		//阻止冒泡,比如一个div里面嵌套了一个a,这两个标签都绑定了click事件,如果你想点击a标签的时候并不想执行div上面的click时间。可以用这个方法阻止
		stopPropagation: function(e) {
			if (e.stopPropagation) {
			  e.stopPropagation();
			}
			else {
			  e.cancelBubble = true;
			}
		},
		//阻止默认行为,比如一个a标签绑定一个click事件,如果你想阻止执行此事件之后并不做跳转,可以用这个方法
		preventDefault: function(e) {
			if (e.preventDefault) {
			  e.preventDefault();
			}
			else {
			  e.returnValue = false;
			}
		},
		//阻止冒泡或者捕捉和阻止默认行为
		stopEvent: function(e) {
			this.stopPropagation(e);
			this.preventDefault(e);
		},
		//增加一个事件 util.Event.addEvent(window,'load',function(){})
		addEvent:function (oTarget, sEventType, fnHandler) {
			if (oTarget.addEventListener) {
				oTarget.addEventListener(sEventType, fnHandler, false);
			} else if (oTarget.attachEvent) {
				oTarget.attachEvent("on" + sEventType, fnHandler);
			} else {
				oTarget["on" + sEventType] = fnHandler;
			}
		},
		//取消莫事件的绑定的某个函数
		removeEvent:function (oTarget, sEventType, fnHandler) {
			if (oTarget.removeEventListener) {
				oTarget.removeEventListener(sEventType, fnHandler, false);
			} else if (oTarget.detachEvent) {
				oTarget.detachEvent("on" + sEventType, fnHandler);
			} else {
				oTarget["on" + sEventType] = null;
			}
		},
		//格式化事件对象
		formatEvent:function (oEvent) {
			if (isIE && isWin) {
				oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
				oEvent.eventPhase = 2;
				oEvent.isChar = (oEvent.charCode > 0);
				oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
				oEvent.pageY = oEvent.clientY + document.body.scrollTop;
				oEvent.preventDefault = function () {
					this.returnValue = false;
				};
 
				if (oEvent.type == "mouseout") {
					oEvent.relatedTarget = oEvent.toElement;
				} else if (oEvent.type == "mouseover") {
					oEvent.relatedTarget = oEvent.fromElement;
				}
 
				oEvent.stopPropagation = function () {
					this.cancelBubble = true;
				};
 
				oEvent.target = oEvent.srcElement;
				oEvent.time = (new Date).getTime();
			}
			return oEvent;
		}
	};
})();
分类: javascript 标签: ,