摘要:保證點擊的元素是可以切換開關狀態(tài)的獲取元素內(nèi)容切換內(nèi)容的開啟關閉狀態(tài)方法會觸發(fā)一個函數(shù),這個函數(shù)會檢查二級菜單是否有類。
使用 closest() 函數(shù)獲取正確的 DOM 元素原文地址:Using closest() to return the correct DOM element
原文作者:Matt Smith
譯文出自:掘金翻譯計劃
本文永久鏈接:github.com/xitu/gold-m…
譯者:LucaslEliane
校對者:ZYuMing,Moonliujk
最近我在使用垂直導航組件的時候遇到了一個問題:點擊菜單項的時候,對應的 JavaScript 代碼并沒有觸發(fā)。我對這個問題進行了比較深入的了解之后,分享下解決這個問題的過程以及在這過程中發(fā)現(xiàn)的技巧。
這個問題的場景是這樣的,所有的菜單項都有兩個子元素:一個圖標,以及一個作為標簽的 元素,這兩個元素均嵌入到了鏈接中。
<li>
<a href="#example" class="toggle">
<img src="/img/billing.svg" width="20" height="20" alt="">
<span>Billingspan>
a>
<div id="example">
<ul>
<li><a href="/statment/">My Statementa>li>
<li><a href="/history/">Pay Historya>li>
ul>
div>
li>
在 toggle 方法會觸發(fā)一個函數(shù),這個函數(shù)會檢查二級菜單是否有 .is-visible CSS 類。如果元素具有這個類,那么二級菜單將會被隱藏,否則會顯示二級菜單: 我希望點擊菜單項中的任何位置,都會觸發(fā) JavaScript 并且執(zhí)行切換操作。但是如果我點擊圖標或者標簽子元素,JavaScript 就不會執(zhí)行。原因是 event.target 返回到的是實際點擊到的 DOM 元素。點擊圖標或者標簽只會返回圖標或者標簽元素。 我需要獲取到觸發(fā)了點擊事件的目標,并且返回其父元素,而不是子元素。我采用了使用 closest() 方法的解決方案。這個方法會從當前元素開始,遍歷 DOM 樹,并且返回和給定參數(shù)匹配的最近的祖先: 這段代碼讓我醍醐灌頂。我可以通過 closest() 和 event.target 來找到并且返回父元素(菜單項鏈接),無論我點擊的是哪個子元素(圖標或者標簽): 現(xiàn)在,點擊菜單項的任何地方都會觸發(fā) JavaScript 并且切換二級菜單了。 可以在 CODEPEN 上嘗試一下,并且還有源碼。 希望這個小竅門可以幫助你定位特定的 DOM 元素。closest() 方法在大多數(shù)主流瀏覽器上都是支持的,但是在 IE11 上需要引入 polyfill。 如果你需要更加深入的了解本文相關的內(nèi)容,我推薦 Zell Liew 的關于遍歷 DOM 元素的文章。他介紹了本文使用的這種方法以及其他一些值得一試的技巧。 如果發(fā)現(xiàn)譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改并 PR,也可獲得相應獎勵積分。文章開頭的 本文永久鏈接 即為本文在 GitHub 上的 MarkDown 鏈接。 掘金翻譯計劃 是一個翻譯優(yōu)質(zhì)互聯(lián)網(wǎng)技術文章的社區(qū),文章來源為 掘金 上的英文分享文章。內(nèi)容覆蓋 Android、iOS、前端、后端、區(qū)塊鏈、產(chǎn)品、設計、人工智能等領域,想要查看更多優(yōu)質(zhì)譯文請持續(xù)關注 掘金翻譯計劃、官方微博、知乎專欄。 文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/6828.htmldocument.addEventListener("click", function (event) {
// 保證點擊的元素是可以切換開關狀態(tài)的
if (!event.target.classList.contains("toggle")) {
return;
}
event.preventDefault();
// 獲取元素內(nèi)容
var content = document.querySelector(event.target.hash);
if (!content) {
return;
}
// 切換內(nèi)容的開啟/關閉狀態(tài)
toggle(content);
}, false);
var toggle = function (elem, timing) {
// 如果二級菜單是可見的,那么就隱藏它
if (elem.classList.contains("is-visible")) {
hide(elem);
return;
}
// 否則,展示二級菜單
show(elem);
};
let closestElement = Element.closest(selector);
if (!event.target.closest("a").classList.contains("toggle")) {
return;
}
var content = document.querySelector(event.target.closest("a").hash);
摘要:本項目總結(jié)了大部分替代的方法,暫時只支持以上瀏覽器。返回指定元素及其后代的文本內(nèi)容。從服務器讀取數(shù)據(jù)并替換匹配元素的內(nèi)容。用它自己的方式處理,原生遵循標準實現(xiàn)了最小來處理。當全部被解決時返回,當任一被拒絕時拒絕。是創(chuàng)建的一種方式。 原文https://github.com/nefe/You-D... You Dont Need jQuery showImg(https://segmen...
摘要:將匹配元素集合的父級元素刪除,保留自身和兄弟元素,如果存在在原來的位置。方法查找指定元素集合中每一個元素的同輩元素。每次回調(diào)函數(shù)執(zhí)行時,會傳遞當前循環(huán)次數(shù)作為參數(shù)從開始計數(shù)。 DOM節(jié)點的創(chuàng)建 先介紹下需要用到的瀏覽器提供的一些原生的方法(這里不處理低版本的IE兼容問題)創(chuàng)建流程比較簡單,大體如下: 創(chuàng)建節(jié)點(常見的:元素、屬性和文本) 添加節(jié)點的一些屬性 加入到文檔中流程中涉及的一...
摘要:只要符合,不管是兒子輩,孫子輩都可以與其他的樹遍歷方法不同,選擇器表達式對于是必需的參數(shù)。方法以選定的元素為中心,往內(nèi)查找可以通過方法。要一個一個給合集中每一個設置顏色,這里方法就是方法就是一個循環(huán)的迭代器,它會迭代對象合集中的每一個元素。 children()方法 jQuery是一個合集對象,如果想快速查找合集里面的第一級子元素,此時可以用children()方法。這里需要注意:.c...
摘要:當被最接近的列表元素或其子后代元素被點擊時,會切換黃色背景定義和用法方法獲得匹配選擇器的第一個祖先元素,從當前元素開始沿樹向上。詳細說明如果給定表示元素集合的對象,方法允許我們檢索樹中的這些元素以及它們的祖先元素,并用匹配元素構造新的對象。 w3c: http://www.w3school.com.cn/jquery/traversing_closest.asp 本例演示如何通過 c...
摘要:與有著絕大部分類似的,通用庫只有,手機上每一都是錢。目前及的最新版已經(jīng)支持。在這個函數(shù)中,原來的對象是無效的。與方法相同,接受一個標準格式的字符串,并返回解析后的對象。這有點像,但是是相反的方式。 [JSLite.io] showImg(https://img.shields.io/github/issues/JSLite/JSLite.svg); showImg(https://im...
閱讀 3338·2023-04-26 00:07
閱讀 3947·2021-11-23 10:08
閱讀 2958·2021-11-22 09:34
閱讀 868·2021-09-22 15:27
閱讀 1758·2019-08-30 15:54
閱讀 3763·2019-08-30 14:07
閱讀 926·2019-08-30 11:12
閱讀 691·2019-08-29 18:44