我有一个按钮,我想对它的父元素的兄弟元素进行修改。
<div class="parent">
<div class="target"></div>
<div class="child">
<button>Click!</button>
</div>
</div>
我试过玩event.target.closest
和类似的,像这样,但我不能让它工作:
function clicks(event) {
const childElement = event.target.closest(".child");
const parentElement = childElement.target.closest(".parent");
const targetElement = parentElement.target.closest(".target");
targetElement.style.display = "none";
}
addEventListener('click', clicks);
意向可视化
您可以使用parentNode属性获取按钮的父元素,然后使用nextElementSibling属性获取目标元素:
function clicks(event) {
const parentElement = event.target.parentNode;
const targetElement = parentElement.nextElementSibling;
targetElement.style.display = "none";
}
addEventListener('click', clicks);
如评论部分所述,您不能使用.closest
,因为它向上移动DOM树,并且您试图在对.closest
的最后调用中获得父元素的子元素,一种选择是在父元素上使用querySelector
,也在函数clicks
的第二行上,childElement
变量没有一个target
属性,当设置parentElement
:
undefined
window.addEventListener("DOMContentLoaded", () => {
document.querySelector("button").addEventListener('click', clicks);
});
function clicks(event) {
const childElement = event.target.closest("div.child");
//const parentElement = childElement.target.closest(".parent");
const parentElement = childElement.closest("div.parent");
//Don't use .closest()
//const targetElement = parentElement.target.closest(".target");
const targetElement = parentElement.querySelector('div.target');
targetElement.style.display = "none";
//You could reduce all this to one line:
//event.target.closest('div.parent').querySelector('div.target').style.display = "none";
}
<div class="parent">
<div class="target">I am the target</div>
<div class="child">
<button>Click!</button>
</div>
</div>
文档:Element.closest
您可以使用两个属性- parent和preouselementsibling。
这个简单的例子找到按钮的父节点,然后找到它前面的兄弟节点:
document.querySelector('button').addEventListener('click', function() {
event.target.parentElement.previousElementSibling.classList.add('nextClicked');
});
.nextClicked {
background-color: red;
}
<div class="parent">Parent
<div class="target">Target</div>
<div class="child">Child
<button>Click!</button>
</div>
</div>