J'ai ce 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>
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.
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