什么是事件畅哑?
事件的本質(zhì)是程序各個組成部分之間的一種通信方式肴楷,也是異步編程的一種實現(xiàn)嗎,DOM支持大量的事件荠呐。
1.EventTarget接口
Dom的事件操作(監(jiān)聽和觸發(fā))赛蔫,都定義在EventTarget接口,所有節(jié)點對象都部署了這個接口泥张,其他一些需要事件通信的瀏覽器內(nèi)置對象(比如呵恢,XMLHttpRequest ,AudioNode,AudioContext)也部署了這個接口
該接口主要提供三個實例方法。
1.1EventTarget.addEventListener()? ?: 綁定事件的監(jiān)聽函數(shù)
EventTarget.addEventListener()用于在當前節(jié)點或?qū)ο笊厦拇矗x一個特定事件的監(jiān)聽函數(shù)渗钉,一旦這個事件發(fā)生,就會執(zhí)行監(jiān)聽函數(shù)钞钙,該方法沒有返回值鳄橘。
target.addEventListrener(type,listener[,useCapture]);
該方法接受三個參數(shù):
type:事件名稱,大小寫敏感
listener:監(jiān)聽函數(shù)芒炼,事件發(fā)生時瘫怜,會調(diào)用該監(jiān)聽函數(shù)
useCapture:布爾值,表示監(jiān)聽函數(shù)是否在捕獲階段觸發(fā)本刽,默認為false(監(jiān)聽函數(shù)只在冒泡階段被觸發(fā))鲸湃,該參數(shù)可選
addEventListener方法可以為針對當前對象的同一個事件赠涮,添加多個不同的監(jiān)聽函數(shù),這些函數(shù)按照添加順序觸發(fā)暗挑,即先添加先觸發(fā)世囊,如果為同一個事件多次添加同一個監(jiān)聽函數(shù),該函數(shù)只會執(zhí)行一次窿祥,多余的添加將自動被去除(不必使用removeEventlistener方法手動去除)
1.2EventTarget.removeEventListener()? :移除事件的監(jiān)聽函數(shù)
EventTarget.removeEventListener方法用來移除addEventListener方法添加的事件監(jiān)聽函數(shù)株憾,該方法沒有返回值
1.3dispatchEvent :觸發(fā)事件
EventTarget.dispatchEvent方法在當前節(jié)點上觸發(fā)指定事件,從而觸發(fā)監(jiān)聽函數(shù)的執(zhí)行晒衩,該方法返回一個布爾值嗤瞎,只要有一個監(jiān)聽函數(shù)調(diào)用了Event.preventDefault(),則返回值為false,否則為true
target.dispatchEvent(event)
dispatchEvent方法的參數(shù)是一個Event對象的實例
2.監(jiān)聽函數(shù)
瀏覽器的事件模型,就是通過監(jiān)聽函數(shù)(listener)對事件做出反應听系,事件發(fā)生后贝奇,瀏覽器監(jiān)聽到了這個事件,就會執(zhí)行對應的監(jiān)聽函數(shù)靠胜,這是事件驅(qū)動編程模式的主要編程方式
2.1html的on-屬性
<body onload="doSomething()">
2.2元素節(jié)點的事件屬性
元素節(jié)點的事件屬性掉瞳,同樣可以指定監(jiān)聽函數(shù)
window.onload=doSomething;
div.onclick=function(event){
console.log('觸發(fā)事件‘);
}
事件的傳播
一個事件發(fā)生后浪漠,會在子元素和父元素之間傳播陕习,這種傳播分為三個階段
第一階段:從window對象傳到目標節(jié)點(上層傳到底層),稱為捕獲階段
第二階段:在目標節(jié)點上觸發(fā)址愿,稱為“目標階段
第三階段:從目標節(jié)點傳到回window對象(從底層傳回上層)稱為冒泡階段
事件代理:
由于事件會在冒泡階段向上傳播到父節(jié)點该镣,因此可以把子節(jié)點的監(jiān)聽函數(shù)定義在父節(jié)點上,由父節(jié)點的監(jiān)聽函數(shù)統(tǒng)一處理多個子元素的事件响谓,這種方法叫做事件的代理
var ul = document.querySelector('ul');
ul.addEventListener('click', function (event) {
if (event.target.tagName.toLowerCase() === 'li') {
// some code
} });
click事件的監(jiān)聽函數(shù)定義在
節(jié)點损合,但是實際上,它處理的是子節(jié)點
- 的click事件娘纷。這樣做的好處是嫁审,只要定義一個監(jiān)聽函數(shù),就能處理多個子節(jié)點的事件赖晶,而不用在每個
- 節(jié)點上定義監(jiān)聽函數(shù)律适。而且以后再添加子節(jié)點,監(jiān)聽函數(shù)依然有效嬉探。
如果希望事件到某個節(jié)點為止擦耀,不再傳播,可以使用事件對象的stopPropagation方法涩堤。
事件委托:
就是把一個元素響應事件的函數(shù)委托到另一個元素眷蜓,利用冒泡的原理,把事件加到父級上胎围,觸發(fā)執(zhí)行效果
Jquery中事件委托主要的幾種實現(xiàn)方法:$.on,? $.delegate $.live