jQuery table sort

后端 未结 15 2656
温柔的废话
温柔的废话 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:30

    I came across this, and thought I'd throw in my 2 cents. Click on the column headers to sort ascending, and again to sort descending.

    • Works in Chrome, Firefox, Opera AND IE(8)
    • Only uses JQuery
    • Does alpha and numeric sorting - ascending and descending

    $('th').click(function(){
        var table = $(this).parents('table').eq(0)
        var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).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 $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB)
        }
    }
    function getCellValue(row, index){ return $(row).children('td').eq(index).text() }
    table, th, td {
        border: 1px solid black;
    }
    th {
        cursor: pointer;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <table>
        <tr><th>Country</th><th>Date</th><th>Size</th></tr>
        <tr><td>France</td><td>2001-01-01</td><td>25</td></tr>
        <tr><td><a href=#>spain</a></td><td>2005-05-05</td><td></td></tr>
        <tr><td>Lebanon</td><td>2002-02-02</td><td>-17</td></tr>
        <tr><td>Argentina</td><td>2005-04-04</td><td>100</td></tr>
        <tr><td>USA</td><td></td><td>-6</td></tr>
    </table>

    ** Update: 2018

    • For those that are interested, I've provided an ES6 Plain Javascript solution here.
    0 讨论(0)
  • 2020-11-22 09:30

    My vote! jquery.sortElements.js and simple jquery
    Very simple, very easy, thanks nandhp...

                $('th').live('click', function(){
    
                var th = $(this), thIndex = th.index(), var table = $(this).parent().parent();
    
                    switch($(this).attr('inverse')){
                    case 'false': inverse = true; break;
                    case 'true:': inverse = false; break;
                    default: inverse = false; break;
                    }
                th.attr('inverse',inverse)
    
                table.find('td').filter(function(){
                    return $(this).index() === thIndex;
                }).sortElements(function(a, b){
                    return $.text([a]) > $.text([b]) ?
                        inverse ? -1 : 1
                        : inverse ? 1 : -1;
                }, function(){
                    // parentNode is the element we want to move
                    return this.parentNode; 
                });
                inverse = !inverse;     
                });
    

    Dei uma melhorada do código
    One cod better! Function for All tables in all Th in all time... Look it!
    DEMO

    0 讨论(0)
  • 2020-11-22 09:39

    If you want to avoid all the bells and whistles then may I suggest this simple sortElements plugin. Usage:

    var table = $('table');
    
    $('.sortable th')
        .wrapInner('<span title="sort this column"/>')
        .each(function(){
    
            var th = $(this),
                thIndex = th.index(),
                inverse = false;
    
            th.click(function(){
    
                table.find('td').filter(function(){
    
                    return $(this).index() === thIndex;
    
                }).sortElements(function(a, b){
    
                    if( $.text([a]) == $.text([b]) )
                        return 0;
    
                    return $.text([a]) > $.text([b]) ?
                        inverse ? -1 : 1
                        : inverse ? 1 : -1;
    
                }, function(){
    
                    // parentNode is the element we want to move
                    return this.parentNode; 
    
                });
    
                inverse = !inverse;
    
            });
    
        });
    

    And a demo. (click the "city" and "facility" column-headers to sort)

    0 讨论(0)
  • 2020-11-22 09:39

    You can use a jQuery plugin (breedjs) that provides sort, filter and pagination:

    HTML:

    <table>
      <thead>
        <tr>
          <th sort='name'>Name</th>
          <th>Phone</th>
          <th sort='city'>City</th>
          <th>Speciality</th>
        </tr>
      </thead>
      <tbody>
        <tr b-scope="people" b-loop="person in people">
          <td b-sort="name">{{person.name}}</td>
          <td>{{person.phone}}</td>
          <td b-sort="city">{{person.city}}</td>
          <td>{{person.speciality}}</td>
        </tr>
      </tbody>
    </table>
    

    JS:

    $(function(){
      var data = {
        people: [
          {name: 'c', phone: 123, city: 'b', speciality: 'a'},
          {name: 'b', phone: 345, city: 'a', speciality: 'c'},
          {name: 'a', phone: 234, city: 'c', speciality: 'b'},
        ]
      };
      breed.run({
        scope: 'people',
        input: data
      });
      $("th[sort]").click(function(){
        breed.sort({
          scope: 'people',
          selector: $(this).attr('sort')
        });
      });
    });
    

    Working example on fiddle

    0 讨论(0)
  • 2020-11-22 09:40

    To the response of James I will only change the sorting function to make it more universal. This way it will sort text alphabetical and numbers like numbers.

    if( $.text([a]) == $.text([b]) )
        return 0;
    if(isNaN($.text([a])) && isNaN($.text([b]))){
        return $.text([a]) > $.text([b]) ? 
           inverse ? -1 : 1
           : inverse ? 1 : -1;
    }
    else{
        return parseInt($.text([a])) > parseInt($.text([b])) ? 
          inverse ? -1 : 1
          : inverse ? 1 : -1;
    }
    
    0 讨论(0)
  • 2020-11-22 09:42

    Another approach to sort HTML table. (based on W3.JS HTML Sort)

    /* Facility Name */
    $('#bioTable th:eq(0)').addClass("control-label pointer");
    /* Phone # */
    $('#bioTable th:eq(1)').addClass("not-allowed");
    /* City */
    $('#bioTable th:eq(2)').addClass("control-label pointer");
    /* Specialty */
    $('#bioTable th:eq(3)').addClass("not-allowed");
    
    
    var collection = [{
      "FacilityName": "MinION",
      "Phone": "999-8888",
      "City": "France",
      "Specialty": "Genetic Prediction"
    }, {
      "FacilityName": "GridION X5",
      "Phone": "999-8812",
      "City": "Singapore",
      "Specialty": "DNA Assembly"
    }, {
      "FacilityName": "PromethION",
      "Phone": "929-8888",
      "City": "San Francisco",
      "Specialty": "DNA Testing"
    }, {
      "FacilityName": "iSeq 100 System",
      "Phone": "999-8008",
      "City": "Christchurch",
      "Specialty": "gDNA-mRNA sequencing"
    }]
    
    $tbody = $("#bioTable").append('<tbody></tbody>');
    
    for (var i = 0; i < collection.length; i++) {
      $tbody = $tbody.append('<tr class="item"><td>' + collection[i]["FacilityName"] + '</td><td>' + collection[i]["Phone"] + '</td><td>' + collection[i]["City"] + '</td><td>' + collection[i]["Specialty"] + '</td></tr>');
    }
    .control-label:after {
      content: "*";
      color: red;
    }
    
    .pointer {
      cursor: pointer;
    }
    
    .not-allowed {
      cursor: not-allowed;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://www.w3schools.com/lib/w3.js"></script>
    <link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
    <p>Click the <strong>table headers</strong> to sort the table accordingly:</p>
    
    <table id="bioTable" class="w3-table-all">
      <thead>
        <tr>
          <th onclick="w3.sortHTML('#bioTable', '.item', 'td:nth-child(1)')">Facility Name</th>
          <th>Phone #</th>
          <th onclick="w3.sortHTML('#bioTable', '.item', 'td:nth-child(3)')">City</th>
          <th>Specialty</th>
        </tr>
      </thead>
    </table>

    0 讨论(0)
提交回复
热议问题