Javascript事件的捕獲方式和冒泡方式詳解
一、事件處理模型
事件冒泡、捕獲:事件冒泡和事件捕獲分別由微軟和網(wǎng)景公司提出,這兩個(gè)概念都是為了解決頁面中事件流(事件發(fā)生順序)的問題。
<div id="d1"> <div id="d2"> <div id="d3"></div> </div> </div>
給出的具有嵌套關(guān)系的三個(gè)div,給三個(gè)元素注冊(cè)相同的事件時(shí),它們的觸發(fā)順序時(shí)怎樣呢?
1、事件冒泡
微軟提出了名為事件冒泡的事件流。結(jié)構(gòu)上(非視覺上)嵌套關(guān)系的元素,會(huì)存在冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)
針對(duì)上面的例子,如果用冒泡方式,觸發(fā)順序應(yīng)該時(shí):d3——>d2——>d1,那么我們來驗(yàn)證一下:
(1)給三個(gè)div元素綁定事件
//1.獲取元素 var d1 = document.querySelector('#d1') var d2 = document.querySelector('#d2') var d3 = document.querySelector('#d3') //2、綁定事件 d1.onclick = function(){ console.log(this.id) } d2.onclick = function(){ console.log(this.id) } d3.onclick = function(){ console.log(this.id) }
(2)運(yùn)行結(jié)果:
單擊紅色區(qū)域:
單擊紫色區(qū)域:
單擊綠色區(qū)域:?
以上就是事件冒泡啦!?
2、事件捕獲
結(jié)構(gòu)上(非視覺上)嵌套關(guān)系的元素,會(huì)存在事件捕獲的功能,即同一事件,自父元素捕獲至子元素(事件源元素)。(自頂向下)(ie沒有捕獲事件)
針對(duì)上面的例子,如果用冒泡方式,觸發(fā)順序應(yīng)該時(shí):d1——>d2——>d3,那么我們來驗(yàn)證一下:
(1)給三個(gè)div元素綁定事件
//1.獲取元素 var d1 = document.querySelector('#d1') var d2 = document.querySelector('#d2') var d3 = document.querySelector('#d3') //2、綁定事件 d1.onclick = function(){ console.log(this.id) } d2.onclick = function(){ console.log(this.id) } d3.onclick = function(){ console.log(this.id) }
(2)運(yùn)行結(jié)果:
單擊紅色區(qū)域:
?
單擊紫色區(qū)域:
單擊綠色區(qū)域:
事件捕獲get!!!?
注意:
- 觸發(fā)順序 :先捕獲,后冒泡
focus
,blur
,change
,submit
,reset
,select
等事件不冒泡
二、阻止事件冒泡
(1)w3c標(biāo)準(zhǔn) event.stopPropagation();但ie9以下版本不支持
//1.獲取元素 var d1 = document.querySelector('#d1') var d2 = document.querySelector('#d2') var d3 = document.querySelector('#d3') //2、綁定事件 d1.onclick = function(){ console.log(this.id) } d2.onclick = function(){ console.log(this.id) } d3.onclick = function(e){ e.stopPropagation(); console.log(this.id) }
會(huì)發(fā)現(xiàn)單擊綠色區(qū)域時(shí)?,沒有依次觸發(fā)外部的事件,事件冒泡被阻止:
(2)ie獨(dú)有:event.cancelBubble = true;
//1.獲取元素 var d1 = document.querySelector('#d1') var d2 = document.querySelector('#d2') var d3 = document.querySelector('#d3') //2、綁定事件 d1.onclick = function(){ console.log(this.id) } d2.onclick = function(){ console.log(this.id) } d3.onclick = function(e){ e.cancelBubble = true; console.log(this.id) }
結(jié)果同(1)。
(3)合并取消:return false
在javascript的return false
只會(huì)阻止默認(rèn)行為,而是用jQuery的話則既阻止默認(rèn)行為又防止對(duì)象冒泡。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JS中mouseover和mouseout多次觸發(fā)問題如何解決
這篇文章主要介紹了JS中mouseover和mouseout多次觸發(fā)問題如何解決的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06JavaScript暫時(shí)性死區(qū)以及函數(shù)作用域
這篇文章主要為大家介紹了JavaScript暫時(shí)性死區(qū)以及函數(shù)作用域示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07詳解js跨域請(qǐng)求的兩種方式,支持post請(qǐng)求
原先一直以為要實(shí)現(xiàn)跨域請(qǐng)求只能用jsonp,只能支持GET請(qǐng)求,后來了解到使用POST請(qǐng)求也可以實(shí)現(xiàn)跨域,但是需要在服務(wù)器增加Access-Control-Allow-Origin和Access-Control-Allow-Headers頭,下面說明下兩個(gè)不同的方法實(shí)現(xiàn)的方式和原理。2018-05-05JS識(shí)別瀏覽器類型(電腦瀏覽器和手機(jī)瀏覽器)
本文給大家分享一段js代碼關(guān)于識(shí)別瀏覽器的類型是手機(jī)瀏覽器還是電腦瀏覽器,有需要的朋友可以參考下本文2016-11-11js兼容pc端瀏覽器并有多種彈出小提示的手機(jī)端浮層控件實(shí)例
這篇文章主要介紹了js兼容pc端瀏覽器并有多種彈出小提示的手機(jī)端浮層控件,實(shí)例分析了javascript多種彈出層效果的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04