javasctipt跨浏览器事件处理
/**
- @author 江金汉
- @date 2021/12/17
*/
'use strict';//严格模式
var addEvent,removeEvent;
(function(){
/*
*跨浏览器的事件追加函数
*集中管理事件,有效防止内存泄漏
*/
function addEvent(element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else {
// 附加事件处理函数一个唯一标识符
if (!handler.$$guid) handler.$$guid = addEvent.guid++;
// 为元素每个事件创建一个散列表
if (!element.events) element.events = {};
// 为元素建立某个事件类型对应处理函
//数的散列表
var handlers = element.events[type];
if (!handlers) {
handlers = element.events[type] = {};
// 把默认的事件处理函数作为第一个事
//件处理函数作为第一个事件处理函数
if (element["on" + type]) {
handlers[0] = element["on" + type];
}
}
// 保存当前的事件处理函数
handlers[handler.$$guid] = handler;
// 设置全局事件处理函数为默认事件处
//理函数
element["on" + type] = handleEvent;
}
};
// 唯一标识符发生器
addEvent.guid = 1;
/*
*移除事件处理函数
*/
function removeEvent(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else {
// 从散列表删除事件处理函数
if (element.events && element.events[type]) {
delete element.events[type][handler.$$guid];
}
}
};
/*
*全局事件处理函数,所有的事件处理函数
*均委托其进行处理,this指向当前元素
*/
function handleEvent(event) {
var returnValue = true;
// 包装事件对象,考虑了框架窗体(IE特殊
//处理)
event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
// 获取事件处理函数散列表的引用
var handlers = this.events[event.type];
// 执行每一个事件处理函数
for (var i in handlers) {
this.$$handleEvent = handlers[i];
if (this.$$handleEvent(event) === false) {
returnValue = false;
}
}
return returnValue;
};
/*
*修复IE浏览器的不兼容性
*/
function fixEvent(event) {
// 转换成W3C事件标准
event.preventDefault = fixEvent.preventDefault;
event.stopPropagation = fixEvent.stopPropagation;
event.target=event.target || event.srcElement;
return event;
};
fixEvent.preventDefault = function() {
this.returnValue = false;
};
fixEvent.stopPropagation = function() {
this.cancelBubble = true;
};
})();

浙公网安备 33010602011771号