如何使用 Javascript 将列表项移动到无序列表中的指定索引(位置)
How to move a list item to a specified index(position) in an unordered list using Javascript
假设我有一个无序列表,如何将 "Three" 移动到列表中的任何索引(位置)?
该方法应该是动态的。替换元素的文本内容不是一种选择。因为每个列表项也将包含其他元素。
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
<li>six</li>
.
.
.
<li>Hundred</li> /* Nth List Element */
</ul>
尝试了已经回答过类似问题的解决方案。但是没有得到想要的结果。
我已经试过了
- 通过jQuery
获取数组中的列表
- 使用array.each遍历数组
- 然后使用前缀将特定的 li 移动到列表的顶部
但是通过这种方法我只能将 li 元素移动到列表的顶部。不在任何想要的位置。
为此,我会使用带有基于索引的方法的构造函数:
function LiMover(liParent){
this.kids = liParent.children;
this.move = (index, beforeIndex = null)=>{
const k = this.kids, e = k[index];
if(beforeIndex === null){
liParent.appendChild(e)
}
else{
liParent.insertBefore(e, k[beforeIndex]);
}
return this;
}
}
const liMover = new LiMover(document.querySelector('ul'));
liMover.move(0); // move 0 index (one) after last index
liMover.move(5, 0); // move 5 index (one) back to 0 index
liMover.move(1, 4); // move 1 index (two) to 4 index
liMover.move(3, 5).move(2, 0); // showing return this chain
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
<li>six</li>
</ul>
const ul = document.querySelector('ul');
const items = [...ul.querySelectorAll('li')];
const moveItem = (from, to) => {
if (to > items.length - 1 || to < 0) return;
const item = items[from];
if (!item) return;
ul.removeChild(item);
ul.insertBefore(item, ul.children[to]);
}
moveItem(5, 0);
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
<li>six</li>
</ul>
当然可以解决。我已经实现了一个交换集合中两个项目的函数:
function swap(items, first, second) {
var aux = items[first].innerHTML;
items[first].innerHTML = items[second].innerHTML;
items[second].innerHTML = aux;
}
swap(document.querySelectorAll("ul > li"), 2, 4);
在此处查看 fiddle:https://jsfiddle.net/5qropsvu/
试试这个交换
const listElts = Array.from(document.querySelectorAll('li'));
const swap1 = listElts[2].textContent;
const swap2 = listElts[4].textContent;
listElts[2].textContent = swap2;
listElts[4].textContent = swap1;
假设我有一个无序列表,如何将 "Three" 移动到列表中的任何索引(位置)? 该方法应该是动态的。替换元素的文本内容不是一种选择。因为每个列表项也将包含其他元素。
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
<li>six</li>
.
.
.
<li>Hundred</li> /* Nth List Element */
</ul>
尝试了已经回答过类似问题的解决方案。但是没有得到想要的结果。
我已经试过了
- 通过jQuery 获取数组中的列表
- 使用array.each遍历数组
- 然后使用前缀将特定的 li 移动到列表的顶部
但是通过这种方法我只能将 li 元素移动到列表的顶部。不在任何想要的位置。
为此,我会使用带有基于索引的方法的构造函数:
function LiMover(liParent){
this.kids = liParent.children;
this.move = (index, beforeIndex = null)=>{
const k = this.kids, e = k[index];
if(beforeIndex === null){
liParent.appendChild(e)
}
else{
liParent.insertBefore(e, k[beforeIndex]);
}
return this;
}
}
const liMover = new LiMover(document.querySelector('ul'));
liMover.move(0); // move 0 index (one) after last index
liMover.move(5, 0); // move 5 index (one) back to 0 index
liMover.move(1, 4); // move 1 index (two) to 4 index
liMover.move(3, 5).move(2, 0); // showing return this chain
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
<li>six</li>
</ul>
const ul = document.querySelector('ul');
const items = [...ul.querySelectorAll('li')];
const moveItem = (from, to) => {
if (to > items.length - 1 || to < 0) return;
const item = items[from];
if (!item) return;
ul.removeChild(item);
ul.insertBefore(item, ul.children[to]);
}
moveItem(5, 0);
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
<li>six</li>
</ul>
当然可以解决。我已经实现了一个交换集合中两个项目的函数:
function swap(items, first, second) {
var aux = items[first].innerHTML;
items[first].innerHTML = items[second].innerHTML;
items[second].innerHTML = aux;
}
swap(document.querySelectorAll("ul > li"), 2, 4);
在此处查看 fiddle:https://jsfiddle.net/5qropsvu/
试试这个交换
const listElts = Array.from(document.querySelectorAll('li'));
const swap1 = listElts[2].textContent;
const swap2 = listElts[4].textContent;
listElts[2].textContent = swap2;
listElts[4].textContent = swap1;