事件模型

1、事件捕獲和事件冒泡與事件委托三者的關(guān)系

事件冒泡和事件捕獲分別由網(wǎng)景公式和微軟公司提出铛纬,這兩個(gè)概念都是為了解決頁(yè)面中事件流(事件發(fā)生順序)的問題厌均。事件捕獲和冒泡是現(xiàn)在瀏覽器的執(zhí)行事件的不同階段,事件委托是利用冒泡階段的運(yùn)行機(jī)制來實(shí)現(xiàn)的

捕獲告唆、冒泡棺弊、事件委托關(guān)系圖

事件冒泡和捕獲的運(yùn)行圖

運(yùn)行條件:當(dāng)一個(gè)事件發(fā)生在具有父元素的元素上時(shí),現(xiàn)代瀏覽器根據(jù)事件添加時(shí)的設(shè)置來執(zhí)行(冒泡或者捕獲)
通過addEventerListener()的第三個(gè)參數(shù)來設(shè)置事件是通過捕獲階段注冊(cè)的(true),還是冒泡階段注冊(cè)的(false),默認(rèn)情況下是false擒悬。

2模她、 事件冒泡

從實(shí)際操作的元素(事件)向父元素一級(jí)一級(jí)執(zhí)行下去,直到達(dá)到<html>     

有的時(shí)候父元素和子元素都定義了click事件懂牧,但是不希望點(diǎn)擊子元素的時(shí)候執(zhí)行父元素的click事件侈净,可以通過阻止冒泡(stopPropagation())在子元素上阻止冒泡。

3僧凤、事件捕獲

瀏覽器檢查元素的最外層祖先<html>畜侦,是否在捕獲階段注冊(cè)了一個(gè)click事件處理程序,如果是躯保,則運(yùn)行它旋膳。 
然后,它移動(dòng)到<html>的下一個(gè)元素(點(diǎn)擊元素的父元素)途事,并執(zhí)行相同的操作验懊,然后是下一個(gè)元素(點(diǎn)擊的元 
素的父元素),以此類推盯孙,直到達(dá)到實(shí)際點(diǎn)擊的元素鲁森。    

4、事件捕獲和冒泡的區(qū)別

執(zhí)行順序不同
事件冒泡:事件會(huì)從最內(nèi)層的元素開始發(fā)生振惰,一直向上傳播歌溉,直到document對(duì)象。
事件捕獲:事件從最外層開始發(fā)生骑晶,直到最具體的元素痛垛。

5、事件委托使用場(chǎng)景

如果你想要在大量子元素中單擊任何一個(gè)就可以執(zhí)行一段代碼桶蛔,這個(gè)時(shí)候可以把事件監(jiān)聽器設(shè)置在父節(jié)點(diǎn)上匙头。   
當(dāng)事件捕獲和事件冒泡同時(shí)存在的情況下,事件又是如何觸發(fā)的呢仔雷?
<!--部分HTML代碼-->  

<div id="s1">father
    <div id='s2'>children</div>
</div>
<!--部分JS代碼-->  

s1.addEventListener("click",function(e){
    console.log('father的捕獲事件')
},true);
s2.addEventListener("click",function(e){
    console.log('children的捕獲事件')
},true);
s1.addEventListener("click",function(e){
    console.log('father的冒泡事件')
},false);
s2.addEventListener("click",function(e){
    console.log('children的冒泡事件')
},false);

打印結(jié)果:

father的捕獲事件
children的捕獲事件
children的冒泡事件
father的冒泡事件   

結(jié)論:
對(duì)于非target節(jié)點(diǎn)蹂析,則先執(zhí)行捕獲再執(zhí)行冒泡舔示,對(duì)于target節(jié)點(diǎn)則先執(zhí)行先注冊(cè)的事件,無論冒泡還是捕獲电抚。
先執(zhí)行非target節(jié)點(diǎn)的捕獲惕稻,然后根據(jù)注冊(cè)順序執(zhí)行target節(jié)點(diǎn)的事件,然后再執(zhí)行非target節(jié)點(diǎn)的冒泡蝙叛。

addEventerListener俺祠,IE8及以下不支持,屬于DOM2級(jí)的方法借帘,可添加多個(gè)方法不被覆蓋
解綁事件蜘渣,參數(shù)和綁定相同

removeEventListener(event.type, handle, boolean);   

綁定事件兼容IE8及以下

attachEvent(event.type,handle);寫事件名時(shí)要加上on前綴  ,IE特有肺然,兼容IE8及以下蔫缸,可添加多個(gè)事件處理程序,只支持冒泡階段 

由于事件捕獲階段沒有可以阻止事件的函數(shù)际起,所以一般都是設(shè)置為事件冒泡

6捂龄、阻止冒泡

e.stopPropagation()
stopPropagation是事件對(duì)象(Event)的一個(gè)方法,作用是阻止目標(biāo)元素的冒泡事件加叁,但是不會(huì)阻止默認(rèn)行為倦沧。

兼容IE

