封裝一個可以隔離瀏覽器差別的JavaScript庫EventUtil,主要是使用能力檢測。html
var EventUtil={ addHandler:function(element,type,handler){ if(element.addEventListener){ element.addEventListener(type,handler,false); }else if(element.attachEvent){ element.attachEvent('on'+type,handler); }else{ element['on'+type]=handler; } }, getEvent:function(event){ return event?event :window.event; }, getTarget:function(){ return event.target | event.srcElement; }, preventDefault:function(event){ if(event.preventDefault){ event.preventDefault(); }else{ event.returnValue=false; } }, removeHandler:function(element,type,handler){ if(element.removeEventListener){ element.removeEventListener(type,handler,false); }else if(element.detachEvent){ element.detachEvent('on'+type,handler); }else{ element['on'+type]=null; } }, stopPropagation:function(event){ if(event.stopPropagation){ event.stopPropagation(); }else{ event.cancelBubble=true; } } };
要保證處理事件的代碼在大多數瀏覽器下一致運行,只須要關注冒泡階段。瀏覽器
//添加事件 /* element:要操做的元素 type:事件名稱 handler:事件處理程序函數 */ addHandler:function(element,type,handler){ if(element.addEventListener){ //存在DOM2級方法,則使用並傳入事件類型、事件處理程序函數和第3個參數false(表示冒泡階段) element.addEventListener(type,handler,false); }else if(element.attachEvent){//爲兼容IE8及更早瀏覽器,注意事件類型必須加上"on"前綴 element.attachEvent('on'+type,handler); }else{ element['on'+type]=handler;//其餘方法都無效,默認採用DOM0級方法,使用方括號語法將屬性名指定爲事件處理程序 } }
//移除addHandler添加的事件處理程序 /* element:要操做的元素 type:事件名稱 handler:事件處理程序函數 */ removeHandler:function(element,type,handler){ if(element.removeEventListener){ element.removeEventListener(type,handler,false); }else if(element.detachEvent){ element.detachEvent('on'+type,handler); }else{ element['on'+type]=null; } }
返回event對象的引用ide
getEvent:function(event){ return event?event :window.event; }
調用的時候函數
btn.onclick=function(event){ event=EventUtil.getEvent(event);//這行代碼添加到開頭,確保隨時可使用event對象,沒必要擔憂用戶使用的什麼瀏覽器 };
getTarget:function(){ return event.target || event.srcElement; },
調用學習
btn.onclick=function(event){ event=EventUtil.getEvent(event); var target=Event.getTarget(event); };
preventDefault:function(event){ if(event.preventDefault){ event.preventDefault(); }else{ event.returnValue=false; } }
調用編碼
var link=document.getElementById("myLink"); link.onclick=function(event){ event=EventUtil.getEvent(); EventUtil.preventDefault(event); }
stopPropagation:function(event){ if(event.stopPropagation){ event.stopPropagation(); }else{ event.cancelBubble=true; } }
調用spa
var link=document.getElementById("myLink"); link.onclick=function(event){ event=EventUtil.getEvent(); EventUtil.stopPropagation(event); } document.body.onclick=function(event){ alert("Body clicked"); }
getRelatedTarget:function(event){ if(event.relatedTarget){ return event.relatedTarget; }else if(event.toElement){ return event.toElement; }else if(event.fromEvent){ return event.fromEvent; }else{ return null; } }
對於mousedown和mouseup事件,在event對象中存在一個button屬性,表示按下或釋放的按鈕。代理
DOM的button屬性有3個取值:code
IE8及以前版本也提供了button屬性,但這個屬性的值與DOM的button屬性有很大差別。htm
兼容性處理:將IE中其餘選項分別轉換成如同按下這三個按鍵中的一個便可(同時將主按鈕做爲優先選取的對象)。IE中返回的5和7會被轉換成DOM模型中的0。因爲兩種模型有同名的button屬性,因此不能直接用能力檢測。支持DOM版鼠標事件的瀏覽器能夠經過hasFeature()方法來檢測,因此跨瀏覽器的getButton()方法以下:
getButton:function(event){ if(document.implementation.hasFeature("MouseEvents","2.0")){ return event.button; }else{ switch(event.buton){ case 0: case 1: case 3: case 5: case 7: return 0; case 2: case 6: return 2; case 4: return 1; } } }
調用:
var div=document.getElementById("myDiv"); EventUtil.addHandler(div,"mouseout",function(event){ event=EventUtil.getEvent(event); alert(EventUtil.getButton(event)); });
DOM中當用戶向前滾動鼠標滾輪時,wheelDelta是120的倍數;當用戶向後滾動鼠標滾輪時,wheelDelta是-120的倍數。
Opera 9.5以前的版本,wheelDelta值的正負號是顛倒的。
Firefox支持一個DOMMouseScroll的相似事件,且鼠標有關信息保存在detail屬性中。當向前滾動鼠標滾輪時,這個屬性的值是-3的倍數,向後滾動鼠標滾輪時,這個值是3的倍數。
getWheelDelta:function(event){ if(event.wheelDelta){ return(client.engine.opera && client.engine.opera<9.5? -event.wheelDelta:event.wheelDelta); }else{ return -event.detail*40; } }
調用:
能夠將相同的事件處理程序指定給mousewheel和DOMMouseScroll事件了。
(function(){ function handleMouseWheel(event){ event=EventUtil.getEvent(event); var delta=EventUtil.getWheelDelta(event); alert(delta); } EventUtil.addHandler(document,"mousewheel",handleMouseWheel); EventUtil.addHandler(document,"DOMMouseScroll",handleMouseWheel); })();
若是沒有封裝的話,client.engine.opera 這句代碼運行下會報錯client is not defined,由於目前尚未封裝這個方法,因此等下一個博客我會研究代理檢測封裝下這個方法; 因此先不考慮opera9.5,先註釋掉這句代碼;
IE9,Firefox,Chrome和Safari的event對象的charCode 屬性表明按下那個鍵所表明字符的ASCII編碼。
IE8及以前版本中Opera是在keyCode中保存字符的ASCII編碼。
檢查charCode屬性是否可用,不可用則使用keyCode。
getCharCode:function(event){ if(typeof event.charCode=="number"){//在不支持的瀏覽器中值是undefined return event.charCode; }else{ return event.keyCode; } }
調用
EventUtil.addHandler(textbox,"keypress",function(event){ event=EventUtil.getEvent(event); console.log(EventUtil.getCharCode(event)); });
本文做者starof,因知識自己在變化,做者也在不斷學習成長,文章內容也不定時更新,爲避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.cnblogs.com/starof/p/6555142.html有問題歡迎與我討論,共同進步。