摘要:事件冒泡和傳播舉栗子事件輸出事件有兩種,一種為事件傳播,一種是事件冒泡事件傳播和事件冒泡這還要從遙遠(yuǎn)的荒誕說起,兩家網(wǎng)景和,為了能爭(zhēng)奪市場(chǎng),互相使用相反的技術(shù),當(dāng)網(wǎng)景使用事件傳播的時(shí)候,使用事件冒泡。
事件冒泡和傳播
舉栗子
事件輸出hello world
事件有兩種,一種為事件傳播,一種是事件冒泡
這還要從遙遠(yuǎn)的荒誕說起,兩家網(wǎng)景和ie,為了能爭(zhēng)奪市場(chǎng),互相使用相反的技術(shù),當(dāng)網(wǎng)景使用事件傳播的時(shí)候,ie使用事件冒泡。(兩個(gè)正好相反)這個(gè)時(shí)候w3c來了,為了能規(guī)范規(guī)定,直接取折中,當(dāng)事件發(fā)生時(shí),先發(fā)生向下傳播,當(dāng)?shù)降琢艘院笤俅问褂檬录芭荩饾u的冒泡到頂層window
DOM為一個(gè)完整的樹使用事件傳播輸出hello world
html如下
Hello world 點(diǎn)擊這里
css如下
* { margin:0; padding:0; border:0; } #div1 { width:300px; height:300px; background:#c7e0d9; position:relative; } #div2 { width:100px; height:100px; background:#8ac3d8; position:absolute; left:0; top:0; right:0; bottom:0; margin:auto; text-align:center; line-height:100px; }
顯示的效果如下
下面書寫js
先使用冒泡
// 獲取元素 var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); var div3 = document.getElementById("div3"); // 綁定事件 // 當(dāng)單擊外部方框的時(shí)候 div1.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是外框!"); }, false); div2.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是內(nèi)框"); }, false); div3.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是文字"); }, false);
當(dāng)為false的時(shí)候?yàn)槊芭荨7駝t為事件傳播
冒泡為上,事件傳播為下,事件傳播優(yōu)于事件冒泡
可以明確的知道,此時(shí)為false為冒泡,即全部向上傳播,這個(gè)比較簡單不在闡述
阻止進(jìn)一步冒泡// 獲取元素 var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); var div3 = document.getElementById("div3"); // 綁定事件 // 當(dāng)單擊外部方框的時(shí)候 div1.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是外框!"); }, false); div2.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是內(nèi)框"); event.stopPropagation(); // 阻止該事件進(jìn)一步傳播 }, false); div3.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是文字"); }, false);
js如上,在div2內(nèi)部使用event.stopPropagation()阻止進(jìn)一步冒泡
結(jié)果如下
可以看到明顯的被阻擋
傳播方向更冒泡相反,為向下,且傳播優(yōu)先于冒泡
并且事件先進(jìn)行向上傳,直到遇到設(shè)置為冒泡的元素的時(shí)候,停止向上傳,開始進(jìn)行從上到下的捕獲,先最外層捕獲,然后逐層捕獲,直到完成。
// 獲取元素 var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); var div3 = document.getElementById("div3"); // 綁定事件 // 當(dāng)單擊外部方框的時(shí)候 div1.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是外框!"); }, true); div2.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是內(nèi)框"); }, true); div3.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是文字"); }, true);傳播優(yōu)先于冒泡
js如下
// 獲取元素 var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); var div3 = document.getElementById("div3"); // 綁定事件 // 當(dāng)單擊外部方框的時(shí)候 div1.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是外框!"); }, false); div2.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是內(nèi)框"); }, true); div3.addEventListener("click", () => { alert("hello world! 你點(diǎn)擊的是文字"); }, true);
演示
ps: 最近在寫gitchat 有點(diǎn)慢
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96888.html
摘要:然而和分別提出了完全相反的的概念事件冒泡和事件捕獲。所有的節(jié)點(diǎn)中包含了這兩個(gè)方法,它們都接受個(gè)參數(shù)要處理的事件名作為事件處理程序的函數(shù)和一個(gè)布爾值。事件流級(jí)事件規(guī)定的事件流包括三個(gè)階段事件捕獲階段處于目標(biāo)階段事件冒泡階段。 事件流描述的是從頁面中接受事件的順序。然而ie和netscape分別提出了完全相反的的概念:事件冒泡和事件捕獲。下面就說說這兩種事件流: 事件冒泡 事件冒泡,就是說...
摘要:然而和分別提出了完全相反的的概念事件冒泡和事件捕獲。所有的節(jié)點(diǎn)中包含了這兩個(gè)方法,它們都接受個(gè)參數(shù)要處理的事件名作為事件處理程序的函數(shù)和一個(gè)布爾值。事件流級(jí)事件規(guī)定的事件流包括三個(gè)階段事件捕獲階段處于目標(biāo)階段事件冒泡階段。 事件流描述的是從頁面中接受事件的順序。然而ie和netscape分別提出了完全相反的的概念:事件冒泡和事件捕獲。下面就說說這兩種事件流: 事件冒泡 事件冒泡,就是說...
摘要:目標(biāo)階段真正點(diǎn)擊的元素的事件發(fā)生了兩次,因?yàn)樵谏厦娴拇a中,既在捕獲階段綁定了事件,又在冒泡階段綁定了事件,所以發(fā)生了兩次。所以很明顯用直接綁定的事件發(fā)生在了冒泡階段。 如果對(duì)事件大概了解,可能知道有事件冒泡這回事,但是冒泡、捕獲、傳播這些機(jī)制可能還沒有深入的研究實(shí)踐一下,我抽時(shí)間整理了一下相關(guān)的知識(shí)。 本文主要對(duì)事件機(jī)制一些細(xì)節(jié)進(jìn)行討論,過于基礎(chǔ)的事件綁定知識(shí)方法沒有介紹。 特別少...
摘要:上個(gè)星期在微博中一個(gè)關(guān)于捕獲和冒泡代碼的討論,可能沒有動(dòng)手實(shí)現(xiàn)一篇的人無法給出確定的答案。目標(biāo)階段事件對(duì)象到達(dá)其事件目標(biāo)。在此階段注冊(cè)的事件監(jiān)聽器會(huì)對(duì)相應(yīng)的冒泡事件進(jìn)行處理。 上個(gè)星期在微博中一個(gè)關(guān)于javascript捕獲和冒泡代碼的討論,可能沒有動(dòng)手實(shí)現(xiàn)一篇的人無法給出確定的答案。 這里再來回顧一下之前的三條微博。 事件的執(zhí)行順序 JavaScript冒泡和捕獲考察題目看圖回答問題...
摘要:三事件流規(guī)定事件包括三個(gè)階段,事件捕獲,處于目標(biāo)階段事件冒泡。一起來看添加新增加的,點(diǎn)擊發(fā)現(xiàn)沒有反應(yīng),說明事件沒有綁定進(jìn)去,但是我們也并不想,每增加一個(gè)新元素,就為這個(gè)新元素綁定事件,重復(fù)低效率的工作應(yīng)當(dāng)避免去做。 本文共 1960 字,讀完只需 8 分鐘 事件 用戶與網(wǎng)頁交互是通過事件實(shí)現(xiàn)的,事件剛開始是作為分擔(dān)服務(wù)器負(fù)載的一個(gè)手段,起初沒有統(tǒng)一的規(guī)范,直到 DOM2 級(jí),網(wǎng)景和 I...
閱讀 3250·2023-04-25 22:47
閱讀 3765·2021-10-11 10:59
閱讀 2300·2021-09-07 10:12
閱讀 4243·2021-08-11 11:15
閱讀 3432·2019-08-30 13:15
閱讀 1750·2019-08-30 13:00
閱讀 968·2019-08-29 14:02
閱讀 1680·2019-08-26 13:57