一:什么是事件委托擎厢?
? ? 事件委托是利用事件冒泡究流,只指定一個(gè)事件處理程序來(lái)管理某一類型的所有事件。
二:為什么要用事件委托动遭?
? ? 1.在JavaScript中添加到頁(yè)面上的事件處理程序的個(gè)數(shù)直接關(guān)系到頁(yè)面的整體運(yùn)行性能梯嗽。為什么呢?因?yàn)楣了穑總€(gè)事件處理函數(shù)都是對(duì)象灯节,對(duì)象會(huì)占用內(nèi)存,內(nèi)存中的對(duì)象越多绵估,性能就越差炎疆。此外,必須事先指定所有的事件處理程序而導(dǎo)致的DOM訪問(wèn)次數(shù)国裳,會(huì)延遲整個(gè)頁(yè)面的交互就緒時(shí)間形入。
? ? 2.對(duì)有很多個(gè)數(shù)據(jù)的表格以及很長(zhǎng)的列表逐個(gè)添加事件,簡(jiǎn)直就是噩夢(mèng)缝左。所以事件委托亿遂,能極大地提高頁(yè)面的運(yùn)行性能,減少開發(fā)人員的工作量渺杉。
三:JavaScript中的例子
? ? ? 我們以下面的HTML代碼為例蛇数,用事件委托的方式實(shí)現(xiàn)當(dāng)鼠標(biāo)單擊某個(gè)li元素的時(shí)候,li元素的背景變成紅色是越。
?下面是JavaScript代碼:
單擊列表4耳舅,實(shí)現(xiàn)效果:
?三:jQuery中的例子
? ? jQuery中的事件委托方式比較豐富,就以同樣的例子來(lái)說(shuō):
? ?1倚评、用on方法,代碼如下:
1
2.用delegate()方法浦徊,代碼如下:
on()方法和delegate()方法對(duì)于事件委托的寫法很像。并且執(zhí)行事件委托的時(shí)候只有子元素(本文中的li)會(huì)觸發(fā)事件天梧,而代為執(zhí)行的父元素(本文中為ul)不會(huì)觸發(fā)事件盔性,所以我們不需要盤判斷觸發(fā)事件的元素節(jié)點(diǎn)名,這一點(diǎn)明顯優(yōu)于原生的JavaScript呢岗。
3.用bind()方法冕香,代碼如下:
bind()方法同原生的JavaScript實(shí)現(xiàn)方法一樣,當(dāng)父元素代子元素執(zhí)行事件時(shí)敷燎,父元素也會(huì)觸發(fā)事件暂筝,所以我們需要判斷一下觸發(fā)事件的元素名。此外硬贯,用bind()方法給元素綁定事件的時(shí)候要注意焕襟,它只能給已經(jīng)存在DOM元素添加事件,不能給未來(lái)存在DOM
元素添加添加事件饭豹。如果要頻繁地添加DOM元素鸵赖,并且給新添加的DOM元素綁定事件的話务漩,用live(),delegate(),on()等方法。鑒于jQuery從1.7之后就不推薦live()和delegate()方法了它褪,所以大家還是使用on()方法吧饵骨。