Comment puis-je modifier l'ordre des éléments enfants dans JS?

J'ai ce html:

<table> <tr> <td> Set right order </td> <td> <span style = "display: block;">asd | <a href = '#' onclick = "moveChoiceTo(this, -1);">&uarr;</a><a href = '#' onclick = "moveChoiceTo(this, 1);">&darr;</a></span> <span style = "display: block;">dsa | <a href = '#' onclick = "moveChoiceTo(this, -1);">&uarr;</a><a href = '#' onclick = "moveChoiceTo(this, 1);">&darr;</a></span> <span style = "display: block;">qwe | <a href = '#' onclick = "moveChoiceTo(this, -1);">&uarr;</a><a href = '#' onclick = "moveChoiceTo(this, 1);">&darr;</a></span> <span style = "display: block;">ewq | <a href = '#' onclick = "moveChoiceTo(this, -1);">&uarr;</a><a href = '#' onclick = "moveChoiceTo(this, 1);">&darr;</a></span> </td> </tr> </table> 

Et ce 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 } 

Je suis exceptionnel que l' splice n'est pas prise en charge, mais cela est-il censé être un tableau et soutenir cette méthode? Quelles autres façons de changer l'ordre des enfants?

Je vais ajouter la réponse avec une approche plus simple (et meilleure):

 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) } } 

L'idée clé est d'utiliser la méthode insertBefore correctement. Vous n'avez pas besoin de supprimer quoi que ce soit de DOM.

Demo: http://jsfiddle.net/dq8a0ttt/

Splice n'est pas supproqué dans HTMLCollection, vous devez utiliser .removeChild et .insert avant quelque chose comme ceci:

 var before = td.children[curr_index + direction]; var child = td.children[curr_index]; td.removeChild(child); td.insertBefore(child, before); //attempt to insert it