摘要:之前總結(jié)了事件捕獲和冒泡以及阻止事件傳播,今天寫一下事件代理方面的總結(jié)事件之捕獲冒泡阻止事件傳播事件代理監(jiān)聽列表中多項(xiàng)時(shí),實(shí)現(xiàn)點(diǎn)擊控制臺(tái)打印對(duì)應(yīng)文本,如下蘋果香蕉葡萄首先想到的對(duì)每一個(gè)進(jìn)行監(jiān)聽或者使用和的區(qū)別是屬性,是方法。
之前總結(jié)了事件捕獲和冒泡以及阻止事件傳播,今天寫一下事件代理方面的總結(jié)
DOM 事件之捕獲、冒泡:
阻止事件傳播:
監(jiān)聽列表中多項(xiàng) li 時(shí),實(shí)現(xiàn)點(diǎn)擊 li 控制臺(tái)打印對(duì)應(yīng)文本,如下:
首先想到的對(duì)每一個(gè) li 進(jìn)行監(jiān)聽
let ct = document.querySelector(".ct") for(let i = 0; i < ct.children.length; i++){ ct.children[i].onclick = function(e){ console.log(e.target.textContent) } }
或者
let ct = document.querySelector(".ct") for(let i = 0; i < ct.children.length; i++){ ct.children[i].addEventListener("click",function(e){ console.log(e.target.textContent) }) }
使用onclick和addEventListener的區(qū)別:onclick是屬性,addEventListener是方法。
簡(jiǎn)單來(lái)說(shuō),如果使用onclick,如果此元素需要同時(shí)添加多個(gè)onclick事件,那么之前的onclick會(huì)被覆蓋,而使用addEventListener添加的事件相當(dāng)于調(diào)用它,并傳遞相應(yīng)的參數(shù)。
如果此時(shí) li 是動(dòng)態(tài)生成的,每一個(gè)li 都要給它添加監(jiān)聽器,監(jiān)聽器多了會(huì)特別占內(nèi)存,從而影響性能,這里最好的方式是使用事件代理。
舉個(gè)簡(jiǎn)單的例子:大學(xué)宿舍同學(xué),買的快遞都到了,這時(shí)有兩種方法,一種是每個(gè)人都去取自己的快遞,另一種方法是大家找一個(gè)同學(xué),讓他統(tǒng)一去取快遞,然后在發(fā)給每一個(gè)同學(xué)。
這里取快遞就是一個(gè)事件,第一種方法就是相當(dāng)于給每個(gè)元素添加事件,第二種方法統(tǒng)一去取快遞的同學(xué)就是代理元素。
使用事件代理來(lái)實(shí)現(xiàn)它,監(jiān)聽的元素應(yīng)該是這些元素的父元素,當(dāng)我點(diǎn)擊父元素內(nèi)的元素時(shí),父元素都會(huì)得到響應(yīng),并分發(fā)相應(yīng)的事件。e.target就是點(diǎn)擊的元素。
let ct = document.querySelector(".ct") ct.addEventListener("click", function(e) { console.log(e.target.textContent) })
用事件代理操作一些比較復(fù)雜的事情,比如下面代碼,當(dāng)我點(diǎn)擊開頭添加,則在
這里事件代理元素是content,如按照上面的方法,給每個(gè)子元素分發(fā)事件,那么當(dāng)我點(diǎn)擊input時(shí),也會(huì)觸發(fā)click事件,這就偏離了我們的需求。所以這里需要做一個(gè)判斷,只有點(diǎn)開頭添加或者結(jié)尾添加才能添加到相應(yīng)的位置,點(diǎn)其他地方一律不操作。
在這里需要注意e.currentTarget和e.target的區(qū)別:
e.currentTarget:添加事件的元素
e.target:執(zhí)行事件的元素
大部分事件中這兩者沒(méi)什么區(qū)別,但在click事件中,如果使用事件代理,這兩個(gè)指向的就不是同一個(gè)元素。
let ct = document.querySelector(".ct") let addContent = document.querySelector(".ipt-add-content") let content = document.querySelector(".content") content.addEventListener("click", function(e) { let li = document.createElement("li") li.textContent = addContent.value if(e.target.textContent === "開頭添加"){ //只有點(diǎn)"開頭添加"才執(zhí)行 ct.insertBefore(li,ct.firstChild) }else if(e.target.textContent === "結(jié)尾添加"){//只有點(diǎn)"結(jié)尾添加"才執(zhí)行 ct.appendChild(li) } })常用的 HTML 事件 鼠標(biāo)事件
mousedown:鼠標(biāo)按下觸發(fā),其中button屬性監(jiān)測(cè)鼠標(biāo)按下哪個(gè)鍵:0是鼠標(biāo)左鍵,1鼠標(biāo)中間的滾輪,2鼠標(biāo)右鍵。
mouseup:鼠標(biāo)松開觸發(fā),其中button屬性監(jiān)測(cè)鼠標(biāo)按下哪個(gè)鍵:0是鼠標(biāo)左鍵,1鼠標(biāo)中間的滾輪,2鼠標(biāo)右鍵。
mousemove:鼠標(biāo)移動(dòng)觸發(fā)
click:點(diǎn)擊事件
dblclick:雙擊事件
mousewheel:鼠標(biāo)滾動(dòng)事件,wheelDelta可以判定鼠標(biāo)滾動(dòng)方向,180 向上滾動(dòng),-180 向下滾動(dòng)
mouseover:鼠標(biāo)進(jìn)入觸發(fā),會(huì)冒泡,如果監(jiān)聽的是父元素,鼠標(biāo)移入到父元素內(nèi)的子元素也會(huì)觸發(fā)
mouseout:鼠標(biāo)離開觸發(fā),會(huì)冒泡,如果監(jiān)聽的是父元素,鼠標(biāo)從父元素內(nèi)的子元素移出也會(huì)觸發(fā)
movseenter:鼠標(biāo)進(jìn)入觸發(fā),不會(huì)冒泡
mouseleave:鼠標(biāo)離開觸發(fā),不會(huì)冒泡
注:
clientX,clientY客戶端坐標(biāo)位置,當(dāng)事件發(fā)生時(shí),鼠標(biāo)的位置
pageX,pageY頁(yè)面坐標(biāo)位置,發(fā)生事件的頁(yè)面坐標(biāo)
screenX,screenY事件發(fā)生時(shí)相對(duì)屏幕的坐標(biāo)
修改鍵:shift、ctrl、alt、win對(duì)應(yīng)的修改鍵狀態(tài)shiftKey、ctrlKey、altKey、metaKey,他們是布爾值,按下為true,松開為false。
觸摸事件touchstart:手指點(diǎn)擊觸發(fā),點(diǎn)擊坐標(biāo)在touches[0]里面,因?yàn)槭謾C(jī)支持多點(diǎn)觸控
touchend:手指離開觸發(fā),同上
touchmove:手指移動(dòng)觸發(fā),同上
keydown:鍵盤上按下任意鍵觸發(fā),按住不放會(huì)重復(fù)觸發(fā),文本框變化之前觸發(fā)
keyup:鍵盤上釋放任意鍵觸發(fā)
keypress:鍵盤上按下任意字符鍵觸發(fā),按住不放會(huì)重復(fù)觸發(fā),文本框變化之前觸發(fā)
注:
textInput和keypress類似,書上說(shuō)textInput只能在可編輯區(qū)域觸發(fā),只能按下有效字鍵才能觸發(fā)(enter鍵無(wú)法觸發(fā),ctrl+v可以觸發(fā)),keypress按下任何影響文本顯示的鍵都會(huì)觸發(fā)(enter鍵可以觸發(fā),ctrl+v無(wú)法觸發(fā)),但我操作下來(lái),發(fā)現(xiàn)這兩者并沒(méi)有什么區(qū)別。
location屬性4表示設(shè)備鍵盤
頁(yè)面相關(guān)事件:load:加載完成時(shí)觸發(fā)
move:瀏覽器窗口被移動(dòng)時(shí)觸發(fā)
resize:瀏覽器的窗口大小被改變時(shí)觸發(fā)
scroll:滾動(dòng)條位置發(fā)生變化時(shí)觸發(fā)
blur:元素失去焦點(diǎn)時(shí)觸發(fā)
change:元素失去焦點(diǎn)且元素內(nèi)容發(fā)生改變時(shí)觸發(fā)
focus:元素獲得焦點(diǎn)時(shí)觸發(fā)
reset:表單中reset屬性被激活時(shí)觸發(fā)
submit:表單被提交時(shí)觸發(fā)
input:在input元素內(nèi)容修改后立即被觸發(fā)
beforecopy:當(dāng)頁(yè)面當(dāng)前的被選擇內(nèi)容將要復(fù)制到瀏覽者系統(tǒng)的剪貼板前觸發(fā)此事件
beforecut:當(dāng)頁(yè)面中的一部分或者全部的內(nèi)容將被移離當(dāng)前頁(yè)面(剪貼)并移動(dòng)到瀏覽者的系統(tǒng)剪貼板時(shí)觸發(fā)此事件
beforeeditfocus:當(dāng)前元素將要進(jìn)入編輯狀態(tài)
beforepaste:內(nèi)容將要從瀏覽者的系統(tǒng)剪貼板傳送(粘貼)到頁(yè)面中時(shí)觸發(fā)此事件
beforeupdate:當(dāng)瀏覽者粘貼系統(tǒng)剪貼板中的內(nèi)容時(shí)通知目標(biāo)對(duì)象
contextmenu:當(dāng)瀏覽者按下鼠標(biāo)右鍵出現(xiàn)菜單時(shí)或者通過(guò)鍵盤的按鍵觸發(fā)頁(yè)面菜單時(shí)觸發(fā)的事件
copy:當(dāng)頁(yè)面當(dāng)前的被選擇內(nèi)容被復(fù)制后觸發(fā)此事件
cut:當(dāng)頁(yè)面當(dāng)前的被選擇內(nèi)容被剪切時(shí)觸發(fā)此事件
losecapture:當(dāng)元素失去鼠標(biāo)移動(dòng)所形成的選擇焦點(diǎn)時(shí)觸發(fā)此事件
paste:當(dāng)內(nèi)容被粘貼時(shí)觸發(fā)此事件
select:當(dāng)文本內(nèi)容被選擇時(shí)的事件
selectstart:當(dāng)文本內(nèi)容選擇將開始發(fā)生時(shí)觸發(fā)的事件
drag:當(dāng)某個(gè)對(duì)象被拖動(dòng)時(shí)觸發(fā)此事件 (活動(dòng)事件)
dragdrop:一個(gè)外部對(duì)象被鼠標(biāo)拖進(jìn)當(dāng)前窗口時(shí)觸發(fā)
dragend:當(dāng)鼠標(biāo)拖動(dòng)結(jié)束時(shí)觸發(fā)此事件
dragenter:當(dāng)對(duì)象被鼠標(biāo)拖動(dòng)的對(duì)象進(jìn)入其容器范圍內(nèi)時(shí)觸發(fā)此事件
dragleave:當(dāng)對(duì)象被鼠標(biāo)拖動(dòng)的對(duì)象離開其容器范圍內(nèi)時(shí)觸發(fā)此事件
dragover:當(dāng)某被拖動(dòng)的對(duì)象在另一對(duì)象容器范圍內(nèi)拖動(dòng)時(shí)觸發(fā)此事件
dragstart:當(dāng)某對(duì)象將被拖動(dòng)時(shí)觸發(fā)此事件
drop:在一個(gè)拖動(dòng)過(guò)程中,釋放鼠標(biāo)鍵時(shí)觸發(fā)此事件
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96845.html
摘要:接受個(gè)參數(shù)事件類型,是否冒泡,是否阻止瀏覽器的默認(rèn)行為觸發(fā)上綁定的自定義事件觸發(fā)元素上綁定事件事件的委托代理的原理以及優(yōu)缺點(diǎn)。委托代理事件是那些被綁定到父級(jí)元素的事件,但是只有當(dāng)滿足一定匹配條件時(shí)才會(huì)被挪。 一、頁(yè)面布局 1.問(wèn)題:假設(shè)高度已知,請(qǐng)寫出三欄布局 ,其中左欄、右欄寬度各為300px,中間自適應(yīng)。 解決方案一:使用浮動(dòng)布局` Document ...
摘要:接受個(gè)參數(shù)事件類型,是否冒泡,是否阻止瀏覽器的默認(rèn)行為觸發(fā)上綁定的自定義事件觸發(fā)元素上綁定事件事件的委托代理的原理以及優(yōu)缺點(diǎn)。委托代理事件是那些被綁定到父級(jí)元素的事件,但是只有當(dāng)滿足一定匹配條件時(shí)才會(huì)被挪。 一、頁(yè)面布局 1.問(wèn)題:假設(shè)高度已知,請(qǐng)寫出三欄布局 ,其中左欄、右欄寬度各為300px,中間自適應(yīng)。 解決方案一:使用浮動(dòng)布局` Document ...
摘要:接受個(gè)參數(shù)事件類型,是否冒泡,是否阻止瀏覽器的默認(rèn)行為觸發(fā)上綁定的自定義事件觸發(fā)元素上綁定事件事件的委托代理的原理以及優(yōu)缺點(diǎn)。委托代理事件是那些被綁定到父級(jí)元素的事件,但是只有當(dāng)滿足一定匹配條件時(shí)才會(huì)被挪。 一、頁(yè)面布局 1.問(wèn)題:假設(shè)高度已知,請(qǐng)寫出三欄布局 ,其中左欄、右欄寬度各為300px,中間自適應(yīng)。 解決方案一:使用浮動(dòng)布局` Document ...
摘要:異步編程,不同于同步編程的請(qǐng)求響應(yīng)模式,其是一種事件驅(qū)動(dòng)編程,請(qǐng)求調(diào)用函數(shù)或方法后,無(wú)需立即等待響應(yīng),可以繼續(xù)執(zhí)行其他任務(wù),而之前任務(wù)響應(yīng)返回后可以通過(guò)狀態(tài)通知和回調(diào)來(lái)通知調(diào)用者。 異步與單線程知識(shí)點(diǎn): 什么是異步(對(duì)比同步) 同步:一行一行按順序依次執(zhí)行代碼,當(dāng)前代碼任務(wù)耗時(shí)執(zhí)行會(huì)阻塞后續(xù)代碼的執(zhí)行。這是一種典型的請(qǐng)求-響應(yīng)模型,當(dāng)請(qǐng)求調(diào)用一個(gè)函數(shù)或方法后,需等待其響應(yīng)返回,然后執(zhí)...
摘要:案例說(shuō)明使用原生完成桌面操作級(jí)應(yīng)用,對(duì)于原生的掌握情況而言,是一個(gè)較為全面的綜合型案例。本次課從事件相關(guān)的功能入手,給大家?guī)?lái)詳細(xì)的分享。 showImg(https://segmentfault.com/img/bVbh1qw); 案例說(shuō)明:使用原生 JS 完成桌面操作級(jí)應(yīng)用,對(duì)于原生 JS 的掌握情況而言,是一個(gè)較為全面的綜合型案例。本次課從事件(event)相關(guān)的功能入手,給大家...
閱讀 2058·2021-11-11 16:54
閱讀 1039·2021-10-12 10:12
閱讀 377·2019-08-30 15:43
閱讀 646·2019-08-29 13:15
閱讀 1075·2019-08-29 13:12
閱讀 1524·2019-08-26 12:09
閱讀 1655·2019-08-26 10:24
閱讀 2250·2019-08-26 10:15