, не анализируя слишком много, если это приносит что-то новое в таблицу, я обычно использую это:
function forEach(ar, func){ if(ar){for(var i=ar.length; i--; ){ func(ar[i], i); }} }
function removeElement(node){ return node.parentNode.removeChild(node); }
function insertBefore(ref){ return function(node){ return ref.parentNode.insertBefore(node, ref); }; }
function sort(items, greater){
var marker = insertBefore(items[0])(document.createElement("div")); //in case there is stuff before/after the sortees
forEach(items, removeElement);
items.sort(greater);
items.reverse(); //because the last will be first when reappending
forEach(items, insertBefore(marker));
removeElement(marker);
}
где item - массив дочерних элементов одного и того же родителя. мы удаляем, начиная с последнего, и добавляем, начиная с первого, чтобы избежать мерцания в верхней части, которая, вероятно, на экране. я обычно получаю массив предметов вроде этого:
forEachSnapshot(document.evaluate(..., 6, null), function(n, i){ items[i] = n; });