2016-02-12 53 views
0

各种tablesorting jQuery插件周围碴后的表行,我就翻过一个它的,因为它符合下列要求完美的作品:我能在这个jQuery插件更改为包含排序的,这是隐藏

  • 排序正确日期
  • 排序号码正确
  • 排序号的话(如:一,二,三)妥善
  • 它排序的DOM知道地。这意味着如果您更新表格单元格的内容,则当您单击表格标题对该列进行排序时,它会识别新值,而不是对首次加载页面时的内容进行排序。 (此功能是特别难找到,因为排序时流行tablesorters不要在运行时识别更改)

我遇到的唯一问题是,它似乎这是可见的行唯一的排序。我希望它可以对整个表进行排序,而不仅仅是可见的表,同时保持上述所有功能(尤其是DOM知晓部分),因为这将用于数据可能由用户更新的表上,并随后进行分类。

我会开源这个jQuery插件,所以我没有在这里分享代码的问题。这里的jQuery代码是我的,我用于排序部分的插件如下:http://www.kryogenix.org/code/browser/sorttable

以下代码演示了此问题。您可以单击任意单元格以进行内联编辑,并可以通过这种方式更改DOM部分。

(function($) { 
 
    $.fn.tables = function(options) { 
 

 
    var settings = $.extend({ 
 
     page: 0, 
 
     pageCount: 10, 
 
    }, options); 
 

 
    $thead = this.find('thead'); 
 
    $tbody = this.find('tbody'); 
 
    $tfoot = this.find('tfoot > tr > td').attr('colspan', $tbody.find('tr')[0].cells.length); 
 

 
    var align = ''; 
 
    for (var content_align = 0; content_align < $thead.find('tr')[0].cells.length; content_align++) { 
 
     align = $($thead.find('tr')[0].cells[content_align]).attr('data-align'); 
 
     if (align === undefined) { 
 

 
     } else { 
 
     $tbody.find('tr > td:nth-child(' + (content_align + 1) + ')').each(function() { 
 
      $(this).addClass(align); 
 
     }); 
 
     } 
 
    } 
 

 
    var numRows = $tbody.find('tr').length; 
 
    var numPages = Math.ceil(numRows/settings.pageCount); 
 

 
    this.bind('repaginate', function() { 
 
     $tbody.find('tr').removeClass('visible').slice(settings.page * settings.pageCount, (settings.page + 1) * settings.pageCount).addClass('visible'); 
 
    }); 
 
    this.trigger('repaginate'); 
 

 
    $tfoot.find('td').html(''); 
 
    for (var page = 0; page < numPages; page++) { 
 
     $('<a></a>').text(page + 1).bind('click', { 
 
     newPage: page 
 
     }, function(event) { 
 
     settings.page = event.data['newPage']; 
 
     $(this).trigger('repaginate'); 
 
     $(this).addClass('active').siblings().removeClass('active'); 
 
     if (options.pageChanged !== undefined) { 
 
      options.pageChanged(this); 
 
     } 
 
     }).appendTo($tfoot); //.addClass('clickable'); 
 
    } 
 

 
    $tbody.find('td').click(function() { 
 
     if (options.cellClick !== undefined) { 
 
     if ($(this).hasClass('editing') == false) { 
 
      var col = $(this).parent().children().index($(this)); 
 
      var row = $(this).parent().parent().children().index($(this).parent()) 
 

 
      var type = $($thead.find('tr')[0].cells[col]).attr('data-type'); 
 
      var typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values'); 
 
      var align = $($thead.find('tr')[0].cells[col]).attr('data-align'); 
 

 
      console.log(type); 
 

 
      $(this).addClass('editing'); 
 
      options.cellClick(this, true, col, row); 
 
      switch (type) { 
 
      case 'text': 
 
       $(this).html('<input type="text" value="' + $(this).text() + '">'); 
 
       $(this).find('input').focus().blur(function() { 
 
       $(this).parent().removeClass('editing'); 
 
       options.cellClick($(this).parent(), false, col, row); 
 
       $(this).parent().html($(this).prop('value')); 
 
       }); 
 
       break; 
 
      case 'textarea': 
 
       _html = $(this).html(); 
 
       $(this).html('<textarea type="text">' + $(this).html().replace(/\<br\\?>/g, "\n") + '</textarea>'); 
 
       $(this).find('textarea').focus().blur(function() { 
 
       $(this).parent().removeClass('editing'); 
 
       options.cellClick($(this).parent(), false, col, row); 
 
       $(this).parent().html($(this).prop('value').replace(/\n/g, "<br>")); 
 
       }); 
 
       break; 
 
      case 'number': 
 
       $(this).html('<input type="number" value="' + $(this).text() + '">'); 
 
       $(this).find('input').focus().blur(function() { 
 
       $(this).parent().removeClass('editing'); 
 
       options.cellClick($(this).parent(), false, col, row); 
 
       $(this).parent().html($(this).prop('value')); 
 
       }); 
 
       break; 
 
      case 'currency': 
 
       $(this).html('<input type="currency" value="' + $(this).text() + '">'); 
 
       $(this).find('input').focus().blur(function() { 
 
       $(this).parent().removeClass('editing'); 
 
       options.cellClick($(this).parent(), false, col, row); 
 
       $(this).parent().html($(this).prop('value')); 
 
       }); 
 
       break; 
 
      case 'select': 
 
       if (typevalues === undefined) { 
 
       console.log('You must define both \'data-type\' and \'data-values\' for select elements. \'data-values\' should be a comma delimited array of the items to be displayed in the drop-down'); 
 
       } else { 
 
       typevalues = typevalues.split(','); 
 
       _html = '<select>'; 
 
       for (var i = 0; i < typevalues.length; i++) { 
 
        if (typevalues[i] == $(this).text()) { 
 
        _html = _html + '<option value="' + typevalues[i] + '" selected>' + typevalues[i] + '</option>'; 
 
        } else { 
 
        _html = _html + '<option value="' + typevalues[i] + '">' + typevalues[i] + '</option>'; 
 
        } 
 
       } 
 
       _html = _html + '</select>'; 
 
       $(this).html(_html); 
 
       $(this).find('select').focus().change(function() { 
 
        $(this).parent().removeClass('editing'); 
 
        options.cellClick($(this).parent(), false, col, row); 
 
        $(this).parent().html($(this).prop('value')); 
 
       }).blur(function() { 
 
        $(this).parent().removeClass('editing'); 
 
        options.cellClick($(this).parent(), false, col, row); 
 
        $(this).parent().html($(this).prop('value')); 
 
       }); 
 
       } 
 
       break; 
 
      case 'checkbox': 
 
       if (typevalues === undefined) { 
 
       $($thead.find('tr')[0].cells[col]).attr('data-values', 'T,F'); 
 
       typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values'); 
 
       console.log('You can define the \'data-values\' parameter for checkbox elements. \'data-values\' should be a comma delimited array of two items. The first item is the \'checked\' value, and the second item is the \'unchecked\' value. Defaults to \'T,F\''); 
 
       } 
 
       typevalues = typevalues.split(','); 
 
       _html = ''; 
 
       if (typevalues[0] == $(this).text()) { 
 
       _html = '<input type="checkbox" checked="checked">'; 
 
       } else { 
 
       _html = '<input type="checkbox">'; 
 
       } 
 
       $(this).html(_html); 
 
       $(this).find('input').focus().click(function() { 
 
        $(this).parent().removeClass('editing'); 
 
        options.cellClick($(this).parent(), false, col, row); 
 
        typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values').split(','); 
 
        if (this.checked) { 
 
        $(this).parent().html(typevalues[0]); 
 
        } else { 
 
        $(this).parent().html(typevalues[1]); 
 
        } 
 
       }) 
 
       .blur(function() { 
 
        $(this).parent().removeClass('editing'); 
 
        options.cellClick($(this).parent(), false, col, row); 
 
        typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values').split(','); 
 
        if (this.checked) { 
 
        $(this).parent().html(typevalues[0]); 
 
        } else { 
 
        $(this).parent().html(typevalues[1]); 
 
        } 
 
       }); 
 
       break; 
 
      } 
 
     } 
 
     } 
 
    }) 
 

 
    this.addClass('sortable'); 
 

 
    $tfoot.find('a:first-child').addClass('active'); 
 

 
    return this; 
 
    }; 
 
}(jQuery));
:root { 
 
    --tables-even-color: #CDEDF7; 
 
    --tables-odd-color: #90C3D4; 
 
} 
 