e.cancelBubble = true   

阻止冒泡兼容IE寫法

window.event?window.event.cancelBubble=true:e.stopPropagation();   
e && e.stopPropagation ? e.stopPropagation() : window.event.cancelBubble = true; 

7它匕、取消默認(rèn)事件

e.preventDefault()
preventDefault它也是事件對(duì)象的一個(gè)方法展融,作用是取消一個(gè)目標(biāo)元素的默認(rèn)行為,既然說是默認(rèn)行為豫柬,當(dāng)然只有它有默認(rèn)行為才能被取消告希,如果元素本身無默認(rèn)行為,調(diào)用當(dāng)然無效啦烧给,比如鏈接a燕偶,提交按鈕input type="submit"等,當(dāng)event對(duì)象的cancelable為false時(shí)础嫡,表示沒有默認(rèn)行為指么,這時(shí)即使有默認(rèn)行為,調(diào)用preventDefault也是不會(huì)起作用的榴鼎。
兼容IE: return false;
js的return false只會(huì)阻止默認(rèn)行為伯诬,而是用jquery的話則既可以阻止默認(rèn)行為,有防止對(duì)象冒泡巫财。

8盗似、總結(jié)使用方法 :

停止冒泡
function stopBubble(e){
     <!--如果提供了事件對(duì)象,則這是個(gè)非IE瀏覽器-->
    if(e&&e.stopPropagation){
        e.stopPropagation();
    }else{
        <!--我們需要使用IE的方式來取消事件冒泡-->
        window.event.cancelBubble = true;
    }
}  
阻止默認(rèn)行為
function stopDefault(e){
    <!--阻止默認(rèn)行為W3C-->
    if(e&&e.preventDefault()){
        e.preventDefault();
    }else{
        <!--IE中阻止默認(rèn)行為-->
        return false;
    }
        
    }
}

9平项、事件注意點(diǎn):

1赫舒、event代表事件的狀態(tài)悍及,例如觸發(fā)event對(duì)象的元素,鼠標(biāo)的位置及狀態(tài)接癌、按下的鍵等并鸵。
2、event對(duì)象只在事件發(fā)生的過程中才有效
firefox里的event和IE中的不同扔涧,IE里的是全局變量,隨時(shí)可用届谈,firefox里的要用參數(shù)引導(dǎo)才能用枯夜,是運(yùn)行時(shí)的臨時(shí)變量。
在IE/Opera中是window.event艰山,在Firefox中是event;而事件的對(duì)象湖雹,在IE中是window.event.srcElement,在Firefox中是event.target曙搬,Opera中兩者都可用摔吏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纵装,隨后出現(xiàn)的幾起案子征讲,更是在濱河造成了極大的恐慌,老刑警劉巖橡娄,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诗箍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挽唉,警方通過查閱死者的電腦和手機(jī)滤祖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓶籽,“玉大人匠童,你說我怎么就攤上這事∷芩常” “怎么了汤求?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)严拒。 經(jīng)常有香客問我首昔,道長(zhǎng),這世上最難降的妖魔是什么糙俗? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任勒奇,我火速辦了婚禮,結(jié)果婚禮上巧骚,老公的妹妹穿的比我還像新娘赊颠。我一直安慰自己格二,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布竣蹦。 她就那樣靜靜地躺著顶猜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痘括。 梳的紋絲不亂的頭發(fā)上长窄,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音纲菌,去河邊找鬼挠日。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翰舌,可吹牛的內(nèi)容都是我干的嚣潜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼椅贱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼懂算!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庇麦,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤计技,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后山橄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酸役,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年驾胆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣澡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丧诺,死狀恐怖入桂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驳阎,我是刑警寧澤抗愁,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站呵晚,受9級(jí)特大地震影響蜘腌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饵隙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一撮珠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧金矛,春花似錦芯急、人聲如沸勺届。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)免姿。三九已至,卻和暖如春榕酒,著一層夾襖步出監(jiān)牢的瞬間胚膊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工想鹰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留紊婉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓杖挣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刚陡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惩妇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的歌殃。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評(píng)論 1 11
  • 事件是一種異步編程的實(shí)現(xiàn)方式蝙云,本質(zhì)上是程序各個(gè)組成部分之間的通信氓皱。DOM支持大量的事件,本節(jié)介紹DOM的事件編程勃刨。...
    許先生__閱讀 942評(píng)論 0 3
  • Dom事件 事件是一種異步編程的實(shí)現(xiàn)方式波材,本質(zhì)上是程序各個(gè)組成部分之間的通信。DOM支持大量的事件 (一) Eve...
    woow_wu7閱讀 1,775評(píng)論 0 1
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,013評(píng)論 1 6
  • 事件是一種異步編程的實(shí)現(xiàn)方式身隐,本質(zhì)上是程序各個(gè)組成部分之間的通信廷区。DOM支持大量的事件,本節(jié)介紹DOM的事件編程贾铝。...
    周花花啊閱讀 593評(píng)論 0 3