document.write('
解析:
varEventUtil = (function() {
var EventUtil, // 事件处理对象
eventList = [], // 事件列表
// 浏览器兼容的鼠标滚动事件 type
mouseWheelType = typeof window.opera !== "object"&& !/
(Khtml|AppleWebKit|Konqueror)/.test(navigator.userAgent) &&
/Gecko/.test(navigator.userAgent) ? "DOMMouseScroll":
"mousewheel", // 鼠标滚动事件 type 正则
mouseWheelRegExp = /^mousewheel|DOMMouseScroll$/;
// 事件详细信息构造器
function EventDetail(element, type, handler, proxy) {
this.element = element;
this.type = type;
this.handler = handler;
this.proxy = proxy;
}
// 将事件对象处理成 DOM 标准的事件对象
function eventObjHandler(event, element) {
event = event || window.event;
if(!event.target) {
event.target = event.srcElement;
}
if(event.cancelable === undefined) {
event.cancelable = true;
}
if(!event.preventDefault) {
event.preventDefault = function() {
event.returnValue = false;
};
}
if(event.bubbles === undefined) {
event.bubbles = true;
}
if(!event.stopPropagation) {
event.stopPropagation = function() {
event.cancelBubble = true;
};
}
if(!event.currentTarget) {
event.currentTarget = element;
}
if(!event.eventPhase) {
event.eventPhase = event.target === event.
currentTarget ? 2: 3;
}
if(mouseWheelRegExp.test(event.type) && !event.
wheelDelta) {
event.wheelDelta = -event.detail * 40;
}
return event;
}
// 创建 handler 的代理函数,用于修正 this 引用
function createProxyFunc(ele, type, handler) {
var proxy = function(event) {
handler.call(ele, eventObjHandler(event, ele));
};
eventList.push(newEventDetail(ele, type, handler,
proxy));
return proxy;
}
// 从 eventList 中找出真正绑定到事件中的处理函数,并删除相应的
EventDetail
function findTheTrueEventHandler(ele, type, handler) {
var i, eventDetail;
for(i = eventList.length - 1; i >= 0; i--) {
eventDetail = eventList[i];
if(eventDetail.element === ele && eventDetail.
type === type && eventDetail.handler === handler) {
break;
}
}
if(i > -1) {
handler = eventList[i].proxy; eventList.
splice(i, 1);
}
return handler;
}
// 修正鼠标滚轮事件名
function repairMouseWheel(type) {
return mouseWheelRegExp.test(type) ? mouseWheelType :
type;
}
EventUtil = {
// 添加事件绑定
add: function(ele, type, handler) {
type = repairMouseWheel(type); // 修正 type
if(ele.addEventListener) { // 标准
ele.addEventListener(type,
type === "DOMMouseScroll"?
createProxyFunc(ele, type, handler) : handler, false);
} else if(ele.attachEvent) { //IE
ele.attachEvent("on"+ type,
createProxyFunc(ele, type, handler));
} else{ //DOM1
ele["on"+ type] = function(event) {
handler.call(ele, eventObjHandler(event));
};
}
},
// 移除事件绑定
remove: function(ele, type, handler) {
type = repairMouseWheel(type); // 修正 type
if(ele.removeEventListener) { // 标准
ele.removeEventListener(type,
type === "DOMMouseScroll"?
findTheTrueEventHandler(ele, type, handler) :
handler, false);
} else if(ele.detachEvent) { //IE
ele.detachEvent("on"+ type,
findTheTrueEventHandler(ele, type, handler));
} else{ //DOM1
ele["on"+ type] = null;
}
}
};
// 绑定页面关闭事件,当页面关闭时移除所有事件
EventUtil.add(window, "unload", function() {
var i, eventDetail;
for(i = eventList.length - 1; i >= 0; i--) {
eventDetail = eventList[i];
if(eventDetail.type === "DOMMouseScroll") {
eventDetail.element.removeEventListener
(eventDetail.type, eventDetail.proxy, false);
} else{
eventDetail.element.detachEvent("on"+
eventDetail.type, eventDetail.proxy, false);
}
eventList[i] = null;
}
eventList = [];
});
return EventUtil;
})();
');