.tables { 
 
    border-collapse: collapse; 
 
} 
 
/* Header */ 
 

 
.tables thead > tr { 
 
    background: #3E8096; 
 
    color: #CDEDF7; 
 
} 
 
.tables thead > tr > td { 
 
    padding: 4px; 
 
    padding-left: 8px; 
 
    padding-right: 10px; 
 
} 
 
.tables thead > tr > td:hover { 
 
    background: #CDEDF7 !important; 
 
    color: #3E8096 !important; 
 
} 
 
/* Footer */ 
 

 
.tables tfoot > tr { 
 
    background: #3E8096; 
 
    color: #CDEDF7; 
 
} 
 
.tables tfoot > tr > td > a { 
 
    border: 1px solid #3E8096; 
 
    padding: 4px; 
 
    cursor: pointer; 
 
    display: inline-block; 
 
} 
 
.tables tfoot > tr > td > a:hover { 
 
    border: 1px solid #CDEDF7; 
 
} 
 
.tables tfoot > tr > td > a.active { 
 
    background: #CDEDF7; 
 
    color: #3E8096; 
 
} 
 
/* Rows */ 
 

 
.tables tbody > tr:nth-child(even) { 
 
    background: #CDEDF7; 
 
    color: #90C3D4; 
 
} 
 
