如何最简单地交换子节点的顺序?
例如,我想让childNode[3]成为childNode[4],反之亦然。
如何最简单地交换子节点的顺序?
例如,我想让childNode[3]成为childNode[4],反之亦然。
.insertBefore()
方法可以将节点从当前位置移动到其他位置(从而实现移动):childNode[4].parentNode.insertBefore(childNode[4], childNode[3]);
.before
或 .after
!这是原生JS!
childNode[3].before(childNode[4]);
或者childNode[4].after(childNode[3]);
为了获得更长久的交换体验,请尝试:
function swap(node1, node2) {
const afterNode2 = node2.nextElementSibling;
const parent = node2.parentNode;
node1.replaceWith(node2);
parent.insertBefore(node1, afterNode2);
}
即使父元素不匹配,这个应该也能工作。
Can I Use - 2021年7月95%的浏览器支持
if (node1 === afterNode2) parent.insertBefore(node1, node2); else ...
请参见http://jsfiddle.net/cayhorstmann/c9uqme45。 - cayhorstmannjfriend00的回答并没有真正交换元素(它只能“交换”相邻且在同一父节点下的元素)。这没关系,因为这就是问题所在。
这个例子通过克隆元素来交换它们,而不管它们的位置和DOM级别:
// Note: Cloned copy of element1 will be returned to get a new reference back
function exchangeElements(element1, element2)
{
var clonedElement1 = element1.cloneNode(true);
var clonedElement2 = element2.cloneNode(true);
element2.parentNode.replaceChild(clonedElement1, element2);
element1.parentNode.replaceChild(clonedElement2, element1);
return clonedElement1;
}
编辑:新增了返回新引用的部分(如果你想保留引用,比如访问"parentNode"属性时(否则会丢失))。例如:e1 = exchangeElements(e1, e2);
function swapDom(a,b)
{
var aParent = a.parentNode;
var bParent = b.parentNode;
var aHolder = document.createElement("div");
var bHolder = document.createElement("div");
aParent.replaceChild(aHolder,a);
bParent.replaceChild(bHolder,b);
aParent.replaceChild(b,aHolder);
bParent.replaceChild(a,bHolder);
}
使用虚拟兄弟作为临时位置标记,然后使用.before
(或.after
)方法。这适用于任何兄弟节点(不仅限于相邻节点),并且还保留事件处理程序。
function swap(a, b) {
let dummy = document.createElement("span")
a.before(dummy)
b.before(a)
dummy.replaceWith(b)
}
<div id="div1">A</div>
<div id="div2">B</div>
<p> parent<div id="div3">C</div>
</p>
<button onclick="swap(div1, div3)">swap</button>
就像使用临时变量交换变量一样,如果缺少更复杂的方法。
function swapNodes(node1, node2) {
const temp = document.createComment('')
node2.replaceWith(temp)
node1.replaceWith(node2)
temp.replaceWith(node1)
}
实现节点的真正交换,不需要使用cloneNode:
<div id="d1">D1</div>
<div id="d2">D2</div>
<div id="d3">D3</div>
With SwapNode function (using PrototypeJS):
function SwapNode(N1, N2) {
N1 = $(N1);
N2 = $(N2);
if (N1 && N2) {
var P1 = N1.parentNode;
var T1 = document.createElement("span");
P1.insertBefore(T1, N1);
var P2 = N2.parentNode;
var T2 = document.createElement("span");
P2.insertBefore(T2, N2);
P1.insertBefore(N2, T1);
P2.insertBefore(N1, T2);
P1.removeChild(T1);
P2.removeChild(T2);
}
}
SwapNode('d1', 'd2');
SwapNode('d2', 'd3');
将会产生:
<div id="d3">D3</div>
<div id="d1">D1</div>
<div id="d2">D2</div>
function swapChildren(parentElement, index1, index2) {
if (index1 === index2)
return
if (index1 > index2) {
const temp = index1
index1 = index2
index2 = temp
}
const { [index1]: element1, [index2]: element2 } = parentElement.childNodes
if (index2 === index1 + 1) {
parentElement.insertBefore(element2, element1)
} else {
const reference = element2.nextSibling
parentElement.replaceChild(element2, element1)
parentElement.insertBefore(element1, reference)
}
}
尝试这个方法:
获取父元素
两个元素
存储在顺序中最后一个节点的.nextSibling
,例如:[1,2,3,4] => 我们想要交换 3 和 2,然后存储 3 的 nextSibling,即 '4'。
.insertBefore(3,2);
.insertBefore(2,nextSibling);
您可以像这样将DOM元素与其下一个兄弟元素交换:
el.parentNode.insertBefore(el, el.nextElementSibling)
或者像这样与其前一个兄弟元素一起:
el.parentNode.insertBefore(el, el.previousElementSibling)
如果您的内容是动态的,您可能需要检查el.nextElementSibling
或el.previousElementSibling
是否为null。
childnode [3]
和childnode [4]
的,它们肯定是相邻的兄弟姐妹,并且显然对于提问者来说已经完美地运作了(因为他们接受了这个答案)。这确实回答了提问者想要知道的问题。 - jfriend00