JS事件公用类库 摘录

发表于 2016-11-23 16:59:04   |   下载附件   |   字体:
JS事件event
/**
 * 事件公用类库
 * @class
 */
;
HR.event = HR.event || {};
(function($) {
	/**
	 * 绑定事件
	 * @param element 事件对象
	 * @param type 事件类型
	 * @param fn 事件
	 */
	HR.event.attach = function(element, type, fn) {
		if (element.addEventListener) {
			element.addEventListener(type, fn, false);
		} else if (element.attachEvent) {
			element.attachEvent('on' + type, fn);
		}
	};
	/**
	 * 取消事件绑定
	 * @param element 事件对象
	 * @param type 事件类型
	 * @param fn 事件
	 */
	HR.event.detach = function(element, type, fn) {
		if (element.removeEventListener) {
			element.removeEventListener(type, fn, false);
		} else if (element.attachEvent) {
			element.detachEvent('on' + type, fn);
		}
	};
	/**
	 * 同一对象绑定多类型的同一个事件
	 * @param element 事件对象
	 * @param types 多类型,必须用数组
	 * @param fn 事件
	 */
	HR.event.foreachBindFn = function(element, types, fn) {
		if (!types) return;
		if (types.length == 0) return;
		for (var i = 0; i < types.length; i++) {
			HR.event.attach(element, types[i], fn);
		}
	};
	/**
	 * 检测元素是否绑定click事件
	 * @param element 元素对像
	 */
	HR.event.ifBindClick = function(element) {
		var events = $(element).data("events");
		return events && events["click"];
	};
	/**
	 * 同一对象取消绑定多类型的同一个事件
	 * @param element 事件对象
	 * @param types 多类型,必须用数组
	 * @param fn 事件
	 */
	HR.event.foreachUnbindFn = function(element, types, fn) {
		if (!types) return;
		if (types.length == 0) return;
		for (var i = 0; i < types.length; i++) {
			HR.event.detach(element, types[i], fn);
		}
	};
	/**
	 * HR.event.hwinOnload 为onload事件添加绑定
	 * @param fn	需要在onload的时候执行的函数
	 */
	HR.event.hwinOnload = function(fn) {
		//简单检查传入参数
		if (typeof fn == "undefined" || fn.constructor != Function) return;
		//检查onload事件是否已经被定义,并作处理
		var oldOnload = function() {};
		if (window.onload && window.onload.constructor == Function) oldOnload = window.onload;
		window.onload = function() {
			oldOnload();
			fn();
		};
	};
	/**
	 * HR.event.honbeforeunload 为onbeforeunload事件添加绑定
	 * @param str 提示字符串
	 */
	HR.event.honbeforeunload = function(str) {
			window.onbeforeunload = function() {
				return str;
			};
		}
		/**
		 * HR.event.hgetEvent 获取当前事件状态对象
		 * @return Event	
		 */
	HR.event.hgetEvent = function() {
		if (document.all) return window.event;
		func = HR.event.hgetEvent.caller;
		while (func != null) {
			var arg0 = func.arguments[0];
			if (arg0) {
				if ((arg0.constructor == Event || arg0.constructor == MouseEvent) || (typeof(arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {
					return arg0;
				}
			}
			func = func.caller;
		}
		return null;
	};
	/**
	 * 通过当前事件状态对象获取当前触发事件的元素
	 * @return Element
	 */
	HR.event.hgetCurObject = function() {
		var e = HR.event.hgetEvent();
		if (e)
			return e.target || e.srcElement;
		return null;
	};
	/**
	 * doane 阻止JS事件默认行为的发生和冒泡
	 * @param event 事件状态对象
	 * @param preventDefault 阻止默认行为
	 * @param stopPropagation 阻止 冒泡
	 */
	HR.event.hdoane = function(event, preventDefault, stopPropagation) {
		var preventDefault = HR.type.hisUndefined(preventDefault) ? 1 : preventDefault;
		var stopPropagation = HR.type.hisUndefined(stopPropagation) ? 1 : stopPropagation;
		e = event ? event : window.event;
		if (!e) {
			e = HR.event.hgetEvent();
		}
		if (!e) {
			return null;
		}
		if (preventDefault) {
			if (e.preventDefault) {
				e.preventDefault();
			} else {
				e.returnValue = false;
			}
		}
		if (stopPropagation) {
			if (e.stopPropagation) {
				e.stopPropagation();
			} else {
				e.cancelBubble = true;
			}
		}
		return e;
	};
})(jQuery);