如何在<ul>中选择<li>

mmu*_*478 2 html javascript

假设我有html结构

ul
  li //this one
    ul
      li
      li
      li
  li //this one
Run Code Online (Sandbox Code Playgroud)

我不想得到所有li的.正如我评论的那样,我只想得到第一段李.我该如何选择它们?

document.querySelectorAll("ul > li");
Run Code Online (Sandbox Code Playgroud)

返回所有li的.

编辑:实际上这只是树的一小部分.
我无法将结构修改为添加类或ID.我在寻找的答案,得到第一层的名单li小号

Que*_*tin 5

您需要选择祖父母不是另一个列表项的所有li项.

:not(li) > * > li {}
Run Code Online (Sandbox Code Playgroud)

这仅在标记中没有额外元素时才有效.

例如,它将失败:

<ul>
  <li>
    <div>
      <ul>
        <li>
Run Code Online (Sandbox Code Playgroud)

一种较慢但更可靠的方法是获取所有列表项,然后筛选出具有列表项祖先的项.

var lis = document.getElementsByTagName('li');
var lis_without_li_ancestors = [];
for (var i = 0; i < lis.length; i++) {
  var element = lis[i];
  if (!has_li_ancestor(element)) {
    lis_without_li_ancestors.push(element);
  }
}

console.log(lis_without_li_ancestors);

function has_li_ancestor(element) {
  var parent = element.parentNode;
  if (parent.tagName.toLowerCase() === "body") {
    return false;
  } else if (parent.tagName.toLowerCase() === "li") {
    return true;
  } else {
    return has_li_ancestor(parent);
  }
}
Run Code Online (Sandbox Code Playgroud)
<ul>
  <li>
    <ul>
      <li>...
    </ul>
</ul>
Run Code Online (Sandbox Code Playgroud)


Arg*_*g0n 5

在jQuery中,您可以使用此选择器ul > li:not('ul > li > ul > li'):

$("ul > li:not('ul > li > ul > li')").css("background", "green");
Run Code Online (Sandbox Code Playgroud)
ul > li {
  background: white;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li>
    First
    <ul>
      <li>
        Second
        <ul>
          <li>Third</li>
        </ul>
      </li>
      <li>Second</li>
      <li>Second</li>
      <li>Second</li>
    </ul>
  </li>
  <li>First</li>
  <li>First</li>
  <li>First</li>
</ul>
Run Code Online (Sandbox Code Playgroud)