Skip to content
Github fork of Christian Bach's tablesorter plugin + awesomeness ~
JavaScript CSS HTML
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


tablesorter is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. tablesorter can successfully parse and sort many types of data including linked data in a cell.

See Alpha-numeric sort Demo & Full Documentation


  • Multi-column sorting.
  • Parsers for sorting text, alphanumeric text, URIs, integers, currency, floats, IP addresses, dates (ISO, long and short formats), time. Add your own easily
  • Support for ROWSPAN and COLSPAN on TH elements.
  • Support secondary "hidden" sorting (e.g., maintain alphabetical sort when sorting on other criteria).
  • Extensibility via widget system.
  • Cross-browser: IE 6.0+, FF 2+, Safari 2.0+, Opera 9.0+.
  • Small code size.
  • Works with jQuery 1.2.3+


Included all original document pages with updates from my blog post on undocumented options.


Change Log

View the complete listing here.

Version (2011-10-11)

  • Added "stickyHeader" widget to the "jquery.tablesorter.widgets.js" file.
    • This widget makes the header stick to the top of the page while scrolling down.
    • The sticky header is fully functional and will allow you to sort the table.
    • And best of all, it can be applied to the original tablesorter plugin.
    • Thanks to Chris Coyier and his post on persistent headers.
  • Added a compressed widget file named "jquery.tablesorter.widgets.min.js".

Version 2.0.21 (2011-09-22)

  • Added sortBegin event
    • This event is triggered immediately before the actual sort. So this event occurs after the sortStart and after the sortList option has been updated.
    • It was added to allow for changing the sort dynamically. See issue #3.
  • Added removeRows option to the pager plugin
    • When true, the default value, the pager plugin removes all non-active rows from the table. This greatly increases the sort speed of large tables.
    • When false, the pager plugin merely hides the non-active rows so they all continue to exist in the table. This should allow for better access to data within the table (i.e. submitting form elements)

Version (2011-09-16)

  • Oops fixed currency sorting

Version 2.0.20 (2011-09-16)

  • Filter Widget
    • Added "filter" to the "headers" option to allow disabling the filter option for a specific column - thanks jizo!
    • Added "filter-false" class, that when applied will disable the filter widget for that column.
    • Updated the headers docs and the filter widget demo.
  • Updated the currency parser to use unicode characters to better work in different document formats.

Version 2.0.19 (2011-09-16)

  • Added code in attempt to clear the table headers between multiple tables - fix for issue #2.
  • Cleaned up some code and wrapped the widget code to prevent conflicts with other javascript libraries.
  • Updated the columns widget:
    • Added css examples to the demo.
    • Removed the widgetColumns option from the core, but it is still used by the widget - the way it is used hasn't changed.
  • Updated the uitheme widget:
    • Added widgetUitheme option - used by the widget, but not included in the core. See the demo for a better example.
    • Example added to the uitheme widget demo.

Version (2011-09-14)

  • Updated the "uitheme" widget with method to add zebra striping and hovered header classes.

Version 2.0.18 (2011-09-13)

  • Fixed a bug in the column widget, it would cause an error if no initial sort was set.
  • Fixed a bug where an error would occur if a widget doesn't exist.
  • Updated pager widget to allow restoring the pager plugin & updated demo.
  • Added column filter widget. It is designed so that each column has an filter.

Version 2.0.17 (2011-09-11)

  • Added a jquery.tablesorter.widget.js file:
    • It contains the "uitheme" widget, to add any jQuery UI theme, and the new "columns" widget, to style columns.
    • The blue and green themes have been updated with the added styles from the columns widget.
    • Added a Columns Widget demo and instructions.
  • Added a widgetColumns option which defines the css classes added by the columns widget.
  • Added notes to the pager plugin demo page to better specify when a change was added.
  • The green theme header images have been modified to better work with variable width tables.

Version 2.0.16 (2011-09-08)

  • Added notes to demo pages to indicate if the original (version 2.0.5, at does have that option or method.
  • Added "addRows" method that allows adding table rows.
    • This method differs from the "update" method in that it only adds rows to the cache.
    • Use this new method to add rows to a table with the pager plugin applied. Using the "update" method on a table with the pager plugin will remove all hidden rows from the cache.
  • Added a "destroy.pager" method to remove the pager from the table - pager demo updated.

Version 2.0.15 (2011-08-23)

  • Fixed a problem that caused a javascript error when a table header cell doesn't have a class name.

Version 2.0.14 (2011-08-22)

  • Reverted the changes made in 2.0.13 and added checks to prevent errors.
  • Allowed sorting an empty table which would then automatically sort its contents when the table is updated.
  • Modified "Update" and "UpdateCell" methods to automatically resort the table using the existing sort.
  • Updated the Initializing tablesorter on an empty table demo and Updating a table cell.

Version 2.0.13 (2011-08-19)

  • Fixed a problem where a javascript error would occur when initializing a multi sort on an empty table. Thanks again to Eugene Ivakhiv!

Version 2.0.12 (2011-08-19)

  • Updated the textExtraction functionality

    • The original textExtraction function was only able to be applied to all cells.
    • Apparently the ability to define textExtraction on a per column basis was misinterpreted by me, so now I've added it.
    • Use the option as follows:
     textExtraction: {
       0: function(node) { return $(node).find(selector1).text(); },
       1: function(node) { return $(node).find(selector2).text(); },
       // etc
Something went wrong with that request. Please try again.