Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Github fork of Christian Bach's tablesorter plugin + awesomeness ~

tablesorter (FORK) 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.


  • Because of the change to the internal cache, the tablesorter v2.16+ core, filter widget and pager (both plugin & widget) will only work with the same version or newer files.




  • Multi-column alphanumeric sorting and filtering.
  • Multi-tbody sorting - see the options table on the main document page.
  • Supports Bootstrap v2 and 3
  • Parsers for sorting text, alphanumeric text, URIs, integers, currency, floats, IP addresses, dates (ISO, long and short formats) & time. Add your own easily.
  • Inline editing - see demo
  • 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+, Chrome 5.0+.
  • Small code size, starting at 25K minified
  • Works with jQuery 1.2.6+ (jQuery 1.4.1+ needed with some widgets).
  • Works with jQuery 1.9+ ($.browser.msie was removed; needed in the original version).



Related Projects


If you would like to contribute, please...

  1. Fork.
  2. Make changes in a branch & add unit tests.
  3. Run grunt test (if qunit fails, run it again - it's fickle).
  4. Create a pull request.

Special Thanks

  • Big shout-out to Nick Craver for getting rid of the eval() function that was previously needed for multi-column sorting.
  • Big thanks to thezoggy for helping with code, themes and providing valuable feedback.
  • Big thanks to ThsSin- for taking over for a while and also providing valuable feedback.
  • Thanks to prijutme4ty for numerous contributions!
  • Also extra thanks to christhomas and Lynesth for help with code.
  • And, of course thanks to everyone else that has contributed, and continues to contribute to this forked project!


  • Check the FAQ page.
  • Search the main documentation (click the menu button in the upper left corner).
  • Search the issues to see if the question or problem has been brought up before, and hopefully resolved.
  • If someone is available, ask your question in the #tablesorter IRC channel at
  • Ask your question at Stackoverflow using a tablesorter tag.
  • Please don't open a new issue unless it really is an issue with the plugin, or a feature request. Thanks!

Recent Changes

View the complete change log here.

Version 2.21.0 (3/5/2015)

  • Core
    • Plan to manually update vesion number.
    • Optimizations: replace arrays using $.each with for loops. Fixes issue #827.
    • Add $.tablesorter.addInstanceMethods function.
      • This allows one to define config object instance methods (docs).
      • Thanks to prijutme4ty for contributing!
    • Add config.$headerIndexed option (docs).
  • Docs
    • Update link in readme.
    • Add contributing information.
    • Update download method information.
  • Build/Testing
    • Move jshint to "grunt test" task.
    • Attempt to make nested callbacks more stable.
    • Clean up testing & made more stable, by prijutme4ty.
  • ColumnSelector
    • Add more debug logging.
  • Filter
    • Add more debug logging.
    • Add config parameter to filter_functions.
    • Add "widget-filter-type-insideRange.js" filter type; this filter type allows searching for a value that is within a range (demo).
    • External filters can now set initial values; this includes match-any-column inputs.
    • Extend filterFormatter functions - fixes an issue where HTML5 & jQuery ui filterFormatters override the function definitions.
  • Output
    • Add output_includeFooter option.
  • Pager
    • Add more debug logging.
  • Scroller
  • StickyHeaders
    • Now works properly with a full-height wrapper. Fixes issue #564.
    • Add stickyHeader hidden class name & modal demo links. Fixes issue #832.

Version 2.20.1 (2/20/2015)

  • Filter: Fixed a major issue with the filter widget not working properly.

Version 2.20.0 (2/20/2015)

  • Grunt build process
    • Added code to use npm & grunt to build a custom widget file.
    • An example.json file has been added as an example of how to set up a custom build file; see the Customize wiki page for more details.
    • With each build, the following occurs:
      • jquery.tablesorter.js is copied to the dist/js folder.
      • All less files are copied to the dist/css/less folder.
      • All images, including the pager icons, is copied into the dist/css/images folder.
      • A jquery.tablesorter.widgets.js file is created from the selected widgets into the dist/js folder, then copied back to the js folder to allow jsFiddle demos to continue working.
      • A .min.js file is created for the core & widget file in the dist/js folder, then all parsers & widgets are compressed separately in the dist/js/parsers and dist/js/widgets folder, respectively.
      • A .min.css file is created for all themes, dragtable, filter-formatter & pager styles.
      • The black-ice theme within the distribution folder is renamed to theme.blackice.min.css (no dash). See issue #785.
    • Files - the following changes to files have been made for the Grunt build process (this might break a few jsFiddle demos):
      • jquery.metadata.js has been moved into the js/extras folder.
      • jquery.tablesorter.widgets-filter-formatter.js
        • moved to the js/widgets folder
        • Broken into two files, and renamed to widget-filter-formatter-html5.js and widget-filter-formatter-jui.js.
      • jquery.tablesorter.widgets-filter-formatter-select2.js
        • Moved into the js/widgets folder.
        • Renamed to widget-filter-formatter-select2.js
      • jquery.tablesorter.widgets.js
        • Has been broken up into separate widget files: widget-column.js, widget-filter.js, widget-resizable.js, widget-saveSort.js, widget-stickyHeaders.js, widget-storage.js and widget-uitheme.js.
        • A default build creates a file of the above widgets combined in the dist/js folder.
        • A copy of this newly created combined widget file is then copied back to the js/ folder to allow external demos (jsFiddle) to still work.
  • Resolve jQuery unbinding issue

    • When unbinding events in jQuery versions 1.7 to 1.8, if an event list contains double spaces

      $('table').unbind('a  b');

      all events will be removed from that element (see this demo)!

    • Unbinding of events updated in the Core plugin & pager addon, and the following widgets: cssStickHeaders, editable, filter, formatter, math, staticRow & stickyHeaders.
  • Modified config.cache to only include non-info only tbodies.
    • This modification effects the core & the following widgets: chart, filter, grouping, pager (widget & addon).
    • Thanks to prijutme4ty for working on this change.
    • See pull request #822 for more details.
  • Core
    • Add cssNoSort option. Add the class name from that option to any element within a header will prevent a click on that element and any containing elements from causing a sort.
    • Remove cssAllowClicks option. It wasn't working as intended and actually prevented sorting. It was replaced by it's opposite, the cssNoSort option.
    • Make core work with jQuery v1.2.6, again.
    • Make getElementText function public; with a bug fix from prijutme4ty in pull.
  • Docs
  • Filter
    • Prevent javascript error when empty rows (<tr></tr>) are included in the tbody. Fixes issue #819.
    • Prevent javascript error when performing an "any-match" search triggered on the table without an included external data-column="all" input.
    • Ensure that an "any-match" search is a string value.
    • Added "any-match" specific column search by using #:{query} where # is a one-based column index and {query} is the query. Thanks to MaksimProgr for providing the code in pull request #817. This also fixes issue #747.
    • Added filter_columnAnyMatch option to allow disabling the "any-match" specific column search.
  • Pager
    • Fix initial start page default for the widget only.
    • Update pager ajaxProcessing code demo to prevent unordered JSON keys from adding content to incorrect columns. Fixes issue #818.
  • Parsers
    • Fix checkbox parser, in the parser-input-select.js file, so that it now properly updates when changed.
Something went wrong with that request. Please try again.