jQuery table sort

后端 未结 15 2908
温柔的废话
温柔的废话 2020-11-22 09:00

I have a very simple HTML table with 4 columns:

Facility Name, Phone #, City, Specialty

I want the user to be able to sort by Faci

15条回答
  •  鱼传尺愫
    2020-11-22 09:46

    @Nick Grealy's answer is great, but it does not take into account possible rowspan attributes of the table header cells (and probably the other answers don't do it either). Here is an improvement of the @Nick Grealy's answer which fixes that. Based on this answer too (thanks @Andrew Orlov).

    I've also replaced the $.isNumeric function with a custom one (thanks @zad) to make it work with older jQuery versions.

    To activate it, add class="sortable" to the

    tag.

    $(document).ready(function() {
    
        $('table.sortable th').click(function(){
            var table = $(this).parents('table').eq(0);
            var column_index = get_column_index(this);
            var rows = table.find('tbody tr').toArray().sort(comparer(column_index));
            this.asc = !this.asc;
            if (!this.asc){rows = rows.reverse()};
            for (var i = 0; i < rows.length; i++){table.append(rows[i])};
        })
    
    });
    
    function comparer(index) {
        return function(a, b) {
            var valA = getCellValue(a, index), valB = getCellValue(b, index);
            return isNumber(valA) && isNumber(valB) ? valA - valB : valA.localeCompare(valB);
        }
    }
    function getCellValue(row, index){ return $(row).children('td').eq(index).html() };
    
    function isNumber(n) {
      return !isNaN(parseFloat(n)) && isFinite(n);
    }
    
    function get_column_index(element) {
        var clickedEl = $(element);
        var myCol = clickedEl.closest("th").index();
        var myRow = clickedEl.closest("tr").index();
        var rowspans = $("th[rowspan]");
        rowspans.each(function () {
            var rs = $(this);
            var rsIndex = rs.closest("tr").index();
            var rsQuantity = parseInt(rs.attr("rowspan"));
            if (myRow > rsIndex && myRow <= rsIndex + rsQuantity - 1) {
                myCol++;
            }
        });
        // alert('Row: ' + myRow + ', Column: ' + myCol);
        return myCol;
    };
    

    提交回复
    热议问题