Javascript 如何颠倒无序列表中列表项的顺序
假设我有一个无序列表,如下所示:Javascript 如何颠倒无序列表中列表项的顺序,javascript,Javascript,假设我有一个无序列表,如下所示: <ul id="birds"> <li>Bald Eagle</li> <li>Falcon</li> <li>Condor</li> <li>Albatross</li> <li>Parrot</li> </ul> 秃鹰 猎鹰 秃鹰 信天翁 鹦鹉 使用纯JavaScript(不包括jQuer
<ul id="birds">
<li>Bald Eagle</li>
<li>Falcon</li>
<li>Condor</li>
<li>Albatross</li>
<li>Parrot</li>
</ul>
- 秃鹰
- 猎鹰
- 秃鹰
- 信天翁
- 鹦鹉
使用纯JavaScript(不包括jQuery),我希望能够颠倒此列表的顺序-以便它匹配以下预期的“输出”:
- 鹦鹉
- 信天翁
- 秃鹰
- 猎鹰
- 秃鹰
这是我试图编写的JavaScript,试图实现这一目标:
var birdList = document.getElementById("birds").getElementsByTagName("li");
var birdListReverse = birdList.reverse();
for(var i = 0; i < birdList.length; i++)
{
birdList[i] = birdListReverse[i];
}
var birdList=document.getElementById(“birds”).getElementsByTagName(“li”);
var birdListReverse=birdList.reverse();
对于(变量i=0;i
我认为,以某种方式将当前列表中的项目与“反向”列表中的项目过度书写是足够的,但并非如此。我是否需要以某种方式操纵列表中的每个nodeValue
我希望在单击按钮时执行此操作-这是最简单的部分,只是获得了扭转列表的技术,这有点妨碍了我。您可以这样做(在纯javascript中)。您只需按相反顺序循环使用li
标记,并将它们附加到父项。这将产生颠倒顺序的自然效果。你得到最后一个,将它附加到列表的末尾,得到第二个到最后一个,将它附加到列表中。从第三个到最后一个,将其附加到列表的末尾,依此类推,所有项目都以相反的方式结束。注意,您可以对DOM中已经存在的内容使用appendChild,它将自动从当前位置移动(例如,在追加之前删除)
工作示例:HTMLCollection只是节点的只读视图。为了操纵节点,必须使用各种DOM操纵方法之一。在你的情况下,正好有一条捷径;您所需要做的就是以相反的顺序附加子节点
var birds = document.getElementById("birds");
var i = birds.childNodes.length;
while (i--)
birds.appendChild(birds.childNodes[i]);
编辑:发生的情况是,
appendChild
在追加节点之前将其从文档中删除。这有两个效果:a)它使您不必在按相反顺序追加节点之前复制节点列表并将其删除;b)它使节点的顺序颠倒,因为它将最后一个子列表和第一个子列表附加在一起。操作birdList
不会对元素重新排序,因为birdList
只是一个集合-a,它独立于DOM本身
实际上,您需要获得对
元素的引用,然后使用and-可能的组合。未测试,但请尝试:
var parent = document.getElementById("birds");
var birdList = parent.getElementsByTagName("li");
for(var i = birdList.length-1; i > 0; --i) {
parent.appendChild(birdList[i];
}
var birds=document.getElementById('birds');
对于(var i=0,bll=birds.childNodes.length;i
实际上不需要JavaScript。如果要在此处使用语义正确的
(ordered list)元素(因为排序对您来说显然很重要),那么可以使用reversed
属性执行完全相同的操作,而不需要任何脚本依赖项!为了直观地颠倒项目的顺序,我们将在两行CSS中添加flex direction
:
ol[反向]{
显示器:flex;
弯曲方向:柱反向;
}
秃鹰
猎鹰
秃鹰
信天翁
鹦鹉
const list=document.querySelector(“ul”);
from(list.children.reverse().forEach(element=>list.appendChild(element))代码>您也可以这样做。其工作原理如下:
- 抓取所有bird列表项(元素)并将其作为节点列表返回
- 将节点列表转换为数组并反转数组(因为数组中的项可以反转,但节点列表中的项不能反转)
- 将数组中的每个鸟类列表项追加到原始列表容器中(元素
)
代码:
您是否尝试过用相反的答案覆盖当前列表项?虽然其他答案对我有效,但这是最短、最容易编码的答案(并且有效)。谢谢你的建议:)。我试图在我的代码中“总结”我对这一点的理解,并给出这样的评论:“因此,从列表末尾向后操作,并将每个项目追加到列表中,反过来,会产生一种错觉,即列表中的每个值都被列表中的“相反”顺序“重写”(例如,从5个项目的列表中,项目1变为项目5,项目2变为项目4,项目3保持不变,项目4变为项目2,项目5变为项目1)。“这是因为”将节点newChild添加到此节点的子项列表的末尾。如果newChild已在树中,则首先将其删除。”。如果新子节点已在树中,则即使首先删除它。如果节点较多,则可能会删除(取决于浏览器)如果你指的是Neil使用childNodes,是的,我确实修改了我的答案,因为历史将为海报提供更简洁的替代方案。但我没有改变我最初的基本方法,即使用insertBefore
@BrettZamir,我想canon
这意味着他/她在经过一些编辑后提供的答案最终与您的答案相同,并且在注意到这一点的同时,canon
选择删除他/她的答案。这与我的一次尝试非常相似,只是通过查看这一点,让parent.appendChild和parent.removeChild在连续语句中使我认为它们是错误的omehow相互抵消。当我测试此代码片段时,我只剩下一个列表项-原始列表中的“最后”项。您不需要删除子项,因为这会自动发生
var birds = document.getElementById("birds");
var i = birds.childNodes.length;
while (i--)
birds.appendChild(birds.childNodes[i]);
var parent = document.getElementById("birds");
var birdList = parent.getElementsByTagName("li");
for(var i = birdList.length-1; i > 0; --i) {
parent.appendChild(birdList[i];
}
var birds = document.getElementById('birds');
for(var i = 0, bll = birds.childNodes.length; i < bll; i++) {
birds.insertBefore(birds.childNodes[i], birds.firstChild);
}
const birdsContainer = document.getElementById("birds");
const birdList = birds.getElementsByTagName("li");
[].slice.call(birdList)
.reverse()
.forEach(bird => birdsContainer.appendChild(bird));