版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第深入了解JavaScript中的事件冒泡與捕獲參數(shù)useCapture解析:
重點?。∫粋€事件目標的觸發(fā),整個過程分為兩個階段(捕獲與冒泡)。useCapture這個值決定事件目標的觸發(fā)在哪個階段執(zhí)行。
冒泡與捕獲的順序分析:
從圖可以看出先事件捕獲再事件冒泡。事件捕獲就是從上至下(外部事件先觸發(fā)),事件冒泡就是從下至上(內(nèi)部事件先觸發(fā))。
捕獲的過程是從不具體的到具體的,冒泡是從具體的到不具體的。
雖然是捕獲優(yōu)先,但是冒泡事件是傳遞的默認方式。意思就是事件默認都是在冒泡階段觸發(fā)。
重點??!事件目標的查找分為冒泡與捕獲兩個階段,事件目標觸發(fā)的順序取決于在哪個階段。如果嵌套的元素中既有捕獲又有冒泡的那么一定是捕獲優(yōu)先,捕獲階段的事件執(zhí)行完畢再執(zhí)行冒泡階段的事件。
代碼演示:
body
divid=div1
這是div1
divid=div2
這是div2
divid=div3這是div3/div
/div
/div
script
letdiv1=document.getElementById(div1
letdiv2=document.getElementById(div2
letdiv3=document.getElementById(div3
div1.addEventListener(click,function(){
console.log(這是div1的點擊事件
},false);
div2.addEventListener(click,function(){
console.log(這是div2的點擊事件
},false);
div3.addEventListener(click,function(){
console.log(這是div3的點擊事件
},false);
/script
/body
當我們點擊div3,如下從控制臺結(jié)果可以看出,這里的事件都是在冒泡階段執(zhí)行。
還是點擊div3,我們將div1.addEventListener第三個參數(shù)改為true,如下可以看出div1最先執(zhí)行,說明捕獲階段優(yōu)先于冒泡階段。
這里看完一定要敲一下,我并沒有列舉所有的情況,其余的情況留給你們?nèi)L試再總結(jié)(能理解上面的就夠了,真正編碼不會很復雜)。
如上就是我對事件目標查找的兩種機制冒泡與捕獲理解。
二、事件代理機制(事件委托)
利用事件冒泡完成事件代理機制:
li列表1/li
li列表2/li
/ul
當我們要給如上列表中的li都綁定一個點擊事件點擊獲取li中的內(nèi)容,一般是利用for遍歷元素綁定點擊事件。
letlis=document.querySelectorAll(li
for(leti=0;ilis.length;i++){
lis[i].addEventListener(click,function(){
console.log(this.innerHTML);
}
假如我們有1w個li節(jié)點,使用如上方式就需要綁定1w個事件,這樣操非常影響代碼性能。所以我們可以利用冒泡機制來解決如上的問題,就是將事件綁定到父元素身上ul身上??慈缦麓a:
body
li列表1/li
li列表2/li
/ul
script
letul=document.querySelector(ul
//我們可以通過事件對象(e)中的target屬性可以訪問到事件源(也就事件的觸發(fā)元素)
ul.addEventListener(click,function(e){
console.log(e.target.innerHTML);
},false);
/script
/body
事件對象(e):無論是addEventListener綁定事件還是直接.事件名,事件監(jiān)聽的處理函數(shù)中的第一個參數(shù)為事件對象。事件對象包含了這個事件的詳細信息,比如這個對象中包含了:事件源,事件id,事件類型,事件綁定的元素,事件觸發(fā)時點擊的位置等等。其中e.target就能訪問到事件源,就是觸發(fā)本次事件的源頭。
既然能給父元素綁定事件監(jiān)聽,又能拿到觸發(fā)的源頭。所以我們通過e.target+冒泡機制就可以減少事件的綁定,能提升不少的性能。
依次點擊列表1與列表2:
總結(jié):通過上面代碼我們知道了事件對象+冒泡機制可以實現(xiàn)事件委托。事件委托就是當事件觸發(fā)時,通過事件冒泡(或事件捕獲)把要做的事委托給父元素來處理。
三、e.target與e.currentTarget的區(qū)別:
e.target指向的是觸發(fā)事件監(jiān)聽的對象(事件源)。
e.currentTarget指向添加監(jiān)聽事件的對象(綁定事件的dom元素)。
四、阻止冒泡與捕獲
為什么要阻止冒泡或捕獲?
點擊當前元素時以冒泡的方式傳遞事件如果上級元素綁定了同樣的事件,就會因為冒泡傳遞導致觸發(fā)。同樣捕獲的過程中,也會觸發(fā)與當前元素綁定的相同事件的上級。只是觸發(fā)順序不同。
事件代理一般使用的冒泡,當然阻止冒泡一般不會影響事件代理,因為順序問題只會影響捕獲事件,這也是為什么都使用冒泡實現(xiàn)事件代理機制。
阻止冒泡或捕獲的方法
這里我不考慮兼容性問題,我相信不久將來兼容性可以得到解決。
阻止冒泡w3c推介的方法是event.stopPropagation(),顧名思義停止傳播,他是事件對象(event)的方法,此方法是阻止目標元素的繼續(xù)冒泡(或捕獲)。
event.stopPropagation()阻止冒泡:
body
divid=div1
這是div1
divid=div2
這是div2
divid=div3這是div3/div
/div
/div
script
letdiv1=document.getElementById(div1
letdiv2=document.getElementById(div2
letdiv3=document.getElementById(div3
div1.onclick=function(e){
alert(div1
div2.onclick=function(e){
e.stopPropagation();
alert(div2
div3.onclick=function(e){
alert(div3
/script
/body
上面代碼默認都是冒泡事件,我們點擊div3會依次彈出div3與div2,為什么沒有彈出div1這是因為e.stopPropagation();阻止了目標元素的事件繼續(xù)冒泡到上級。如果每個點擊事件都加上了e.topPropagation就不會出現(xiàn)多彈窗的情況。
event.stopPropagation()阻止捕獲:
body
divid=div1
這是div1
divid=div2
這是div2
divid=div3這是div3/div
/div
/div
script
letdiv1=document.getElementById(div1
letdiv2=document.getElementById(div2
letdiv3=document.getElementById(div3
div1.addEventListener(click,function(e){
console.log(div1
},true);
div2.addEventListener(click,function(e){
console.log(div2
e.stopPropagation();
},true);
div3.addEventListener(click,function(e){
console.log(div3
},true);
/script
/body
當我們點擊div2會依次彈出div1與div2,這也是因為在div2事件中我們設置了e.stopPropagation(),阻塞了目標元素的事件繼續(xù)向下捕獲。
event.target==event.currentTarget:
div.addEventListener(click,function(e){
if(event.target==event.currentTarget){
//需要執(zhí)行的代碼
});
此方法不過多解釋用的不多,如果你理解了上面的內(nèi)容,這個方法也能理解。
五、補充:為什么要使用addEventListener()
從上面代碼不難看出addEventListener()有如下的優(yōu)點(以下是MDN的原話):
addEventListener()是W3CDOM規(guī)范中提供的注冊事件監(jiān)聽器的方法。它的優(yōu)點包括:
它允許給一個事件注冊多個監(jiān)聽器。特別是在使用AJAX庫,JavaScript模塊,或其他需要第三方庫/插件的代碼。
它提供了一種更精細的手段控制listener的觸發(fā)階段。(即可以選擇捕獲或者冒泡)。
它對任何DOM元素都是有效的,而不僅僅只對HTML元素有效。
六、取消默認事件
event.preventDefault()
默認事件指的是ahref=,inputtype=submit標簽這類有默認行為的標簽,通過點擊可以跳轉(zhuǎn)或提交。我們給這類標簽綁定一個點擊事件,設置事件對象的preventDefault()方法就可以阻止默認事件的發(fā)生。
body
ahref=https://www.bAI點擊跳轉(zhuǎn)/a
script
leta=document.querySelector(a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職(汽車檢測與維修)汽車電器檢修階段測試題及答案
- 2025年中職面料塑性(面料處理技術(shù))試題及答案
- 2025年大學船舶機械安裝(船舶機械安裝)試題及答案
- 2025年高職(寵物醫(yī)療技術(shù))寵物寄生蟲病防治試題及答案
- 2025年大學本科(工商管理)運營管理基礎階段測試題及答案
- 2025年高職(自然保護地建設與管理)保護區(qū)運營階段測試試題及答案
- 2025年高職(道路橋梁工程技術(shù))橋梁施工技術(shù)階段測試題及答案
- 2026年福建水利電力職業(yè)技術(shù)學院單招綜合素質(zhì)考試模擬試題帶答案解析
- 2026年安陽學院單招綜合素質(zhì)筆試備考題庫帶答案解析
- 2026年海南工商職業(yè)學院高職單招職業(yè)適應性測試備考試題帶答案解析
- 2026秋招:澳森特鋼集團試題及答案
- 2026年寧夏黃河農(nóng)村商業(yè)銀行科技人員社會招聘備考題庫及答案詳解(易錯題)
- DB37-T4975-2025分布式光伏直采直控技術(shù)規(guī)范
- 脫硫廢水零排放項目施工方案
- 2026年海南衛(wèi)生健康職業(yè)學院單招綜合素質(zhì)考試題庫參考答案詳解
- 消防設施維保服務方案投標文件(技術(shù)方案)
- 濟德高速一駐地辦工地試驗室試驗檢測計劃
- 堵漏施工方案報價
- 電線電纜使用說明書
- 幼兒園小班語言兒歌《大一歲了》課件
- 七年級數(shù)學工程問題單元試卷及答案
評論
0/150
提交評論