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

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

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

瀏覽:200日期: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://m.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在线|亚洲一区二区| 日韩一级网站| 日韩一区精品字幕| 亚洲区欧美区| 欧美日韩网址| 精品中文在线| 欧产日产国产精品视频| 久久久国产精品一区二区中文| 亚洲爱爱视频| 国产精品女主播一区二区三区| 综合五月婷婷| 国产欧美精品久久| 久久香蕉网站| 久久免费国产| 日韩精品一二区| 国产伦理久久久久久妇女| 国产一区二区三区精品在线观看 | 免费人成精品欧美精品| 亚洲午夜免费| 麻豆一区二区在线| 日韩精品水蜜桃| 先锋影音国产一区| 久久激情av| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲久久在线| 国产精品天天看天天狠| 黄毛片在线观看| 国产精品三上| 国产欧美成人| 久久精品成人| 综合欧美亚洲| 精品久久在线| 久久亚洲国产精品一区二区| 欧美国产先锋| 欧美在线网站| 国产精品三p一区二区| 欧美一区二区三区激情视频| 日韩激情中文字幕| 国产高潮在线| 亚洲综合中文| 国产精品一站二站| 国产一区亚洲| 国产精品视频一区二区三区四蜜臂| 91看片一区| 日本欧美在线| 蜜桃一区二区三区| 欧美黄色一区| 免费在线观看成人| 中文在线а√在线8| 四虎国产精品免费久久| 97国产成人高清在线观看| 在线国产精品一区| 一区二区三区四区日本视频| 亚洲综合中文| 久久久精品五月天| 日韩精品免费观看视频| av一区在线| 日韩高清二区| 国产中文一区| 精品久久91| 亚洲精品影视| 亚洲午夜在线| 精品亚洲自拍| 香蕉久久一区| 狠狠操综合网| 国产不卡av一区二区| 午夜精品福利影院| 欧美a级一区| 精品久久久网| 日本不卡视频在线| 欧美高清一区| 日本一二区不卡| 国产欧美日韩在线一区二区| 美女黄网久久| 日韩精品一区二区三区免费观影| 国产精品香蕉| 日韩在线网址| 亚洲一区二区成人| 久久精品青草| 欧美日韩在线观看首页| 免费一级欧美片在线观看网站 | 尤物在线精品| 97人人精品| 国产精品观看| 日韩av一级片| 亚洲天堂av资源在线观看| 蜜桃一区二区三区| 日韩网站中文字幕| 精品九九久久| 美女在线视频一区| 国产伦精品一区二区三区千人斩 | 欧美aa国产视频| 高潮一区二区| 成人午夜亚洲| 精品一区二区三区视频在线播放| 国产欧美日韩影院| 久久精品超碰| 911精品国产| 日本国产欧美| 亚洲精品国产精品粉嫩| 中文字幕日韩欧美精品高清在线| 久久成人国产| 亚洲激情另类| 午夜日本精品| 午夜久久黄色| 中国女人久久久| 午夜在线视频一区二区区别| 伊人久久亚洲影院| 亚洲一区二区毛片| 国产视频一区三区| 欧美中文字幕| 蜜臀av一区二区三区| 丝袜亚洲精品中文字幕一区| 香蕉成人久久| 伊人精品久久| 亚州av一区| 奇米色欧美一区二区三区| 亚洲精品美女91| 日韩中出av| 国产精品中文字幕制服诱惑| 美女精品久久| 另类专区亚洲| 亚洲一级高清| 三级在线观看一区二区 | 国产高清一区| 亚洲国产不卡| 水野朝阳av一区二区三区| 蜜桃一区二区三区在线观看| 日韩一区二区三免费高清在线观看| 亚洲精品九九| 国产日韩欧美在线播放不卡| 国产精品久久久久久久免费软件| 国产伦理一区| 福利一区和二区| 亚洲韩日在线| 六月丁香综合| 国产色噜噜噜91在线精品 | 国产欧美激情| 国产精品久久久久久久免费观看| 日韩高清中文字幕一区二区| 午夜欧美视频| 日本免费一区二区视频| 免费在线亚洲| 人人精品亚洲| 日韩精品一级二级| 欧美日韩xxxx| 最新中文字幕在线播放| 欧美日韩第一| 日本午夜精品一区二区三区电影| 久久精品国产99国产精品| 亚洲不卡av不卡一区二区| 国产精品美女| 国产日韩欧美一区二区三区| 日韩国产一区二区三区| 国产一区二区高清| 国产欧美88| 99国产精品免费视频观看| 日韩中文字幕不卡| 精品视频免费| 野花国产精品入口| 青青草精品视频| a日韩av网址| 亚洲精品日韩久久| 国产成人精品999在线观看| 国产精品女主播一区二区三区| 国产欧美一区二区精品久久久| 色爱综合av| 青青草伊人久久| 三上悠亚国产精品一区二区三区 | 国产精品免费精品自在线观看| 九九色在线视频| 日韩一二三区在线观看| 日韩av片子| 男人的天堂亚洲一区| 久久伊人国产| 国产精品三上| 麻豆精品新av中文字幕| 黄色av日韩| 欧美aaaaaa午夜精品| 亚洲一区欧美二区| 国产成人精品免费视| 免费在线成人网| 国际精品欧美精品| 在线免费观看亚洲| 中文字幕人成乱码在线观看| 亚洲精品日本| 久久精品中文| 久久国产精品色av免费看| 久久精品导航| 免费一级欧美片在线观看网站| 国产亚洲亚洲| 日本在线高清| 亚洲精品进入| 激情婷婷综合| sm捆绑调教国产免费网站在线观看|