為了兼容各種瀏覽器,今天沒事特意復(fù)習(xí)了一下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){ //將事件緩沖到該標(biāo)簽上,已解決this指向window(現(xiàn)fn內(nèi)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; } }; })();
|
|
來自: 昵稱10504424 > 《Js》