日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript 事件代理需要注意的地方

瀏覽:196日期:2023-10-15 08:54:25

我們知道,如果給 form 里面的 button 元素綁定事件,需要考慮它是否會觸發 form 的 submit 行為。除此之外,其它場合給 button 元素綁定事件,你幾乎不用擔心這個事件會有什么非預期的附加效果,很自然地會這樣寫事件處理代碼:

var button = document.querySelector(’button’)button.addEventListener(’click’, function (e) { console.log(’點擊了按鈕’)})

你之所以放心這么寫,是因為這個 button 元素沒有使用事件代理,即沒有代理任何子元素的事件。

事件代理的意思是,你要為一個元素綁定事件,但你不是直接把事件綁定到這個元素自己身上,而是綁定到這個元素的父元素上。當子元素的某個事件(比如點擊事件)觸發時,它的父元素相同的事件也會觸發(我們常說的事件冒泡),此時我們說父元素代理了子元素的事件。

舉個例子,比如一個 button 元素中包含一個齒輪圖標:

<button> <svg> <use xlink:href='http://www.b3g6.com/bcjs/16526.html#gear' rel='external nofollow' ></use> </svg></button>

當用戶點擊齒輪圖標,必然要觸發 click 事件,但你并不會直接綁定事件到 svg 或 use 元素上,而是綁定到它們的父元素 button 上。即:

document.querySelector(’button’).addEventListener(’click’, function (e) { console.log(’點擊了按鈕’)})

這種情況,我們可以說,button 元素代理了它的所有子元素的 click 事件。

但是,出現這種事件代理的情況時,我們就得小心了。

為了更直觀地說明問題,我們把“父”元素上升到頂層的 document 元素:

document.documentElement.addEventListener(’click’, function (e) { console.log(’我被點擊了’)})

只要網頁中任意一個位置被點擊了,都會觸發綁定在 document 元素上的點擊事件。​ 想要知道事件具體是發生在哪個元素上面,可以通過事件對象提供的 target 屬性來判斷。

document.documentElement.addEventListener(’click’, function (e) { console.log(e.target)})

我們很容易知道事件具體是發生在哪個元素身上的。于是在上面的示例中,如果父元素 document 想在按鈕被點擊時做點什么事情,我們很自然地會這么寫:

document.documentElement.addEventListener(’click’, function (e) { if (e.target.tagName === ’BUTTON’) { console.log(’按鈕被點擊了’) }})

這時問題就出現了,按鈕即使被點擊了 if 條件也不一定成立,即也不一定會輸出“按鈕被點擊了”。因為用戶在按鈕上的某個位置點擊了,根據用戶點擊的位置,e.target 可能是下面三種情況:

BUTTON 元素 SVG 元素 USE 元素

實際的情況是這樣的:

JavaScript 事件代理需要注意的地方

我們真正的意圖是,只要點擊是發生在按鈕上面,不論是按鈕的哪個位置,我們都應視為按鈕被點擊了。 嗯,簡單,我們再改一下,這樣寫:

