摘要:事件冒泡和傳播舉栗子事件輸出事件有兩種,一種為事件傳播,一種是事件冒泡事件傳播和事件冒泡這還要從遙遠的荒誕說起,兩家網(wǎng)景和,為了能爭奪市場,互相使用相反的技術,當網(wǎng)景使用事件傳播的時候,使用事件冒泡。
事件冒泡和傳播
舉栗子
事件輸出hello world
事件有兩種,一種為事件傳播,一種是事件冒泡
這還要從遙遠的荒誕說起,兩家網(wǎng)景和ie,為了能爭奪市場,互相使用相反的技術,當網(wǎng)景使用事件傳播的時候,ie使用事件冒泡。(兩個正好相反)這個時候w3c來了,為了能規(guī)范規(guī)定,直接取折中,當事件發(fā)生時,先發(fā)生向下傳播,當?shù)降琢艘院笤俅问褂檬录芭荩饾u的冒泡到頂層window
DOM為一個完整的樹使用事件傳播輸出hello world
html如下
Hello world 點擊這里
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"); // 綁定事件 // 當單擊外部方框的時候 div1.addEventListener("click", () => { alert("hello world! 你點擊的是外框!"); }, false); div2.addEventListener("click", () => { alert("hello world! 你點擊的是內框"); }, false); div3.addEventListener("click", () => { alert("hello world! 你點擊的是文字"); }, false);
當為false的時候為冒泡。否則為事件傳播
冒泡為上,事件傳播為下,事件傳播優(yōu)于事件冒泡
可以明確的知道,此時為false為冒泡,即全部向上傳播,這個比較簡單不在闡述
阻止進一步冒泡// 獲取元素 var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); var div3 = document.getElementById("div3"); // 綁定事件 // 當單擊外部方框的時候 div1.addEventListener("click", () => { alert("hello world! 你點擊的是外框!"); }, false); div2.addEventListener("click", () => { alert("hello world! 你點擊的是內框"); event.stopPropagation(); // 阻止該事件進一步傳播 }, false); div3.addEventListener("click", () => { alert("hello world! 你點擊的是文字"); }, false);
js如上,在div2內部使用event.stopPropagation()阻止進一步冒泡
結果如下
可以看到明顯的被阻擋
傳播方向更冒泡相反,為向下,且傳播優(yōu)先于冒泡
并且事件先進行向上傳,直到遇到設置為冒泡的元素的時候,停止向上傳,開始進行從上到下的捕獲,先最外層捕獲,然后逐層捕獲,直到完成。
// 獲取元素 var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); var div3 = document.getElementById("div3"); // 綁定事件 // 當單擊外部方框的時候 div1.addEventListener("click", () => { alert("hello world! 你點擊的是外框!"); }, true); div2.addEventListener("click", () => { alert("hello world! 你點擊的是內框"); }, true); div3.addEventListener("click", () => { alert("hello world! 你點擊的是文字"); }, true);傳播優(yōu)先于冒泡
js如下
// 獲取元素 var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); var div3 = document.getElementById("div3"); // 綁定事件 // 當單擊外部方框的時候 div1.addEventListener("click", () => { alert("hello world! 你點擊的是外框!"); }, false); div2.addEventListener("click", () => { alert("hello world! 你點擊的是內框"); }, true); div3.addEventListener("click", () => { alert("hello world! 你點擊的是文字"); }, true);
演示
ps: 最近在寫gitchat 有點慢
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/96888.html
摘要:然而和分別提出了完全相反的的概念事件冒泡和事件捕獲。所有的節(jié)點中包含了這兩個方法,它們都接受個參數(shù)要處理的事件名作為事件處理程序的函數(shù)和一個布爾值。事件流級事件規(guī)定的事件流包括三個階段事件捕獲階段處于目標階段事件冒泡階段。 事件流描述的是從頁面中接受事件的順序。然而ie和netscape分別提出了完全相反的的概念:事件冒泡和事件捕獲。下面就說說這兩種事件流: 事件冒泡 事件冒泡,就是說...
摘要:然而和分別提出了完全相反的的概念事件冒泡和事件捕獲。所有的節(jié)點中包含了這兩個方法,它們都接受個參數(shù)要處理的事件名作為事件處理程序的函數(shù)和一個布爾值。事件流級事件規(guī)定的事件流包括三個階段事件捕獲階段處于目標階段事件冒泡階段。 事件流描述的是從頁面中接受事件的順序。然而ie和netscape分別提出了完全相反的的概念:事件冒泡和事件捕獲。下面就說說這兩種事件流: 事件冒泡 事件冒泡,就是說...
摘要:目標階段真正點擊的元素的事件發(fā)生了兩次,因為在上面的代碼中,既在捕獲階段綁定了事件,又在冒泡階段綁定了事件,所以發(fā)生了兩次。所以很明顯用直接綁定的事件發(fā)生在了冒泡階段。 如果對事件大概了解,可能知道有事件冒泡這回事,但是冒泡、捕獲、傳播這些機制可能還沒有深入的研究實踐一下,我抽時間整理了一下相關的知識。 本文主要對事件機制一些細節(jié)進行討論,過于基礎的事件綁定知識方法沒有介紹。 特別少...
摘要:上個星期在微博中一個關于捕獲和冒泡代碼的討論,可能沒有動手實現(xiàn)一篇的人無法給出確定的答案。目標階段事件對象到達其事件目標。在此階段注冊的事件監(jiān)聽器會對相應的冒泡事件進行處理。 上個星期在微博中一個關于javascript捕獲和冒泡代碼的討論,可能沒有動手實現(xiàn)一篇的人無法給出確定的答案。 這里再來回顧一下之前的三條微博。 事件的執(zhí)行順序 JavaScript冒泡和捕獲考察題目看圖回答問題...
閱讀 3438·2023-04-25 22:47
閱讀 4078·2021-10-11 10:59
閱讀 2393·2021-09-07 10:12
閱讀 4434·2021-08-11 11:15
閱讀 3529·2019-08-30 13:15
閱讀 1830·2019-08-30 13:00
閱讀 1059·2019-08-29 14:02
閱讀 1774·2019-08-26 13:57