js常用方法之事件注册

为了兼容各种浏览器,今天没事特意复习了一下js原生事件特性,对其封装一下,不解释,看代码:

;(function(){

    //进行库封装,防止对象污染

    window['cm']={};

/**

    *给对象注册事件

    */

    var addListener=function(element,type,fn){

        if(typeof element == 'undefined') return false;

        if(element.addEventListener){

            element.addEventListener(type,fn,false);

        }else if(element.attachEvent){

            //将事件缓冲到该标签上,已解决this指向window(现fn内this指向element)和移除匿名事件问题

            var _EventRef='_'+type+'EventRef';

            if(!element[_EventRef]){

                element[_EventRef]=[];

            }

            var _EventRefs=element[_EventRef];

            var index;

            for(index in _EventRefs){

                if(_EventRefs[index]['realFn']==fn){

                    return;

                }

            }

            var nestFn=function(){

                fn.apply(element,arguments);

            };

            element[_EventRef].push({'realFn':fn,'nestFn':nestFn});

            element.attachEvent('on'+type,nestFn);

        }else{

            element['on'+type]=fn;

        }

    };

    window['cm']['addListener']=addListener;

    /**

    *移除对象上已注册事件

    */

    var removeListener=function(element,type,fn){

        if(typeof element == 'undefined') return false;

        if(element.removeEventListener){

            element.removeEventListener(type,fn,false);

        }else if(element.detachEvent){

            var _EventRef='_'+type+'EventRef';

            if(!element[_EventRef]){

                element[_EventRef]=[];

            }

            var _EventRefs=element[_EventRef]

            var index;

            var nestFn;

            for(index in _EventRefs){

                if(_EventRefs[index]['realFn']==fn){

                    nestFn=_EventRefs[index]['nestFn'];

                    if(index==_EventRefs.length-1){

                        element[_EventRef]=_EventRefs.slice(0,index);

                    }else{

                        element[_EventRef]=_EventRefs.slice(0,index).concat(_EventRefs.slice(index+1,_EventRefs.length-1));

                    }

                    break;

                }

            }

            if(nestFn){

                element.detachEvent('on'+type,nestFn);

            }

        }else{

            element['on'+type]=null;

        }

    };

})();

 

 

你可能感兴趣的:(常用方法)