Вы используете оператор for-in
, что означает, что у вас нет никаких гарантий относительно числового порядка, которого вы можете ожидать.
Вместо этого используйте оператор for
:
for (var i = 0, len = items.length; i < len; i++) {
Кроме того, имейте в виду, что items
является «живым списком», поэтому изменения, которые вы вносите в DOM, отражаются в списке, а сам список неизменяем, поскольку он не является массивом.
Если вы хотите сдвинуть элемент на один индекс назад, используйте insertBefore
.
Примерно так:
items[i].parentNode.insertBefore( items[i],items[i-1] );
Пример: http://jsfiddle.net/d25a3/
function MoveItem(id, direction) {
var ul = document.getElementById('GroupBy');
var items = ul.getElementsByTagName('li');
var counter = 0;
var previousItem = null;
var moveNextItemUp = false;
for (var i = 0, len = items.length; i < len; i++) {
var item = items[i];
if (item.id == id) {
if (direction == 1) {
moveNextItemUp = true;
} else if ((direction == -1) || (moveNextItemUp == true)) {
item.parentNode.insertBefore( item,items[i-1] );
break;
}
}
previousItem = item;
counter = counter + 1;
}
}
Кроме того, не уверен, каково полное намерение кода, но может показаться, что вы могли бы упростить что-то вроде этого:
Пример: http://jsfiddle.net/d25a3/1/
<!-- pass the parent node of the item clicked as the first argument -->
<li id="Two">
<a href="#" onclick="MoveItem(this.parentNode, -1)"> ^ </a>two<a href="#" onclick="MoveItem('Two', 1)"> V </a>
</li>
И полностью избавиться от цикла:
function MoveItem(item, direction) {
var counter = 0;
var previousItem = null;
var moveNextItemUp = false;
if (direction == 1) {
moveNextItemUp = true;
} else if ((direction == -1) || (moveNextItemUp == true)) {
// get the previous <li> element
var prev = item.previousSibling
while( prev && prev.nodeType != 1 && (prev = prev.previousSibling));
item.parentNode.insertBefore(item, prev);
}
previousItem = item;
counter = counter + 1;
}