document.documentElement.addEventListener(’click’, function (e) { if ([’BUTTON’, ’SVG’, ’USE’].includes(e.target.tagName.toUpperCase())) { // 點擊的是按鈕 }})

這樣似乎沒什么問題,也確實可以達到目的,但看上去總是有些別扭。因為這種情況對于最上層的 document 來說,得知道每個子元素的情況,本來我只需要關心離我最近的 button 元素就可以了。

根據 OOP 對內封裝的思想,button 元素內部的事情應該在內部消化掉,其子元素對外不可見,應該只暴露 button 元素本身。依據這個思想和事件冒泡的特點,我們就有了比較好的解決辦法:只需要禁止 button 內部元素的事件響應(包括事件冒泡)而只允許 button 元素本身的事件發生就行。有兩種方式可以實現這個目的。

一種是使用 CSS 禁止 button 內部元素的事件響應:

button > * { pointer-events: none;}

另一種是使用 JS 來阻止 button 內部元素的事件響應(包括事件冒泡):

document.querySelector(’button > svg’).addEventListener(’click’, function (e) { e.stopPropagation() e.preventDefault()})document.querySelector(’button’).addEventListener(’click’, function (e) { console.log(e.target.tagName)})

這兩種方式都能達到我們預期的效果:

JavaScript 事件代理需要注意的地方

綜上,針對特定元素進行事件處理時,如果該元素有事件代理的情況,就要小心處理它所代理的子元素。

以上就是JavaScript 事件代理需要注意的地方的詳細內容,更多關于JavaScript 事件代理的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品网在线观看| 综合激情视频| 在线综合欧美| 欧美日韩在线网站| 久久99国产精品视频| 亚洲精品乱码| 午夜在线视频一区二区区别| 91精品啪在线观看国产18| 欧美极品中文字幕| 国产乱人伦丫前精品视频| 涩涩涩久久久成人精品| 欧美99久久| 久久在线电影| 婷婷国产精品| 水野朝阳av一区二区三区| 好吊日精品视频| 亚洲一区亚洲| 红桃视频亚洲| 91久久中文| 一级成人国产| 国产免费av一区二区三区| 国产精品二区影院| 日本一区二区高清不卡| 在线视频精品| 四虎精品永久免费| 国产精品调教| 国产欧美日韩精品一区二区三区 | 91精品国产自产精品男人的天堂| 丝袜美腿亚洲一区| 一区二区三区网站| 日本aⅴ亚洲精品中文乱码| 日本欧美一区二区| 丰满少妇一区| 欧美va天堂| 亚洲人亚洲人色久| 7777精品| 91精品蜜臀一区二区三区在线| 香蕉视频成人在线观看| 国产精品玖玖玖在线资源| 97精品一区二区| 婷婷综合网站| 亚洲精品88| 久久国际精品| 日av在线不卡| 欧美性感美女一区二区| 国产精品久久国产愉拍| 丝袜亚洲另类欧美| 欧美精品资源| 国产精选久久| 中文字幕一区二区三区在线视频| 日韩精品1区| 麻豆精品av| 欧美久久香蕉| 蜜桃视频在线观看一区| 伊人国产精品| 日韩av三区| 日韩avvvv在线播放| 久久av免费| 不卡在线一区二区| 欧美日韩亚洲在线观看| 精品午夜久久| 精品免费视频| 精品免费视频| 精品亚洲精品| 日韩深夜视频| 亚洲精品永久免费视频| av日韩中文| 蜜臀久久99精品久久一区二区| 欧美日韩色图| a日韩av网址| 激情国产在线| 久久精品主播| 欧美+日本+国产+在线a∨观看| 欧美成人基地| 亚洲v在线看| 亚洲中字黄色| 欧美自拍一区| 日本精品黄色| 欧美国产免费| 欧美韩一区二区| 日韩在线观看不卡| 午夜在线精品| 国产极品模特精品一二| 精品资源在线| 精品一区视频| 免费视频亚洲| 日本国产亚洲| 九九九精品视频| 婷婷综合激情| 亚洲免费中文| 日韩亚洲精品在线观看| 国产精品久久久久久妇女| 亚洲三级欧美| 视频一区视频二区中文字幕| 国产欧美一级| 亚洲精品小说| 国产精品国码视频| 欧美+日本+国产+在线a∨观看| 中文字幕亚洲精品乱码| 国产日韩欧美一区二区三区在线观看 | 久久国产日本精品| 亚洲二区精品| 91成人小视频| 黄色成人在线网址| 欧美精品成人| 国产精品婷婷| 国产不卡人人| 无码日韩精品一区二区免费| 日本免费一区二区三区四区| 精品91久久久久| www.51av欧美视频| 亚洲九九精品| 精品中文字幕一区二区三区av| 欧美午夜三级| 天堂av在线一区| 欧美91视频| 久久国产电影| 麻豆精品久久| 97久久亚洲| 日本亚洲视频| 只有精品亚洲| 最新国产精品久久久| 美女被久久久| 丝袜国产日韩另类美女| 亚洲性色av| 免费亚洲一区| 日本不卡的三区四区五区| 精品国模一区二区三区| 麻豆成人91精品二区三区| 欧美日本三区| 国产欧美日本| 国产亚洲毛片在线| 亚洲深夜影院| 五月天久久网站| 黑人精品一区| 成人欧美一区二区三区的电影| 国产欧美日韩一区二区三区四区 | 日韩免费精品| 伊人久久亚洲美女图片| 中文在线资源| а√天堂中文在线资源8| 狠狠久久伊人中文字幕| 精品久久99| 国产精品多人| 福利精品在线| 热三久草你在线| 精品一区二区三区中文字幕| 精品伊人久久久| 欧美日一区二区三区在线观看国产免 | bbw在线视频| 精品一区视频| 精品一区二区三区四区五区| 国产午夜一区| 国产精品一区三区在线观看| 日韩av不卡在线观看| 欧美私人啪啪vps| 国产精品对白久久久久粗| 欧美日韩91| 精品三区视频| 欧美久久天堂| 香蕉国产精品| 国产精品嫩草99av在线| 欧美一区二区三区激情视频| 在线日韩av| 欧美日韩激情| 三级欧美韩日大片在线看| 日韩专区一卡二卡| 国产欧美三级| 美腿丝袜在线亚洲一区| 黑人精品一区| 欧美日韩精品免费观看视频完整 | 一本色道精品久久一区二区三区| 国内精品福利| 日韩欧美中文字幕一区二区三区| 日韩和欧美一区二区三区| 日韩精品视频一区二区三区| 国产欧美另类| 91精品蜜臀一区二区三区在线 | 亚洲欧洲av| 国产午夜一区| 色吊丝一区二区| 亚洲精品影院在线观看| 国产一二在线播放| 丝瓜av网站精品一区二区| 国产精品视频首页| a天堂资源在线| 国产精品7m凸凹视频分类| 国产精品1区在线| 免费不卡中文字幕在线| 91欧美极品| 激情欧美一区| 九九99久久精品在免费线bt| 老色鬼久久亚洲一区二区| 国产aⅴ精品一区二区四区| 久久国产高清| 日韩啪啪电影网| 欧美精品91| 91亚洲精品视频在线观看| 免费av一区| 日韩毛片视频|