I have this html:
<table>
<tr>
<td>
Set right order
</td>
<td>
<span style = "display: block;">asd | <a href = '#' onclick = "moveChoiceTo(this, -1);">↑</a><a href = '#' onclick = "moveChoiceTo(this, 1);">↓</a></span>
<span style = "display: block;">dsa | <a href = '#' onclick = "moveChoiceTo(this, -1);">↑</a><a href = '#' onclick = "moveChoiceTo(this, 1);">↓</a></span>
<span style = "display: block;">qwe | <a href = '#' onclick = "moveChoiceTo(this, -1);">↑</a><a href = '#' onclick = "moveChoiceTo(this, 1);">↓</a></span>
<span style = "display: block;">ewq | <a href = '#' onclick = "moveChoiceTo(this, -1);">↑</a><a href = '#' onclick = "moveChoiceTo(this, 1);">↓</a></span>
</td>
</tr>
</table>
And this JS:
function moveChoiceTo(elem_choice, direction)
{
var curr_index = -1; //index of elem that we should move
var td = elem_choice.parentElement.parentElement; //link to TD
for (var i = 0; i < td.children.length; i++) //determine index of elem that called this function
if (td.children[i].children[0] == elem_choice)
{
curr_index = i;
break;
}
if (curr_index == -1)
return;
if (curr_index == 0 && direction < 0) //if nowhere to move
return;
if (curr_index == td.children.length - 1 && direction > 0) //if nowhere to move
return;
var curr_child = td.children[curr_index]; //save current elem into temp var
td.children.splice(curr_index, 1); //here I getting exception that splice isn't supported by object, but arent this is array?
td.children.splice(curr_index + direction, 0, curr_child); //attempt to insert it
}
I getting exception that splice
isn't supported, but this supposed to be an array and support this method?
What other ways I have to change children order?
I will add the answer with simpler (and better) approach:
function moveChoiceTo(elem_choice, direction) {
var span = elem_choice.parentNode,
td = span.parentNode;
if (direction === -1 && span.previousElementSibling) {
td.insertBefore(span, span.previousElementSibling);
} else if (direction === 1 && span.nextElementSibling) {
td.insertBefore(span, span.nextElementSibling.nextElementSibling)
}
}
The key idea is using insertBefore method properly. You also don't need to remove anything from DOM.
Splice is not supproted in HTMLCollection, you need to use .removeChild and .insertBefore something like this:
var before = td.children[curr_index + direction];
var child = td.children[curr_index];
td.removeChild(child);
td.insertBefore(child, before); //attempt to insert it
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With