javascript - 用纯javascript将点击事件附加到他的父亲身上
问题描述
纽比到纯 JS。
我正在创建一个必须与移动设备配合使用的菜单。
我正在尝试使用纯 .js 创建,而不是使用 jQuery,所以这是一个实验,它一直具有挑战性。
这是我的代码:
JS:
(function() {
var menu = document.querySelector('.mobile-menu');
var subMenu = {
downToggle: document.getElementsByClassName('sub-menu'),
downToggleTitle: document.getElementsByClassName('sub-menu-title'),
subMenuItems: document.getElementsByClassName('sub-menu-item-mobile'),
searchBar: document.getElementById('mobile-search'),
onclickimg: document.querySelectorAll('.sub-menu-arrow'),
};
function listen() {
for(var i=0; i<subMenu.downToggleTitle.length; i++) {
subMenu.downToggleTitle.item(i).addEventListener('click', function(e) {
// if there is a menu that's already open and it's not the element that's been clicked, close it before opening the selected menu
for(var i=0; i<subMenu.downToggleTitle.length; i++) {
if (subMenu.downToggleTitle.item(i).classList.contains('expanded') && subMenu.downToggleTitle.item(i) !== e.target) {
subMenu.downToggleTitle.item(i).classList.toggle('expanded');
}
}
// inside each sub-menu is a third-level-sub-menu. So inside each sub-menu we
// check if it's already open, then close it
for(var i=0; i<subMenu.subMenuItems.length; i++) {
// console.log("test test")
if(subMenu.subMenuItems.item(i).classList.contains('expanded') && subMenu.subMenuItems.item(i) !== e.target) {
subMenu.subMenuItems.item(i).classList.toggle('expanded');
}
}
this.classList.toggle('expanded');
});
}
for(var i=0; i<subMenu.subMenuItems.length; i++) {
subMenu.subMenuItems.item(i).addEventListener('click', function(e) {
for(var i=0; i<subMenu.subMenuItems.length; i++) {
if(subMenu.subMenuItems[i].classList.contains('expanded') && subMenu.subMenuItems[i] !== e.target) {
subMenu.subMenuItems[i].classList.toggle('expanded');
console.log("hello Aug 20");
}
}
this.classList.toggle('expanded');
});
}
} listen();
}());
我要更改的行为如下:
在第一个版本中,如果客户端按下作为项目的.sub-menu-title
类(变量downToggleTitle
),则该li
元素将切换类expanded
。现在我想要一些不同的东西。
我在列表元素的最后添加了 class sub-menu-arrow
,它是变量onclickimg
an img
,所以如果客户点击箭头,所有的 class 元素sub-menu-title
( var = downToggleTitle
) 都会切换 class expanded
。
这不会发生,因为由于某种原因,如果我以这种方式更改代码:
subMenu.onclickimg.item(i).addEventListener('click', function(e) {
for(var i=0; i<subMenu.downToggleTitle.length; i++) {
if (subMenu.downToggleTitle.item(i).classList.contains('expanded') && subMenu.downToggleTitle.item(i) !== e.target) {
subMenu.downToggleTitle.item(i).classList.toggle('expanded');
}
}
该类expanded
将切换到sub-menu-arrow
元素(就像我说的,一些带有动画的图像)。
在这种情况下如何定位父元素有什么建议吗?
另外,是否可以mobile-toplevel-link
从点击事件中排除带有类的锚元素?
该<a>
元素是sub-menu-title
该类的其他孩子
解决方案
如果你想获取点击目标的父元素,那么你可以利用你的 currenteventListener
并使用e.target.parentNode
来获取它。这将返回一个元素,您可以在其中添加/删除 CSS 类并执行几乎所有您喜欢的操作。请记住,您可以.parentNode
多次使用,例如,如果您想获得一个元素的“祖父母”(2 级以上),您可以编写e.target.parentNode.parentNode
等等。
推荐阅读
- angular - 如何从 firebase db 中获取值
- python - 无法通过 Flask 使用 python REST API 从 React 接收数据以更新 Mongo 集合
- java - 变量在方法中定义了 2 次
- angular - Angular 8 和 jest - 找不到文件:jest-preset-angular/InlineHtmlStripStylesTransformer.js
- javascript - 如何避免来自对象下方div的事件?
- angular - power bi access token api在邮递员中工作正常,但在角度应用程序中不工作
- google-cloud-platform - google.api_core.exceptions.RetryError:在 google-cloud-platform 上
- php - 删除()观察者方法中的getDirty()软删除项目,Laravel 5.8
- selenium - Selenium:如何使用 POM/PageFactory 为元素使用不同的定位器
- javascript - Bonferroni不等式的JS实现中避免多重循环