Reputation: 37
How can I change order in which nodes appear inside their parent? Let's say I want to swap nodes with index 5 and 4.
Upvotes: 0
Views: 150
Reputation: 7316
var XX:XML =
<root>
<node index="0" />
<node index="1" />
<node index="2" />
<node index="3" />
<node index="4" />
<node index="5" />
<node index="6" />
<node index="7" />
<node index="8" />
<node index="9" />
</root>
var XL:XMLList = XX.children();
XX.insertChildAfter(XL[5], XL[4]);
var XXL:XMLList = XX.children();
trace(XX.toXMLString());
trace(XL[4] === XXL[4]);
trace(XL[4] === XXL[5]);
trace(XL[4] === XXL[6]);
P.S. Also, if you wondered how to remove a child node:
delete XL[0];
trace(XX.toXMLString());
UPD: The following code takes the bug we've found into account and works for any Flash Player version.
var XX:XML =
<root>
<node index="0" />
<node index="1" />
<node index="2" />
<node index="3" />
<node index="4" />
<node index="5" />
<node index="6" />
<node index="7" />
<node index="8" />
<node index="9" />
</root>
swapNodes(XX, 4, 5);
swapNodes(XX, 0, 9);
trace(XX.toXMLString());
function swapNodes(target:XML, indexa:int, indexb:int):void
{
// Sanity checks.
if (!target) return;
if (indexa < 0) return;
if (indexb < 0) return;
if (indexa == indexb) return;
var anIndex:int;
// Lets say indexa must be < indexb.
// Just for our own convenience.
if (indexb < indexa)
{
anIndex = indexa;
indexa = indexb;
indexb = anIndex;
}
var aList:XMLList = target.children();
// Last check.
if (indexb >= aList.length()) return;
var aNode:XML = aList[indexa];
var bNode:XML = aList[indexb];
var abNode:XML = aList[indexb - 1];
delete aList[indexb];
target.insertChildBefore(aNode, bNode)
if (indexb - indexa > 1)
{
delete aList[indexa];
target.insertChildAfter(abNode, aNode);
}
}
Upvotes: 3