javascript sort of HTML elements

There are much better ways to sort.

  1. You need a comparison function that returns the right values: -1, 0, and 1.
  2. localeCompare() is such a comparison function.
  3. You can just move the DOM elements around rather than regenerating the HTML.
  4. You can get the LI elements directly in the original selector.
  5. "#table1" is a more efficient selector than "ol#table1".

I would suggest this:

$("div#btn").click(function() {
    var sort_by_name = function(a, b) {
        return a.innerHTML.toLowerCase().localeCompare(b.innerHTML.toLowerCase());
    }

    var list = $("#table1 > li").get();
    list.sort(sort_by_name);
    for (var i = 0; i < list.length; i++) {
        list[i].parentNode.appendChild(list[i]);
    }
});​

Which you can see work here: http://jsfiddle.net/jfriend00/yqd3w/


A custom compareFunction needs to return -1, 0 or 1.

function sort_by_name(a, b) {
    var sa = a.innerHTML.toLowerCase(), sb = b.innerHTML.toLowerCase();
    return sb<sa ? -1 : sb>sa ? 1 : 0;
}

var sort_by_name = function(a, b) {
    return $(a).text().toLowerCase().localeCompare($(b).text().toLowerCase());
}

You can use localeCompare instead to make things more elegant and workable.

See jsfiddle http://jsfiddle.net/Qww87/11/