获取数组中的所有LI元素

Die*_*l11 24 javascript

如何让JS选择UL标签内的每个LI元素并将它们放入数组中?

    <div id="navbar">
        <ul>
            <li id="navbar-One">One</li
            ><li id="navbar-Two">Two</li
            ><li id="navbar-Three">Three</li
            ><li id="navbar-Four">Four</li
            ><li id="navbar-Five">Five</li>
        </ul>
    </div>
Run Code Online (Sandbox Code Playgroud)

我可以这样做,以便JS将它们中的每一个都放入一个数组中,例如navbar ['0']会返回document.getElementById("navbar-One")吗?

Nic*_*ver 52

您可以通过使用迭代来获取NodeList getElementsByTagName(),如下所示:

var lis = document.getElementById("navbar").getElementsByTagName("li");
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试一下.这是一个NodeList而不是一个数组,但它有一个.length,你可以像数组一样迭代它.

  • 重要的是要强调:**这不是数组**.它不会像数组一样.如果您在任何时候选择从HTML中删除"LI"元素,其条目将从集合中"弹出",其上方的所有内容都将向下移动以填充空格,并且".length"将减少.对于任何想要生成`array`的人来说,这不是一个合适的解决方案,而这只能通过迭代元素或[将其转换为数组]来实现(http://stackoverflow.com/questions/222841/most-高效路到转换-AN-的HTMLCollection到一个阵列). (3认同)

tri*_*cot 21

几年过去了,你现在可以用ES6 Array.from(或扩展语法)来做到这一点:

const navbar = Array.from(document.querySelectorAll('#navbar>ul>li'));
console.log('Get first: ', navbar[0].textContent);

// If you need to iterate once over all these nodes, you can use the callback function:
console.log('Iterate with Array.from callback argument:');
Array.from(document.querySelectorAll('#navbar>ul>li'),li => console.log(li.textContent))

// ... or a for...of loop:
console.log('Iterate with for...of:');
for (const li of document.querySelectorAll('#navbar>ul>li')) {
    console.log(li.textContent);
}
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)
<div id="navbar">
  <ul>
    <li id="navbar-One">One</li>
    <li id="navbar-Two">Two</li>
    <li id="navbar-Three">Three</li>
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案调用两个 DOM 方法,而此解决方案仅调用一个。接受的答案不会产生 Array 实例,而这个答案会通过添加一个非常可读的“Array.from”(我的意思是:它说了它的作用,对吧?)。所以我不明白为什么这应该被认为是“复杂的”。 (3认同)

Vec*_*yte 6

QuerySelectorAll将获取所有具有定义选择器的匹配元素。在示例中,我使用元素的名称(li标签)来获取li带有navbar元素的 div 中的所有内容。

    let navbar = document
      .getElementById("navbar")
      .querySelectorAll('li');

    navbar.forEach((item, index) => {
      console.log({ index, item })
    });
Run Code Online (Sandbox Code Playgroud)
   
<div id="navbar">
	<ul>
		<li id="navbar-One">One</li>
		<li id="navbar-Two">Two</li>
		<li id="navbar-Three">Three</li>
		<li id="navbar-Four">Four</li>
		<li id="navbar-Five">Five</li>
	</ul>
</div>
Run Code Online (Sandbox Code Playgroud)