JavaScript實(shí)現(xiàn)為事件句柄綁定監(jiān)聽(tīng)函數(shù)的方法分析
本文實(shí)例講述了JavaScript實(shí)現(xiàn)為事件句柄綁定監(jiān)聽(tīng)函數(shù)的方法。分享給大家供大家參考,具體如下:
在JavaScript中為Dom元素綁定事件監(jiān)聽(tīng)函數(shù)是一件非常常見(jiàn)的事情,但這里也有許多的Bug。各種瀏覽器對(duì)于事件綁定都提供了很多方法,但可靠的只有3中:
1、傳統(tǒng)的綁定方法:
elem.onclick = function( event ){ alert(event.type + 'this.innerHTML'); };
a、傳統(tǒng)的綁定方法,非常簡(jiǎn)單穩(wěn)定,函數(shù)體內(nèi)的this指向的也是指向正在處理事件的節(jié)點(diǎn)(如當(dāng)前正在運(yùn)行事件句柄的節(jié)點(diǎn))。
b、一個(gè)元素的一個(gè)事件句柄只能注冊(cè)一個(gè)函數(shù),如果重復(fù)注冊(cè),會(huì)產(chǎn)生覆蓋;而且,傳統(tǒng)綁定方法只會(huì)在事件冒泡中運(yùn)行。
2、W3C標(biāo)準(zhǔn)綁定方法:
var elem = document.getElementById('ID'); elem.addEventListener('click' , function( event ){ alert(event.type + ' ' + this.innerHTML + 1); } , false //冒泡階段執(zhí)行 ); elem.addEventListener('click' , function( event ){ alert(event.type + ' ' + this.innerHTML + 2); } , false );
a、這種綁定方法同時(shí)支持時(shí)間處理的捕獲和冒泡兩個(gè)階段;同一元素的同一事件句柄可以注冊(cè)多個(gè)監(jiān)聽(tīng)函數(shù);而且,監(jiān)聽(tīng)函數(shù)內(nèi)部this指向當(dāng)前元素。
b、但是流行的IE瀏覽器不支持這種注冊(cè)方法。
3、IE事件句柄注冊(cè)方法:
var elem = document.getElementById('a'); elem.attachEvent('onclick' , function(){ alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 1); } ); elem.attachEvent('onclick' , function(){ alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 2); } );
a、這種綁定方法,可以為同一事件句柄注冊(cè)多次。
b、IE的事件模型不支持事件捕獲;監(jiān)聽(tīng)函數(shù)體內(nèi)的this指向的不是當(dāng)前于元素,而且window.event.srcElement指向的是發(fā)生事件的節(jié)點(diǎn),而不是當(dāng)前節(jié)點(diǎn),并且在IE的事件對(duì)象中也沒(méi)有等價(jià)的DOM currentTarget屬性。
4、跨瀏覽器的方法一:
function addEvent(element, type, handler) { if (!handler.guid)handler.guid = addEvent.guid++; if (!element.events) element.events = {}; var handlers = element.events[type]; if (!handlers) { handlers = element.events[type] = {}; if (element["on" + type]) { handlers[0] = element["on" + type]; } } handlers[handler.$$guid] = handler; element["on" + type] = handleEvent; }; addEvent.guid = 1; function removeEvent(element, type, handler) { if (element.events && element.events[type]) { delete element.events[type][handler.$$guid]; } }; function handleEvent(event) { var returnValue = true; event = event || fixEvent(window.event); var handlers = this.events[event.type]; for (var i in handlers) { this.$$handleEvent = handlers[i]; if (this.$$handleEvent(event) === false) { returnValue = false; } } return returnValue; }; function fixEvent(event) { event.preventDefault = fixEvent.preventDefault; event.stopPropagation = fixEvent.stopPropagation; return event; }; fixEvent.preventDefault = function() { this.returnValue = false; }; fixEvent.stopPropagation = function() { this.cancelBubble = true; };
以上代碼由是有 Dean EdwardsaddEvent/removeEven
5、跨瀏覽器的方法二:
function addEvent( obj, type, fn ) { if ( obj.attachEvent ) { obj['e'+type+fn] = fn; obj[type+fn] = function(){obj['e'+type+fn]( window.event );} obj.attachEvent( 'on'+type, obj[type+fn] ); } else obj.addEventListener( type, fn, false ); } function removeEvent( obj, type, fn ) { if ( obj.detachEvent ) { obj.detachEvent( 'on'+type, obj[type+fn] ); obj[type+fn] = null; } else obj.removeEventListener( type, fn, false ); }
另外,事件流可分為冒泡型事件和捕獲型事件,HTML元素大都包含了自己的默認(rèn)行為,例如:超鏈接、提交按鈕等。我們可以通過(guò)在綁定事件中加上"return false"來(lái)阻止它的默認(rèn)行為。感興趣的拼音可參考本站js之事件冒泡和事件捕獲詳細(xì)介紹上的相關(guān)介紹。
PS:這里再為大家附上javascript系統(tǒng)自帶事件參考表供大家參考查詢(xún):
javascript事件與功能說(shuō)明大全:
http://tools.jb51.net/table/javascript_event
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專(zhuān)題:《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
url參數(shù)中有+、空格、=、%、&、#等特殊符號(hào)的問(wèn)題解決
url參數(shù)中有+、空格、=、%、&、#等特殊符號(hào)的問(wèn)題解決,需要的朋友可以參考一下2013-05-05原生JS實(shí)現(xiàn)自定義滾動(dòng)條效果
這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)自定義滾動(dòng)條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07JavaScript保存并運(yùn)算頁(yè)面中數(shù)字類(lèi)型變量的寫(xiě)法
這篇文章主要介紹了JavaScript保存并運(yùn)算頁(yè)面中數(shù)字類(lèi)型變量的寫(xiě)法,當(dāng)你在頁(yè)面中需要不停運(yùn)算一個(gè)數(shù)字變量時(shí)非常有用,普通的寫(xiě)法不能正常運(yùn)算,使用本文方法就可以,需要的朋友可以參考下2015-07-07JavaScript常用的3種彈出框(提示框?alert/確認(rèn)框?confirm/輸入框?prompt)
三種彈框在系統(tǒng)中都是同步執(zhí)行的,也就是說(shuō),三種彈框中的任一彈框彈出,代碼都不在執(zhí)行,直到點(diǎn)擊確認(rèn)或取消,關(guān)閉彈窗后,代碼繼續(xù)執(zhí)行,本文通過(guò)實(shí)例代碼給大家分享JS常用的3種彈出框,感興趣的朋友一起看看吧2022-07-07JS實(shí)現(xiàn)的Object數(shù)組去重功能示例【數(shù)組成員為Object對(duì)象】
這篇文章主要介紹了JS實(shí)現(xiàn)的Object數(shù)組去重功能,可實(shí)現(xiàn)針對(duì)數(shù)組成員為Object對(duì)象的去重復(fù)功能,涉及javascript數(shù)組元素遍歷、屬性判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02基于JavaScript實(shí)現(xiàn)繼承機(jī)制之原型鏈(prototype chaining)的詳解
我們知道在JavaScript中定義類(lèi)的原型方式,而原型鏈擴(kuò)展了這種方式,以一種有趣的方式實(shí)現(xiàn)繼承機(jī)制。prototype 對(duì)象是個(gè)模板,要實(shí)例化的對(duì)象都以這個(gè)模板為基礎(chǔ)??偠灾琾rototype 對(duì)象的任何屬性和方法都被傳遞給那個(gè)類(lèi)的所有實(shí)例。原型鏈利用這種功能來(lái)實(shí)現(xiàn)繼承機(jī)制2013-05-05