代码改变世界

javascript event事件再次封装了,兼容大多数浏览器

2011-09-05 19:09  sniper007  阅读(632)  评论(0编辑  收藏  举报

修改记录:

1.整个封装了下,在Event名字空间下

2.代码规范了下

3.增加了cache

4.把原来一个全局变量改了,也放在了Event名字空间下

DEMO下载地址:/Files/sniper007/IEEVENT-version2.rar

上代码

var extend = function(destination,source){
    
for(var o in source)
        destination[o] 
= source[o];
    
return destination;
};

(
function(){
var Event = {},
    Cache,
    cache 
= [],
    _onunloadHandlerRegistered;

function addEvent(element, eventType, handler){
    
if (element.addEventListener) {
        element.addEventListener(eventType, handler, 
false);
    } 
else if (element.attachEvent) {
        element.attachEvent(
"on" + eventType, handler);
    } 
else {
        element[
"on" + eventType] = handler;
    }    
}

function removeEvent(element, eventType, handler){
    
if(element.removeEventListener) {
        element.removeEventListener(eventType, handler, 
false);
    }
else if(element.detachEvent) {
        element.detachEvent(
"on" + eventType, handler);
    }
else
        element[
"on" + eventType] = null;
    }
}

function getUUID(){
    
var _counter = 35;
    
return function(){
        
return "tigerEvent0" + _counter++;
    }    
}

function getDoc(element){
    
return element.ownerDocument || element.document || ((element.defaultView || element.window) && element) || document;
};

function add(element, eventType, handler, list){
    
var    d = getDoc(element),
        w 
= cache,
        id 
= getUUID();
    
    w[id] 
= list;
    
if(!element._handlers){
        element._handlers 
= [];
    }
    element._handlers.push(id);    
}

function get(element, eventType, handler, isSignal){
    
var handlers = element._handlers,
        returnVal 
= -1,
        returnObj 
= null;
    
if(!handlers){
        
return -1;
    }
    
var d = getDoc(element),
        w 
= cache;
    
for(var i = handlers.length - 1; i >= 0; i--){
        
var handlerId = handlers[i],
            h 
= w[handlerId];
        
if(h.eventType == eventType && h.handler == handler){
            returnVal 
= i;
            returnObj 
= h;
            
break;
        }
    }
    
if(!!isSignal){
        
return [returnVal, returnObj];
    }
else{
        
return -1;
    }
}

function remove(element, eventType, handler){
    
var i = find(element, eventType, handler);
    
if(i == -1){
        
return;
    }
    
var    d = getDoc(element),
        w 
= cache,
        handlerId 
= element._handlers[i],
        h 
= w[handlerId];
    element._handlers.splice(i, 
1);
    
delete cache[handlerId];    
}

function on(element, eventType, handler){
    
var i = get(element, eventType, handler);
    
if(i != -1){
        
return;
    }    
    
function wrappedHandler(e){
        e 
= window.event || e;
        
var event = fixed(e);
        event._event 
= e;
        handler.call(element, event);
    }
    
    
    
var h = {
        element : element,
        eventType : eventType,
        handler : handler,
        wrappedHandler : wrappedHandler
    };
    add(element, eventType, handler, h);
    addEvent(element, eventType, h.wrappedHandler);
    
    
if(!_onunloadHandlerRegistered){
        _onunloadHandlerRegistered 
= true;
        
if(window.attachEvent){
            window.attachEvent(
"onunload", removeAllHandlers);
        }
    }    
}

function un(element, eventType, handler){
    
var i = get(element, eventType, handler);
    
if(i != -1){
        
return;
    }    
    removeEvent(element, eventType, get(element, eventType, handler, 
true).wrappedHandler);    
    element._handlers.splice(i, 
1);
    remove(element, eventType, handler);    
}

function fixed(event){
    
if ( !event.target ) {
        event.target 
= event.srcElement || document;
    }
    
if ( event.target.nodeType === 3 ) {
        event.target 
= event.target.parentNode;
    }

    
if ( !event.relatedTarget && event.fromElement ) {
        event.relatedTarget 
= event.fromElement === event.target ? event.toElement : event.fromElement;
    }
    
    
if ( event.pageX == null && event.clientX != null ) {
        
var eventDocument = event.target.ownerDocument || document,
            doc 
= eventDocument.documentElement,
            body 
= eventDocument.body;

        event.pageX 
= event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0- (doc && doc.clientLeft || body && body.clientLeft || 0);
        event.pageY 
= event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0- (doc && doc.clientTop  || body && body.clientTop  || 0);
    }

    
if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
        event.which 
= event.charCode != null ? event.charCode : event.keyCode;
    }

    
if ( !event.metaKey && event.ctrlKey ) {
        event.metaKey 
= event.ctrlKey;
    }
    
if ( !event.which && event.button !== undefined ) {
        event.which 
= (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
    }

    
return event;
}

function fire(element, eventType){
    
if (document.dispatchEvent) {
        
var evt = null,
            doc 
= getDoc(element);
        
if (/mouse|click/i.test(eventType)) {
            evt 
= doc.createEvent('MouseEvents');
            evt.initMouseEvent(eventType, 
truetrue, doc.defaultView, 10000falsefalsefalsefalse0null);
        } 
else {
            evt 
= doc.createEvent('Events');
            evt.initEvent(eventType, 
truetrue, doc.defaultView);
        }
        element.dispatchEvent(evt);
    }
else{
        element.fireEvent(
'on' + eventType);
    }    
}

/*
防止IE内存溢出
*/

function removeAllHandlers(){
    
var w = cache;
    
for(var id in w){
        
var h = w[id];
        
if(h.element.detachEvent){
            h.element.detachEvent(
"on" + h.eventType, h.wrappedHandler);            
        }
        
delete w[id];
    }    
}

extend(Event, {
    on : on,
    un : on,
    fire : fire,
    cache : cache,
    addEvent : addEvent,
    removeEvent : removeEvent,
    _onunloadHandlerRegistered : _onunloadHandlerRegistered
});

window.Event 
= Event;
})();