JavaScript將DOM事件處理程序封裝為event.js 出現(xiàn)的低級(jí)錯(cuò)誤問題
將 DOM 0級(jí)事件處理程序和DOM2級(jí)事件處理程序 IE事件處理程序封裝為eventUtil對(duì)象,達(dá)到跨瀏覽器的效果。代碼如下:
var eventUtil = { // 添加事件句柄 addEventHandler: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; } }, // 刪除事件句柄 removeEventHandler: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; } }, // 獲取事件對(duì)象 getEvent:function (event) { return event?event:window.event; }, // 獲取事件的類型 getType:function (event) { return event.type; }, // 獲取事件對(duì)象目標(biāo) getTarget:function (event) { if (event.target) { return event.target; }else{ return event.srcElement; } }, // 阻止事件冒泡 stopPropagation:function (event) { if (event.stopPropagation) { event.stopPropagation(); }else{ event.cancelBubble=true; } }, // 阻止事件默認(rèn)行為 preventDefault:function (event) { if (event.preventDefault) { event.preventDefault(); }else{ event.returnValue=false; } } }
在練習(xí)代碼的時(shí)候,自己出現(xiàn)了幾個(gè)錯(cuò)誤的地方,導(dǎo)致運(yùn)行出錯(cuò),記錄一下,加深記憶。
① 添加句柄是混淆參數(shù)的位置:首先是addEventHandler(element,type,handler)的參數(shù)分別表示,為哪個(gè)元素element添加事件,事件的類型type,事件處理函數(shù)handler。自己容易把handler和后面addEventLister(type,handler,false)中的false(表示冒泡階段)的位置混淆。
導(dǎo)致結(jié)果:在寫的過程,自己認(rèn)真想了一下,理解了addEventHandler需要的哪些參數(shù),就知道哪個(gè)位置該用哪個(gè)參數(shù),最終寫對(duì)了,未導(dǎo)致錯(cuò)誤。
解決辦法:理解并記住。
②在IE事件處理程序判斷分支中,對(duì)attachEvent和detachEvent拼寫錯(cuò)誤,少了Event,只寫了attach或detach。
導(dǎo)致結(jié)果:雖然沒有報(bào)錯(cuò),但是無法使用addEventHandler和removeEventHandler在IE中添加或刪除事件。
解決辦法:多練記牢就行。attachEvent 和 detachEvent。
③忘記了在IE事件處理程序attachEvent 和 detachEvent的參數(shù)里事件類型是需要加"on"的;寫成了attachEvent(type,handler)。其實(shí)正確的應(yīng)該是attachEvent("on"+type,handler),另外忘記了還有DOM0級(jí)事件處理的判斷分支
導(dǎo)致結(jié)果:同樣的,無法兼容IE事件處理。在IE上用封裝的方法添加或刪除事件不能成功。
解決辦法:也只能記住。還有一點(diǎn)需要注意:DOM0級(jí)事件中element["on"+type]這種方式。比如element["on"+"click"]等價(jià)于element.onclick。
④最后一個(gè)屬性的結(jié)尾也加逗號(hào),比如在阻止事件默認(rèn)行為 preventDefault:完成后加逗號(hào),如下面代碼片段(注釋)
preventDefault:function (event) { if (event.preventDefault) { event.preventDefault(); }else{ event.returnValue=false; } },//最后一個(gè)屬性preventDefault完成后加了逗號(hào),會(huì)出錯(cuò) }
導(dǎo)致結(jié)果:在IE中運(yùn)行時(shí)報(bào)錯(cuò)(其中event.js的54行是最后逗號(hào)的下一行,實(shí)際上就是逗號(hào)導(dǎo)致的;test.html的第10行則是因?yàn)檎{(diào)用了event.js中的eventUtil.addEventHandler方法)
解決辦法:毫無疑問,去掉最后的逗號(hào)即可。
⑤還是拼寫錯(cuò)誤,IE中阻止事件冒泡的屬性cancelBubble,寫多了一個(gè)s,寫成了cancelBubbles。
導(dǎo)致結(jié)果:沒有報(bào)錯(cuò),但是無法阻止IE中的事件冒泡。
解決辦法:改回來
以上所述是小編給大家介紹的JavaScript將DOM事件處理程序封裝為event.js 出現(xiàn)的低級(jí)錯(cuò)誤問題,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Extjs學(xué)習(xí)過程中新手容易碰到的低級(jí)錯(cuò)誤積累
- 7個(gè)你應(yīng)該知道的JS原生錯(cuò)誤類型
- 詳解JavaScript錯(cuò)誤捕獲
- JavaScript語句錯(cuò)誤throw、try及catch實(shí)例解析
- JS常見錯(cuò)誤(Error)及處理方案詳解
- JS錯(cuò)誤處理與調(diào)試操作實(shí)例分析
- javascript 初學(xué)教程及五子棋小程序的簡(jiǎn)單實(shí)現(xiàn)
- JavaScript初學(xué)者必看“new”
- JavaScript初學(xué)者容易犯的幾個(gè)錯(cuò)誤
相關(guān)文章
JavaScript駕馭網(wǎng)頁-獲取網(wǎng)頁元素
這篇文章主要介紹了JavaScript駕馭網(wǎng)頁-獲取網(wǎng)頁元素的相關(guān)資料,需要的朋友可以參考下2016-03-03Javascript設(shè)計(jì)模式理論與編程實(shí)戰(zhàn)之簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式是由一個(gè)方法來決定到底要?jiǎng)?chuàng)建哪個(gè)類的實(shí)例, 而這些實(shí)例經(jīng)常都擁有相同的接口. 這種模式主要用在所實(shí)例化的類型在編譯期并不能確定, 而是在執(zhí)行期決定的情況。 說的通俗點(diǎn),就像公司茶水間的飲料機(jī),要咖啡還是牛奶取決于你按哪個(gè)按鈕2015-11-11return false;和e.preventDefault();的區(qū)別
Have you ever seen those two things (in the title) being used in jQuery? Here is a simple2010-07-07boostrap模態(tài)框二次彈出清空原有內(nèi)容的方法
今天小編就為大家分享一篇boostrap模態(tài)框二次彈出清空原有內(nèi)容的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08學(xué)習(xí)javascript文件加載優(yōu)化
這篇文章主要為大家詳細(xì)介紹了javascript文件加載優(yōu)化,三種方式實(shí)現(xiàn)js文件加載優(yōu)化,感興趣的小伙伴們可以參考一下2016-02-02基于JavaScript實(shí)現(xiàn)控制下拉列表
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)控制下拉列表,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05JavaScript定義變量和變量?jī)?yōu)先級(jí)問題探討
這篇文章主要介紹了JavaScript定義變量和變量?jī)?yōu)先級(jí)的問題探討,變量的定義還有這么講究嗎,不錯(cuò),看完本文相信你會(huì)有一定的收獲,需要的朋友可以參考下2014-10-10微信小程序 功能函數(shù)小結(jié)(手機(jī)號(hào)驗(yàn)證*、密碼驗(yàn)證*、獲取驗(yàn)證碼*)
這篇文章主要介紹了微信小程序功能函數(shù)手機(jī)號(hào)驗(yàn)證、密碼驗(yàn)證,獲取驗(yàn)證碼*的相關(guān)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-12-12TypeScript泛型參數(shù)默認(rèn)類型和新的strict編譯選項(xiàng)
這篇文章主要介紹了TypeScript泛型參數(shù)默認(rèn)類型和新的strict編譯選項(xiàng),對(duì)TypeScript感興趣的同學(xué),可以參考下2021-05-05Javascript新手入門之字符串拼接與變量的應(yīng)用
這篇文章主要給大家介紹了關(guān)于Javascript新手入門之字符串拼接與變量應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12