我如何使用 JavaScript Class 方法中的变量检测最近的父级
How can i detect closest parent using variable inside JavaSript Class method
我有两个导航,当我点击菜单时,应该给父菜单添加一个边框。我使用 ES6 class 进行导航。我只需要一个对象即可实现此功能。现在它正在工作,因为我将 class 名称硬编码如下 e.target.closest(".one").style.border="2px solid green";
在这里我使用 .one
而不是它,我需要需要检测最接近的 class [=15 的变量=].希望我的解释对大家有意义。如果没有,请问我,我会详细说明。希望有人能帮助我。以下是我的代码。提前致谢!
class Navigation{
constructor(parent) {
this.parent= document.querySelectorAll(parent);
}
addBorder(){
let li = this.parent.forEach((elem)=>{
elem.addEventListener("click",(e)=>{
e.target.closest(".one").style.border="2px solid green";
})
})
}
};
let one = new Navigation(".one");
one.addBorder();
nav {font-family:arial;width:15rem;}
nav ul {list-style:none;padding:0;margin:1rem;padding-left:.5rem;}
nav ul a {color:#777;text-decoration:none;padding:.5rem;}
<nav class="one">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<nav class="one">
<ul>
<li><a href="#">Services</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Support</a></li>
</ul>
</nav>
这是否与您正在尝试做的事情一致?添加了一个新方法来向上导航 DOM 以查找构造函数中指定的父项。从那获得它是 class 并像你一样继续......或多或少
class Navigation {
constructor(parent) {
this.parent = document.querySelectorAll(parent);
};
find(e) {
let n = e.target;
while (n.tagName.toLowerCase() != this.parent.item(0).tagName.toLowerCase()) {
if (n.nodeName === 'BODY') return false;
n = n.parentNode;
}
return n;
};
addBorder() {
this.parent.forEach((elem) => {
elem.addEventListener("click", (e) => {
e.stopPropagation();
e.preventDefault();
let _cn = this.find(e).className;
e.target.closest(`.${_cn}`).classList.add('banana')
})
})
}
};
let one = new Navigation("nav");
one.addBorder();
nav {
font-family: arial;
width: 15rem;
}
nav ul {
list-style: none;
padding: 0;
margin: 1rem;
padding-left: .5rem;
}
nav ul a {
color: #777;
text-decoration: none;
padding: 0.5rem;
}
/* only to aid visualisation */
.banana {
border: 5px solid green;
background: white;
box-shadow: 0 0 2rem yellow;
}
<nav class="one" id='a'>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<nav class="one" id='b'>
<ul>
<li><a href="#">Services</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Support</a></li>
</ul>
</nav>
我有两个导航,当我点击菜单时,应该给父菜单添加一个边框。我使用 ES6 class 进行导航。我只需要一个对象即可实现此功能。现在它正在工作,因为我将 class 名称硬编码如下 e.target.closest(".one").style.border="2px solid green";
在这里我使用 .one
而不是它,我需要需要检测最接近的 class [=15 的变量=].希望我的解释对大家有意义。如果没有,请问我,我会详细说明。希望有人能帮助我。以下是我的代码。提前致谢!
class Navigation{
constructor(parent) {
this.parent= document.querySelectorAll(parent);
}
addBorder(){
let li = this.parent.forEach((elem)=>{
elem.addEventListener("click",(e)=>{
e.target.closest(".one").style.border="2px solid green";
})
})
}
};
let one = new Navigation(".one");
one.addBorder();
nav {font-family:arial;width:15rem;}
nav ul {list-style:none;padding:0;margin:1rem;padding-left:.5rem;}
nav ul a {color:#777;text-decoration:none;padding:.5rem;}
<nav class="one">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<nav class="one">
<ul>
<li><a href="#">Services</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Support</a></li>
</ul>
</nav>
这是否与您正在尝试做的事情一致?添加了一个新方法来向上导航 DOM 以查找构造函数中指定的父项。从那获得它是 class 并像你一样继续......或多或少
class Navigation {
constructor(parent) {
this.parent = document.querySelectorAll(parent);
};
find(e) {
let n = e.target;
while (n.tagName.toLowerCase() != this.parent.item(0).tagName.toLowerCase()) {
if (n.nodeName === 'BODY') return false;
n = n.parentNode;
}
return n;
};
addBorder() {
this.parent.forEach((elem) => {
elem.addEventListener("click", (e) => {
e.stopPropagation();
e.preventDefault();
let _cn = this.find(e).className;
e.target.closest(`.${_cn}`).classList.add('banana')
})
})
}
};
let one = new Navigation("nav");
one.addBorder();
nav {
font-family: arial;
width: 15rem;
}
nav ul {
list-style: none;
padding: 0;
margin: 1rem;
padding-left: .5rem;
}
nav ul a {
color: #777;
text-decoration: none;
padding: 0.5rem;
}
/* only to aid visualisation */
.banana {
border: 5px solid green;
background: white;
box-shadow: 0 0 2rem yellow;
}
<nav class="one" id='a'>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<nav class="one" id='b'>
<ul>
<li><a href="#">Services</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Support</a></li>
</ul>
</nav>