.tables tbody > tr:nth-child(even):hover { 
 
    background: #18EAF5; 
 
    color: #90C3D4; 
 
} 
 
.tables tbody > tr:nth-child(odd) { 
 
    background: #90C3D4; 
 
    color: #CDEDF7; 
 
} 
 
.tables tbody > tr:nth-child(odd):hover { 
 
    background: #18EAF5; 
 
    color: #90C3D4; 
 
} 
 
.tables tbody > tr { 
 
    display: none; 
 
} 
 
.tables tbody > tr.visible { 
 
    display: table-row !important; 
 
} 
 
.tables tbody > tr > td { 
 
    padding: 5px; 
 
    cursor: default; 
 
} 
 
/* Cell Content */ 
 

 
.tables tbody > tr > td.center { 
 
    text-align: center; 
 
} 
 
.tables tbody > tr > td.center > input { 
 
    text-align: center; 
 
} 
 
.tables tbody > tr > td.center > textarea { 
 
    text-align: center; 
 
} 
 
.tables tbody > tr > td.right { 
 
    text-align: right; 
 
} 
 
.tables tbody > tr > td.right > input { 
 
    text-align: right; 
 
} 
 
.tables tbody > tr > td.right > textarea { 
 
    text-align: right; 
 
}
<html> 
 

 
<head> 
 
    <script src="https://code.jquery.com/jquery-2.2.0.min.js" type="text/javascript"></script> 
 
    <script src="http://www.kryogenix.org/code/browser/sorttable/sorttable.js" type="text/javascript"></script> 
 
    <link rel="stylesheet" type="text/css" href="jquery.tables.css"> 
 
    <script type="text/javascript"> 
 
    $(document).ready(function() { 
 
     $table = $('.tables').tables({ 
 
     pageChanged: function(item) { 
 
      console.log($(item).text()); 
 
     }, 
 
     cellClick: function(item, focused, column, row) { 
 
      console.log('COLUMN: ' + column + ', ROW: ' + row); 
 
     } 
 
     }); 
 

 
    }) 
 
    </script> 
 

 
