JavaScript冒泡型/捕獲型事件惜辑、阻止冒泡和默認(rèn)行為

冒泡型事件的基本思想是:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)(document對(duì)象)的順序觸發(fā)。

<html>
    <head>
        <title></title>
    </head>
    <body onclick="theClick()">
        <div onclick="theClick()">點(diǎn)擊</div>
    </body>
</html>

IE5.5冒泡順序如下:
(1)<div>
(2)<body>
(3)<document>


1.jpg

為什么稱作冒泡疫赎、因?yàn)槭录凑誅OM的層次結(jié)構(gòu)像水泡一樣不斷上升盛撑。讓我想起了一首歌:"吹泡泡、吹泡泡捧搞、泡泡飛啊飛得高抵卫、飛到天空中、問(wèn)聲太陽(yáng)好"胎撇。

IE6呢介粘、稍微修改了冒泡型事件、這樣<html>元素也可以接收冒泡的事件创坞、還是上面的代碼碗短。

IE6的冒泡順序如下:
(1)<div>
(2)<body>
(3)<html>
(4)<document>


2.jpg

Mozilla1.0及更高版本也支持冒泡事件但到達(dá)了另一層次。類似IE6.0题涨,它也支持<html>元素級(jí)別的事件偎谁、不過(guò),事件"起泡"一直上升到Windows窗口對(duì)象纲堵。繼續(xù)前面的代碼巡雨、點(diǎn)擊<div>元素將造成下圖所示的事件冒泡:


3.jpg

捕獲型事件:

IE使用冒泡型事件、相對(duì)的席函、Netscape使用了另一種稱為捕獲型事件(eventcapturing)的解決方案铐望、事件的捕獲和冒泡剛好相反的兩種過(guò)程——捕獲型事件中、事件從最不精確的對(duì)象(document對(duì)象)開始觸發(fā)茂附、然后到最精確(也可以在窗口級(jí)別捕獲事件正蛙,不過(guò)必尋由開發(fā)人員特別指定)。Netscape不會(huì)將頁(yè)面上的很多元素暴露給事件营曼。繼續(xù)使用前面的代碼示例乒验、事件按照下面的路徑傳播:

(1)document
(2)<div>

有些人也稱之為自頂向下的事件模型,因?yàn)樗菑腄OM層次的頂端開始向下延伸的:


4.jpg

DOM事件流:

DOM(文檔對(duì)象模型)結(jié)構(gòu)是一個(gè)樹型結(jié)構(gòu)蒂阱,當(dāng)一個(gè)HTML元素產(chǎn)生一個(gè)事件時(shí)锻全,該事件會(huì)在元素結(jié)點(diǎn)與根節(jié)點(diǎn)之間按特定的順序傳播狂塘,路徑所經(jīng)過(guò)的節(jié)點(diǎn)都會(huì)收到該事件,這個(gè)傳播過(guò)程可稱為DOM事件流鳄厌。事件順序有兩種類型:事件捕捉和事件冒泡荞胡。

DOM標(biāo)準(zhǔn)的事件模型

我們已經(jīng)對(duì)上面兩個(gè)不同的事件模型進(jìn)行了解釋和對(duì)比。DOM標(biāo)準(zhǔn)同時(shí)支持兩種事件模型了嚎,即捕獲型事件與冒泡型事件泪漂,但是,捕獲型事件先發(fā)生新思。兩種事件流都會(huì)觸發(fā)DOM中的所有對(duì)象窖梁,從document對(duì)象開始赘风,也在document對(duì)象結(jié)束(大部分兼容標(biāo)準(zhǔn)的瀏覽器會(huì)繼續(xù)將事件是捕捉/冒泡延續(xù)到window對(duì)象)夹囚。繼續(xù)使用前面的例子、在與DOM兼容的瀏覽器中點(diǎn)擊<div>元素時(shí)邀窃、事件流的進(jìn)行如下圖:


5.jpg

注意因?yàn)槭录哪繕?biāo)(<div>元素)是最精確的元素(于是荸哟,在DOM樹中最深),實(shí)際上它會(huì)接收兩次事件瞬捕,一次在捕獲過(guò)程中鞍历,另一次在冒泡過(guò)程中。DOM事件模型的最獨(dú)特的性質(zhì)是肪虎,文本節(jié)點(diǎn)也觸發(fā)事件(在IE不會(huì))劣砍。所以如果點(diǎn)擊示例中的<div>點(diǎn)擊</div>、實(shí)際的事件流應(yīng)該是:


6.jpg

下面是一個(gè)簡(jiǎn)單的例子扇救,用于檢查瀏覽器先捕獲刑枝,再冒泡:

<!doctype html>  
<meta charset=utf-8>  
<div id="parent">  
    <div id="child"></div>  
</div>  
<script>  
    var parent = document.getElementById('parent');  
    var child = document.getElementById('child');  
    var order = [];  
    parent.addEventListener('click', function(){ order.push(1) }, true);  
    child.addEventListener('click', function(){ order.push(2) }, false);  
    parent.addEventListener('click', function(){ order.push(3) }, false);  
    child.click();  
    document.write(order); //[1,2,3]  
