javascript - Javascript event.target 找不到孩子。NodeList 和 HTMLChildren 为空
问题描述
我正在尝试使用 Vanilla JavaScript 构建带有子菜单的菜单
HTML 看起来像这样:
<ul id="menu">
<li>
<ul>
<li>Sub menu item 1</li>
<li>
<ul>
<li>Sub menu of a submenu item 1</li>
<li>Sub menu of a submenu item 2</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li>Sub menu item 1</li>
<li>Sub menu item 2</li>
</ul>
</li>
</ul>
Javascript 看起来像:
var clickHandler = function(event){
event.preventDefault();
if(event.target.tagName != 'LI') return;
//when I click on the **li** which has a **ul**, it returns empty node list
console.log(event.target.querySelectorAll('ul')); //returns empty NodeList
}
document.addEventListener('DOMContentLoaded', function()
{
var menu = document.getElementById('menu');
//console.log(menu)
menu.addEventListener('click', clickHandler, false);
});
为什么 event.target.querySelectorAll('ul') 返回空节点列表
请注意,我将点击事件放在#menu而不是#menu > li的原因是因为我不想使用循环在每个 LI 中附加事件处理程序
准确地说,当单击任何li时,我想检查它是否有子菜单(ul),如果有,那么我将向单击的 'li' 添加一个类 'open'。我不在乎li的位置,我只想知道它是否包含ul。
在 JQuery 中,它应该类似于 .find('ul');
解决方案
我不明白你为什么把这个弄得这么复杂。如果出于任何原因需要,请告诉我们。
let allLi = document.querySelectorAll("ul:not(#menu) li");
[...allLi].forEach(li => {
li.addEventListener("click", callThisFunction)
});
function callThisFunction() {
console.log(event.target.innerText)
}
编辑:在下面评论中的解释之后,我做了以下更改:
let allLi = document.querySelectorAll("li");
[...allLi].forEach(li => {
let method = li.querySelector("ul") ? function1 : function2;
li.addEventListener("click", method)
});
function function1() {
event.stopPropagation();
console.log(event.target.innerHMTL)
}
function function2() {
event.stopPropagation();
console.log(event.target.innerHTML)
}
推荐阅读
- python - wxSplitterWindow 不显示窗扇
- automated-tests - 使用链接下载文件检查- 空手道
- swift - 如何在自定义段控制器中居中文本?迅速
- android - Android GridLayoutManager 水平滚动 3 项
- ldap - 将本地组添加到 Fedora 上的 ldap 登录用户
- pandas - ImportError:无法从“熊猫”导入名称“标志”
- swift - 如何在 SwiftUI 中通过动画使背景消失?
- jenkins - 使用 Jenkins 从 Gitlab 管理 K8s 集群
- javascript - 无法读取未定义的属性“main_text_matched_substrings”
- python - 保持消息计数离线 discord.py