</head> 
 

 
<body> 
 
    <table class="tables"> 
 
    <thead> 
 
     <tr> 
 
     <td data-type="textarea">Column 1</td> 
 
     <td data-type="checkbox" data-align="center">Column 2</td> 
 
     <td data-type="select" data-values="Apples,Oranges,Bananas">Column 3</td> 
 
     </tr> 
 
    </thead> 
 

 
    <tbody> 
 
     <tr> 
 
     <td>aa</td> 
 
     <td>ab</td> 
 
     <td>Apples</td> 
 
     </tr> 
 

 
     <tr> 
 
     <td>ac</td> 
 
     <td>ad</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 

 
     <tr> 
 
     <td>bb 
 
      <br>ccc<b>newline</b> 
 
     </td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>aaa</td> 
 
     <td>T</td> 
 
     <td>Apples</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 
     <tr> 
 
     <td>bbccc</td> 
 
     <td>F</td> 
 
     <td>Oranges</td> 
 
     </tr> 
 

 
    </tbody> 
 

 
    <tfoot> 
 
     <tr> 
 
     <td colspan="1"></td> 
 
     </tr> 
 
    </tfoot> 
 
    </table> 
 
</body> 
 

 
</html>

奖励:如果你能弄清楚如何正确的CSS交替行的颜色后进行排序,这将是真棒(不添加东西,每个TD ...基本上,只是“刷新'的CSS不知何故)

回答

0

找出如何做在DOM中的排序,同时意识到对底层元素的任何更改,但我仍然无法将排序恢复到原始顺序(未排序)。

以下是我想出迄今:

(function ($) { 
 
\t $.fn.tables = function(options) { 
 
\t \t 
 
\t \t var settings = $.extend({ 
 
\t \t \t page: 0, 
 
\t \t \t pageCount: 10, 
 
\t \t }, options); 
 

 
\t \t this.addClass('sortable'); 
 
\t \t 
 
\t \t $thead = this.find('thead'); 
 
\t \t $tbody = this.find('tbody'); 
 
\t \t $tfoot = this.find('tfoot > tr > td').attr('colspan', $tbody.find('tr')[0].cells.length); 
 

 
\t \t var align = ''; 
 
\t \t for(var content_align = 0; content_align < $thead.find('tr')[0].cells.length; content_align++) { 
 
\t \t \t align = $($thead.find('tr')[0].cells[content_align]).attr('data-align'); 
 
\t \t \t if(align === undefined) { 
 

 
\t \t \t } else { 
 
\t \t \t \t $tbody.find('tr > td:nth-child(' + (content_align + 1) + ')').each(function(){ 
 
\t \t \t \t \t $(this).addClass(align); 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t } 
 
\t \t 
 
\t \t var numRows = $tbody.find('tr').length; 
 
\t \t var numPages = Math.ceil(numRows/settings.pageCount); 
 

 
\t \t this.bind('repaginate', function() { 
 
\t \t \t $tbody.find('tr').removeClass('visible').slice(settings.page * settings.pageCount, (settings.page + 1) * settings.pageCount).addClass('visible'); 
 
\t \t }); 
 
\t \t this.trigger('repaginate'); 
 

 
\t \t $thead.find('tr > td').click(function() { 
 
\t \t \t var rows = $tbody.find('tr').get(); 
 
\t \t \t var col = $(this).parent().children().index($(this)); 
 
\t \t \t col++; 
 

 
\t \t \t if($(this).hasClass('desc')) { 
 
\t \t \t \t $(this).removeClass('desc'); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t if($(this).hasClass('asc')) { 
 
\t \t \t \t $(this).removeClass('asc').addClass('desc'); 
 
\t \t \t \t rows.sort(function(a, b) { 
 
\t \t \t \t alert(col); 
 
\t \t \t \t var A = $(a).children('td:nth-child(' + col + ')').eq(0).text().toUpperCase(); 
 
\t \t \t \t var B = $(b).children('td:nth-child(' + col + ')').eq(0).text().toUpperCase(); 
 

 
\t \t \t \t if($.isNumeric(A) || $.isNumeric(B)) { A = parseInt(A); B = parseInt(B); } 
 

 
\t \t \t \t if(A > B) { return -1; } 
 
\t \t \t \t if(A < B) { return 1; } 
 
\t \t \t \t return 0; 
 
\t \t \t \t }); 
 
\t \t \t } else { 
 
\t \t \t \t $(this).addClass('asc'); 
 
\t \t \t \t rows.sort(function(a, b) { 
 
\t \t \t \t alert(col); 
 
\t \t \t \t var A = $(a).children('td:nth-child(' + col + ')').eq(0).text().toUpperCase(); 
 
\t \t \t \t var B = $(b).children('td:nth-child(' + col + ')').eq(0).text().toUpperCase(); 
 

 
\t \t \t \t if($.isNumeric(A) || $.isNumeric(B)) { A = parseInt(A); B = parseInt(B); } 
 

 
\t \t \t \t if(A < B) { return -1; } 
 
\t \t \t \t if(A > B) { return 1; } 
 
\t \t \t \t return 0; 
 
\t \t \t \t }); 
 
\t \t \t } 
 

 
\t \t \t $(this).siblings().removeClass('asc').removeClass('desc'); 
 
\t \t \t 
 
\t \t \t $.each(rows, function(index, row) { 
 
\t \t \t $tbody.append(row); 
 
\t \t \t }); 
 
\t \t \t 
 
\t \t \t $tbody.find('tr').removeClass('visible').slice(settings.page * settings.pageCount, (settings.page + 1) * settings.pageCount).addClass('visible'); 
 
\t \t \t 
 
\t \t }); 
 
\t \t 
 
\t \t 
 
\t \t $tfoot.find('td').html(''); 
 
\t \t for (var page = 0; page < numPages; page++) { 
 
\t \t \t $('<a></a>').text(page + 1).bind('click', { 
 
\t \t \t \t newPage: page 
 
\t \t \t }, function(event) { 
 
\t \t \t \t settings.page = event.data['newPage']; 
 
\t \t \t \t $(this).trigger('repaginate'); 
 
\t \t \t \t $(this).addClass('active').siblings().removeClass('active'); 
 
\t \t \t \t if(options.pageChanged !== undefined) { 
 
\t \t \t \t \t options.pageChanged(this); 
 
\t \t \t \t } 
 
\t \t \t }).appendTo($tfoot); //.addClass('clickable'); 
 
\t \t } 
 
\t \t 
 
\t \t $tbody.find('td').click(function() { 
 
\t \t \t if(options.cellClick !== undefined) { 
 
\t \t \t \t if($(this).hasClass('editing') == false) { 
 
\t \t \t \t \t var col = $(this).parent().children().index($(this)); 
 
\t \t \t \t \t var row = $(this).parent().parent().children().index($(this).parent()) 
 

 
\t \t \t \t \t var type = $($thead.find('tr')[0].cells[col]).attr('data-type'); 
 
\t \t \t \t \t var typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values'); 
 
\t \t \t \t \t var align = $($thead.find('tr')[0].cells[col]).attr('data-align'); 
 
\t \t \t \t \t 
 
\t \t \t \t \t console.log(type); 
 
\t \t \t \t \t 
 
\t \t \t \t \t $(this).addClass('editing'); 
 
\t \t \t \t \t options.cellClick(this, true, col, row); 
 
\t \t \t \t \t switch(type) { 
 
\t \t \t \t \t \t case 'text': 
 
\t \t \t \t \t \t \t $(this).html('<input type="text" value="' + $(this).text() + '">'); 
 
\t \t \t \t \t \t \t $(this).find('input').focus().blur(function(){ 
 
\t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t $(this).parent().html($(this).prop('value')); 
 
\t \t \t \t \t \t \t }); 
 
\t \t \t \t \t \t \t break; 
 
\t \t \t \t \t \t case 'textarea': 
 
\t \t \t \t \t \t \t _html = $(this).html(); 
 
\t \t \t \t \t \t \t $(this).html('<textarea type="text">' + $(this).html().replace(/\<br\\?>/g, "\n") + '</textarea>'); 
 
\t \t \t \t \t \t \t $(this).find('textarea').focus().blur(function(){ 
 
\t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t $(this).parent().html($(this).prop('value').replace(/\n/g,"<br>")); 
 
\t \t \t \t \t \t \t }); 
 
\t \t \t \t \t \t \t break; \t \t \t \t \t \t 
 
\t \t \t \t \t \t case 'number': 
 
\t \t \t \t \t \t \t $(this).html('<input type="number" value="' + $(this).text() + '">'); 
 
\t \t \t \t \t \t \t $(this).find('input').focus().blur(function(){ 
 
\t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t $(this).parent().html($(this).prop('value')); 
 
\t \t \t \t \t \t \t }); 
 
\t \t \t \t \t \t \t break; 
 
\t \t \t \t \t \t case 'currency': 
 
\t \t \t \t \t \t \t $(this).html('<input type="currency" value="' + $(this).text() + '">'); 
 
\t \t \t \t \t \t \t $(this).find('input').focus().blur(function(){ 
 
\t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t $(this).parent().html($(this).prop('value')); 
 
\t \t \t \t \t \t \t }); 
 
\t \t \t \t \t \t \t break; 
 
\t \t \t \t \t \t case 'select': 
 
\t \t \t \t \t \t \t if(typevalues === undefined) { 
 
\t \t \t \t \t \t \t \t console.log('You must define both \'data-type\' and \'data-values\' for select elements. \'data-values\' should be a comma delimited array of the items to be displayed in the drop-down'); 
 
\t \t \t \t \t \t \t } else { 
 
\t \t \t \t \t \t \t \t typevalues = typevalues.split(','); 
 
\t \t \t \t \t \t \t \t _html = '<select>'; 
 
\t \t \t \t \t \t \t \t for(var i = 0; i < typevalues.length; i++) { 
 
\t \t \t \t \t \t \t \t \t if(typevalues[i] == $(this).text()) { 
 
\t \t \t \t \t \t \t \t \t \t _html = _html + '<option value="' + typevalues[i] + '" selected>' + typevalues[i] + '</option>'; 
 
\t \t \t \t \t \t \t \t \t } else { 
 
\t \t \t \t \t \t \t \t \t \t _html = _html + '<option value="' + typevalues[i] + '">' + typevalues[i] + '</option>'; 
 
\t \t \t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t \t _html = _html + '</select>'; 
 
\t \t \t \t \t \t \t \t $(this).html(_html); 
 
\t \t \t \t \t \t \t \t $(this).find('select').focus().change(function(){ 
 
\t \t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t \t $(this).parent().html($(this).prop('value')); 
 
\t \t \t \t \t \t \t \t }).blur(function(){ 
 
\t \t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t \t $(this).parent().html($(this).prop('value')); 
 
\t \t \t \t \t \t \t \t }); 
 
\t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t break; 
 
\t \t \t \t \t \t case 'checkbox': 
 
\t \t \t \t \t \t \t if(typevalues === undefined) { 
 
\t \t \t \t \t \t \t \t $($thead.find('tr')[0].cells[col]).attr('data-values', 'T,F'); 
 
\t \t \t \t \t \t \t \t typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values'); 
 
\t \t \t \t \t \t \t \t console.log('You can define the \'data-values\' parameter for checkbox elements. \'data-values\' should be a comma delimited array of two items. The first item is the \'checked\' value, and the second item is the \'unchecked\' value. Defaults to \'T,F\''); 
 
\t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t typevalues = typevalues.split(','); 
 
\t \t \t \t \t \t \t _html = ''; 
 
\t \t \t \t \t \t \t if(typevalues[0] == $(this).text()) { 
 
\t \t \t \t \t \t \t \t _html = '<input type="checkbox" checked="checked">'; 
 
\t \t \t \t \t \t \t } else { 
 
\t \t \t \t \t \t \t \t _html = '<input type="checkbox">'; 
 
\t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t $(this).html(_html); 
 
\t \t \t \t \t \t \t $(this).find('input').focus().click(function(){ 
 
\t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values').split(','); 
 
\t \t \t \t \t \t \t \t if(this.checked) { 
 
\t \t \t \t \t \t \t \t \t $(this).parent().html(typevalues[0]); 
 
\t \t \t \t \t \t \t \t } else { 
 
\t \t \t \t \t \t \t \t \t $(this).parent().html(typevalues[1]); 
 
\t \t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t }) 
 
\t \t \t \t \t \t \t .blur(function(){ 
 
\t \t \t \t \t \t \t \t $(this).parent().removeClass('editing'); 
 
\t \t \t \t \t \t \t \t options.cellClick($(this).parent(), false, col, row); 
 
\t \t \t \t \t \t \t \t typevalues = $($thead.find('tr')[0].cells[col]).attr('data-values').split(','); 
 
\t \t \t \t \t \t \t \t if(this.checked) { 
 
\t \t \t \t \t \t \t \t \t $(this).parent().html(typevalues[0]); 
 
\t \t \t \t \t \t \t \t } else { 
 
\t \t \t \t \t \t \t \t \t $(this).parent().html(typevalues[1]); 
 
\t \t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t }); 
 
\t \t \t \t \t \t \t break; 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t }) 
 
\t \t 
 
\t \t $tfoot.find('a:first-child').addClass('active'); 
 
\t \t 
 
\t \t return this; 
 
\t }; 
 
}(jQuery));
:root { 
 
    --tables-even-color: #CDEDF7; 
 
    --tables-odd-color: #90C3D4; 
 
} 
 

 
.tables { 
 
\t border-collapse: collapse; 
 
} 
 

 
/* Header */ 
 
.tables > thead > tr { 
 
\t background: #3E8096; 
 
\t color: #CDEDF7; 
 
} 
 

 
.tables > thead > tr > td { 
 
\t padding: 4px; 
 
\t padding-left: 8px; 
 
\t padding-right: 10px; 
 
} 
 
.tables > thead > tr > td:hover{ 
 
\t background: #CDEDF7 !important; 
 
\t color: #3E8096; 
 
} 
 

 
.tables > thead > tr > td::after { 
 
\t content: " \22EF"; 
 
} 
 

 
.tables > thead > tr > td.asc::after { 
 
\t content: " \22F1"; 
 
} 
 
.tables > thead > tr > td.desc::after { 
 
\t content: " \22F0"; 
 
} 
 

 
/* Footer */ 
 
.tables > tfoot > tr { 
 
\t background: #3E8096; 
 
\t color: #CDEDF7; 
 
} 
 

 
.tables > tfoot > tr > td > a { 
 
\t border: 1px solid #3E8096; 
 
\t padding: 4px; 
 
\t cursor: pointer; 
 
\t display: inline-block; 
 
} 
 

 
.tables > tfoot > tr > td > a:hover { 
 
\t border: 1px solid #CDEDF7; 
 
} 
 

 
.tables > tfoot > tr > td > a.active { 
 
\t background: #CDEDF7; 
 
\t color: #3E8096; 
 
} 
 

 
/* Rows */ 
 
.tables > tbody > tr:nth-child(even) { 
 
\t background: #CDEDF7; 
 
\t color: #90C3D4; 
 
} 
 
.tables > tbody > tr:nth-child(even):hover { 
 
\t background: #18EAF5; 
 
\t color: #90C3D4; 
 
} 
 

 
.tables > tbody > tr:nth-child(odd) { 
 
\t background: #90C3D4; 
 
\t color: #CDEDF7; 
 
} 
 
.tables > tbody > tr:nth-child(odd):hover { 
 
\t background: #18EAF5; 
 
\t color: #90C3D4; 
 
} 
 

 
.tables > tbody > tr { 
 
\t display: none; 
 
} 
 

 
.tables > tbody > tr.visible { 
 
\t display: table-row !important; 
 
} 
 

 
.tables > tbody > tr > td { 
 
\t padding: 5px; 
 
\t cursor: default; 
 
} 
 

 
/* Cell Content */ 
 
.tables > tbody > tr > td.center { 
 
\t text-align: center; 
 
} 
 
.tables > tbody > tr > td.center > input { 
 
\t text-align: center; 
 
} 
 
.tables > tbody > tr > td.center > textarea { 
 
\t text-align: center; 
 
} 
 

 

 
.tables > tbody > tr > td.right { 
 
\t text-align: right; 
 
} 
 
.tables > tbody > tr > td.right > input { 
 
\t text-align: right; 
 
} 
 
.tables > tbody > tr > td.right > textarea { 
 
\t text-align: right; 
 
}
<html> 
 
\t <head> 
 
\t \t <script src="https://code.jquery.com/jquery-2.2.0.min.js" type="text/javascript"></script> 
 

 
\t \t <script type="text/javascript"> 
 
\t \t \t $(document).ready(function() { 
 
\t \t \t \t $table = $('.tables').tables({ 
 
\t \t \t \t \t pageChanged: function(item) { 
 
\t \t \t \t \t \t //alert(e.text()); 
 
\t \t \t \t \t \t console.log($(item).text()); 
 
\t \t \t \t \t }, 
 
\t \t \t \t \t cellClick: function(item, focused, column, row) { 
 
\t \t \t \t \t \t //console.log('COLUMN: ' + column + ', ROW: ' + row); 
 
\t \t \t \t \t } 
 
\t \t \t \t }); 
 
\t \t \t }) 
 
\t \t </script> 
 
\t \t 
 
\t </head> 
 
\t 
 
\t <body> 
 
\t \t <table class="tables"> 
 
\t \t \t <thead> 
 
\t \t \t \t <tr> 
 
\t \t \t \t \t <td data-type="textarea">Column 1</td> 
 
\t \t \t \t \t <td data-type="checkbox" data-align="center">Column 2</td> 
 
<!-- \t \t \t \t \t <td data-type="select" data-values="Apples,Oranges,Bananas">Column 2</td> --> 
 
\t \t \t \t </tr> 
 
\t \t \t </thead> 
 
\t \t \t 
 
\t \t \t <tbody> 
 
\t \t \t \t <tr> 
 
\t \t \t \t \t <td>aa</td> 
 
\t \t \t \t \t <td>ab</td> 
 
\t \t \t \t </tr> 
 
\t 
 
\t \t \t \t <tr> 
 
\t \t \t \t \t <td>ac</td> 
 
\t \t \t \t \t <td>ad</td> 
 
\t \t \t \t </tr> 
 

 
\t \t \t \t <tr><td>bb<br>ccc<b>hello</b></td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr><td>bb</td><td>bc</td></tr> 
 
\t \t \t \t <tr> 
 
\t \t \t \t \t <td>ac</td> 
 
\t \t \t \t \t <td>ad</td> 
 
\t \t \t \t </tr> \t \t \t \t 
 
\t \t \t </tbody> 
 
\t \t \t 
 
\t \t \t <tfoot> 
 
\t \t \t \t <tr><td colspan="1"></td></tr> 
 
\t \t \t </tfoot> 
 
\t \t </table> 
 
\t </body> 
 
</html>