</script>  

第一個(gè)click為true,表示使用捕獲型事件迅腔,先執(zhí)行装畅。
第二個(gè)click為false,表示使用冒泡型事件沧烈,從最里面開始掠兄。

W3C模型是將兩者進(jìn)行中和,在W3C模型中锌雀,任何事件發(fā)生時(shí)蚂夕,先從頂層開始進(jìn)行事件捕獲,直到事件觸發(fā)到達(dá)了事件源元素再開始冒泡腋逆。

前端開發(fā)工作中婿牍,由于瀏覽器兼容性等問(wèn)題,我們會(huì)經(jīng)常用到“停止事件冒泡”和“阻止瀏覽器默認(rèn)行為”闲礼。

1.阻止瀏覽器的默認(rèn)行為

function stopDefault(e) {  
    //如果提供了事件對(duì)象牍汹,則這是一個(gè)非IE瀏覽器   
    if(e && e.preventDefault) {  
      //阻止默認(rèn)瀏覽器動(dòng)作(W3C)  
      e.preventDefault();  
    } else {  
      //IE中阻止函數(shù)器默認(rèn)動(dòng)作的方式   
      window.event.returnValue = false;   
    }  
    return false;  
}  

2.停止事件冒泡

function stopBubble(e) {
    //如果提供了事件對(duì)象铐维,則這是一個(gè)非IE瀏覽器
    if(e && e.stopPropagation) {
    //因此它支持W3C的stopPropagation()方法
    e.stopPropagation();
    } else {
    //否則,我們需要使用IE的方式來(lái)取消事件冒泡
    window.event.cancelBubble = true;
    }
    return false;
}

jquery的寫法:
1)return false :In event handler ,prevents default behavior and event bubbing 慎菲。
return false 在事件的處理中嫁蛇,可以阻止默認(rèn)事件和冒泡事件。
2)event.preventDefault():In event handler ,prevent default event (allows bubbling) 露该。
event.preventDefault()在事件的處理中睬棚,可以阻止默認(rèn)事件但是允許冒泡事件的發(fā)生。
3)event.stopPropagation():In event handler ,prevent bubbling (allows default behavior).
event.stopPropagation()在事件的處理中解幼,可以阻止冒泡但是允許默認(rèn)事件的發(fā)生
prototype的寫法:
Event.stop(event)

學(xué)習(xí)交流抑党,請(qǐng)加群:654979292

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撵摆,隨后出現(xiàn)的幾起案子底靠,更是在濱河造成了極大的恐慌,老刑警劉巖特铝,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暑中,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鲫剿,警方通過(guò)查閱死者的電腦和手機(jī)鳄逾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灵莲,“玉大人雕凹,你說(shuō)我怎么就攤上這事≌常” “怎么了枚抵?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赠幕。 經(jīng)常有香客問(wèn)我俄精,道長(zhǎng),這世上最難降的妖魔是什么榕堰? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任竖慧,我火速辦了婚禮,結(jié)果婚禮上逆屡,老公的妹妹穿的比我還像新娘圾旨。我一直安慰自己,他們只是感情好魏蔗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布砍的。 她就那樣靜靜地躺著,像睡著了一般莺治。 火紅的嫁衣襯著肌膚如雪廓鞠。 梳的紋絲不亂的頭發(fā)上帚稠,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音床佳,去河邊找鬼滋早。 笑死,一個(gè)胖子當(dāng)著我的面吹牛砌们,可吹牛的內(nèi)容都是我干的杆麸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浪感,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昔头!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起影兽,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揭斧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赢笨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體未蝌,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年茧妒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片左冬。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桐筏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拇砰,到底是詐尸還是另有隱情梅忌,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布除破,位于F島的核電站牧氮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瑰枫。R本人自食惡果不足惜踱葛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望光坝。 院中可真熱鬧尸诽,春花似錦、人聲如沸盯另。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸳惯。三九已至商蕴,卻和暖如春叠萍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绪商。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工俭令, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人部宿。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓抄腔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親理张。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赫蛇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • ??JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的悟耘。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評(píng)論 1 11
  • 以下文章為轉(zhuǎn)載织狐,對(duì)理解JavaScript中的事件處理機(jī)制很有幫助暂幼,淺顯易懂,特分享于此移迫。 什么是事件旺嬉? 事件(E...
    jxyjxy閱讀 3,035評(píng)論 1 10
  • 第3章 基本概念 3.1 語(yǔ)法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡(jiǎn)單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,124評(píng)論 0 21
  • 這個(gè)問(wèn)題也是老生常談了邪媳,寫這篇文章的主要目的是進(jìn)行下梳理,了解自己知識(shí)點(diǎn)的掌握程度荡陷,也希望對(duì)大家有所幫助雨效。 在說(shuō)如...
    一木_qintb閱讀 4,281評(píng)論 1 4
  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型。在這種程序設(shè)計(jì)風(fēng)格下废赞,當(dāng)文檔徽龟、瀏覽器、元素或與之相關(guān)的對(duì)象發(fā)...
    劼哥stone閱讀 1,256評(píng)論 3 11