【发布时间】:2018-09-07 18:33:13
【问题描述】:
我有以下 DOM 结构:
var parent = document.querySelector(".test");
var navChild = parent.querySelectorAll("ul > li > a");
for (i = 0; i < navChild.length; i++) {
navChild[i].style.backgroundColor = "red";
}
console.log(navChild.lenght);
console.log(navChild);
<!-- begin snippet: js hide: false console: true babel: false -->
<ul>
<li class="test">
<a>ssss</a> <!--this will also be affected -->
<ul>
<li><a>fsfsf</a></li>
<li><a>sff</a></li>
<li><a>ggg</a></li>
</ul>
</li>
</ul>
我想使用 vanilla javascript 选择 3 个 a 标记,并从带有类测试的 li 开始。我把它放在一个parent 变量中,然后使用querySelectorAll 来尝试只获取下一个列表中的a 标记。但是,返回的节点列表还包括第一个 a 标记,即使它不是后代。这是我的代码:
var navChild = parent.querySelectorAll("ul > li > a");
真正奇怪的是,如果我只查询 li 后代,我只会得到 3。所以我不明白为什么当我查询 li 的子后代时,我也会得到第一个 @987654332 @ 标记在 DOM 上两级。
我知道我可以使用 jQuery 做到这一点,但我不想使用它。
已编辑以显示我如何设置父变量
我正在尝试将那些a 标签添加到childs 变量中,然后在我不想包含在子节点列表中的第一个a 标签上按下回车键.
var alinks = document.querySelectorAll('.test > a');
[].forEach.call(alinks, function(link){
link.addEventListener('keyup', function(e){
e.preventDefault();
if(e.keyCode === 13) {
var linkParent = e.target.parentElement;
var childs = menuParent.querySelectorAll('ul > li > a');
}
})
});
当我登录 linkParent 时,它被正确设置为 li 类 test。我不明白为什么如果我从那里运行查询,它仍然包含第一个 a 标记。正如我之前所说,如果我只查询ul > li,它会给我正确的li 标签。
【问题讨论】:
-
显示你是如何设置
parent的。
标签: javascript dom selectors-api