【问题标题】:How to use variable inside querySelectorAll to select direct child如何使用 querySelectorAll 中的变量来选择直接子级
【发布时间】:2021-12-25 21:57:56
【问题描述】:

如何使用带有document.querySelectorAll 的变量来选择所有直接<li> 子元素。我想选择main-navigation > ul元素的直接<li>标签,并给出红色边框。我知道它可以使用let firstLevelLi = document.querySelectorAll(".main-navigation > ul > li"); 修复。但我正在寻找如下变量的解决方案。

let parent = document.querySelector(".main-navigation > ul");
let li = document.querySelectorAll("`${parent}` > ul > li");

我需要它与 OOP 函数一起使用。我没有在这里提到我的 OOP 代码,因为它可能会让每个人感到困惑。这就是为什么我这样减少它以解决核心问题。我的代码如下。希望任何人都可以帮助我。提前致谢!

let parent = document.querySelector(".main-navigation > ul");
    let li = document.querySelectorAll("`${parent}` > ul > li");
    
    li.forEach((el)=>{
    el.style.border="2px solid red";
    });
ul {list-style:none;padding:0;margin:0;font-family:arial;}
ul ul {padding-left:1rem;}
li {padding:.35rem;}
<div class="main-navigation">
<ul>
    <li><a href="">Home</a></li>
    <li><a href="">About +</a>
        <ul>
          <li><a href="#">Vision</a></li>
          <li><a href="#">Mission</a></li>
        </ul>
    </li>
    <li><a href="">Contact</a></li>
</ul>   
</div>

【问题讨论】:

  • 你的意思是let li = parent.querySelectorAll("ul &gt; li");

标签: javascript html-lists parent-child queryselector


【解决方案1】:

您可以在querySelectorAll 中使用parent 的标记名:

let parent = document.querySelector('.main-navigation')

let li = document.querySelectorAll(`${parent.tagName} > ul > li`)

li.forEach(el => {
  el.style.border = '2px solid red'
})
ul {
  list-style: none;
  padding: 0;
  margin: 0;
  font-family: arial;
}

ul ul {
  padding-left: 1rem;
}

li {
  padding: 0.35rem;
}
<div class="main-navigation">
  <ul>
    <li><a href="#">Home</a></li>
    <li>
      <a href="#">About +</a>
      <ul>
        <li><a href="#">Vision</a></li>
        <li><a href="#">Mission</a></li>
      </ul>
    </li>
    <li><a href="#">Contact</a></li>
  </ul>
</div>

【讨论】:

  • 您好 Aerial,您的解决方案听起来不错。让我也知道如何只选择第一级&lt;li&gt; 标签。这意味着,我不想选择“关于”标签子 &lt;li&gt; 标签。希望你能理解。感谢您的启蒙。
  • @RenJitsm 检查编辑后的答案
  • 嗨空中,哇....太棒了。这正是我想要的。让我知道是否有任何关于“variable.tagName”的文档来参考它。它是一个很好的帮助和解决方案。它真的节省了我很多时间!!!!非常感谢!!!
【解决方案2】:

你可以使用“parent”而不是“document”:

let li = parent.querySelector("ul").querySelectorAll('li');

在您的情况下,您需要将操作分成两个查询而不是一个,因为示例代码中的每个列表元素在某种程度上都是 ul 元素的一部分,因此 ul &gt; li 实际上会选择所有他们。

let li = parent.querySelectorAll("ul > li"); // this will not work as you want

如果你预计会有多个子ul,你可以选择所有的,然后循环并选择它们的列表元素。

  let li = [];
  parent.querySelectorAll("ul").forEach(ul => {
    li = [...li, ...ul.querySelectorAll('li')];
  });

这里是完整的代码:

let parent = document.querySelector(".main-navigation > ul");
let li = parent.querySelector("ul").querySelectorAll('li');
    
    li.forEach((el)=>{
    el.style.border="2px solid red";
    });
ul {list-style:none;padding:0;margin:0;font-family:arial;}
ul ul {padding-left:1rem;}
li {padding:.35rem;}
<div class="main-navigation">
<ul>
    <li><a href="">Home</a></li>
    <li><a href="">About +</a>
        <ul>
          <li><a href="#">Vision</a></li>
          <li><a href="#">Mission</a></li>
        </ul>
    </li>
    <li><a href="">Contact</a></li>
</ul>   
</div>

【讨论】:

  • 嗨阿拉,你几乎接近另一个最佳解决方案。现在您在“关于”菜单中选择了&lt;li&gt; 标签。实际上我只需要第一级&lt;li&gt;标签的边框。这样“关于”标签内的&lt;li&gt; 标签不需要边框。希望你明白。感谢您的帮助!
猜你喜欢
  • 2016-02-10
  • 2023-03-19
  • 2015-07-29
  • 2020-02-27
  • 2023-01-05
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多