Skip to content
Rob Garrison edited this page Sep 28, 2017 · 114 revisions

Wiki: Home | FAQ | Customize | Snippets | Search | Language | Changes | Change summary

Milestones: 2.29 | 2.28 | 2.27 | 2.26 | 2.25 | 2.24 | 2.23 | 2.22 | 2.21 | 2.20 | 2.19 | 2.18 | 2.17 | 2.16 | 2.15 | 2.14 | 2.13 | 2.12 | 2.11 | 2.10 | 2.9 | 2.8 | 2.7 | 2.6 | 2.5 | 2.4 | 2.3 | 2.2 | 2.1 | 2.0.6+ (fork created) | 2.0.5 (original)

Version 2.29.0 (9/27/2017)

  • Core:
  • ColumnSelector:
  • Grouping:
    • Fix compatibility with columnSelector widget.
  • Output:
    • Modify internal process function to allow outputting of data without adding it to the table.
  • Resizable:
  • Scroller:
    • Save position to fix scroller_upAfterSort: false; See PR #1441. This should fix issue #1297 - The current position is now saved on scroll so it can be restored after sorting; thanks @lbodtke!
    • Update scroll position after fixing columns.
  • Sort2Hash:
    • Prevent sort2Hash from adding extraneous entries to browser history. Use window.location.replace to update the browser URL only, rather than window.location.hash, which modifies the browser history. See PR #1447; thanks @alexweissman!
  • StickyHeaders:
  • UITheme:
    • Remove bootstrap v2 refs & fix docs. See issue #1432.
  • Docs:
    • Miscellaneous fixes and updates.
    • Add more info about zebra widget when the table is not visible. See PR #1438; thanks @Federico-G!
    • Fix alignCharacter widget reference to css4.
    • Update userfrosting link in the readme.
    • Update to Bootstrap v4.0.0-beta.
    • Fix colspan demo.
  • Themes:
    • Rename icon-white to bootstrap-icon-white. Fixes issue #1432.
  • Meta:
    • Update dependencies.
    • Build: maintain ie8 support to fix issue #1431.

Version 2.28.15 (7/4/2017)

  • Core:
    • Use calculated index instead of DOM index. See pull #1424; thanks @ced-b!
    • Fix check count cell indexing.
  • ColumnSelector:
    • Remove colspan adjustments when widget removed.
    • Include tbody colspan updates on removal.
  • Filter:
    • Add namespacing to filter-formatter listeners. Needed to prevent JS error when a "resetToLoadState" is triggered and the "filterFomatterUpdate" bindings are still firing.
    • Fix namespacing of events.
  • Sort2Hash:
    • Prevent filter update if unchanged & compare (with) hash filter.
    • Fix p's (reference to pager object).
  • Docs
    • CSS fixed to comply with editable_wrapContent : <div>. See pull #1420; thanks @LaurentBarbareau!
    • Remove note on contenteditable wrapping. See pull #1420.
    • Update pager widget options in demo code.
    • Use src files in filter formatter demo for testing.
  • Meta:
    • Include js & css folders with bower installs.

Version 2.28.14 (6/8/2017)

  • Core:
    • Show console error for mismatched column count. See issue #1415.
  • Pager:
    • (addon) Ensure ajax is called after filter widget init. Fixes issue #1389.
    • (addon) Fix height issues for certain browsers (border-spacing). See pull #1418; thanks @DoctorWhite
    • (widget) Apply height adjustment code to pager widget.
    • Use selectorRemove to remove error rows. Removes error rows with dynamically changed class names.
  • Meta:

Version 2.28.13 (6/2/2017)

  • Core:
  • StickyHeaders:
    • Fix dynamic updating of offset. Fixes issue #1412.
    • Init with visible headers on partial scroll
  • Meta:
    • Set jQuery dependency back to >=1.2.6. Fixes issue #1411.
    • Add package-lock.json file.

Version 2.28.12 (5/26/2017)

  • ColumnSelector:
    • Don't clear container on updateAll. Fixes issue #1406.
  • Filter:
    • Return null from filter_selectSource to prevent select updates; From discussion in IRC with @alexweissman.
    • Select searches now process filter types, then exactly match. Previously only exact matches were performed by default, filter types were ignored. This broke the filter + jQuery UI selectmenu demo.
  • Docs/Meta:

Version 2.28.11 (5/24/2017)

  • Docs:
    • Reword sortReset method description. See issue #1404.
  • Columns:
    • Initialize after pager widget.
  • CssStickyHeaders:
  • Filter:
    • Attempt to fix issue #1152 (liveSearch).
    • Second attempt at issue #1152.
    • Trigger liveSearch on blur & cleanup.
  • Pager (widget only):
    • Allow ajax processing on init.
    • Ensure ajax is called after filter widget initializes.
  • Parsers:
    • Update links to sugarjs/datejs demos.
  • Meta:
    • Update dependencies.

Version 2.28.10 (5/16/2017)

  • Core:
    • Disable updateCell method for child rows (temporary block until code is fixed).
    • Add namespace class name to table.
  • Parsers
    • Input-select:
      • Prevent input select parser from handling events from child rows. See pull #1399; thanks @andysleigh!
      • Remove unused variables & add ignoreChildRow option.
      • Bind & update stickyHeaders checkbox. Fixes issue #261.
  • Meta:
    • Use correct composer.json jQuery version. Fixes issue #1398.
    • Clarify use of GPLv2 license. See issue #1400.
    • Update dependencies.

Version 2.28.9 (5/3/2017)

  • Core:
    • Fix widget option changes across multiple tables; seen in the second table of the math page demo with the math_ignore option.
  • Docs:
    • Add page header section to Math docs. See #1392.
    • Fix misspelling.
    • update jQuery.
  • Math:
    • Include noop math_complete in defaults; prevents option not recognized warning

Version 2.28.8 (4/18/2017)

  • Docs:
    • Update version tags.
  • Core:
  • Filter:
    • Add equalFilters function; for more reliable comparisons.
  • Pager:
    • use equalFilters function for comparison. See issue #1384.
  • Resizable:
    • Add resizable_includeFooter option. Fixes issue #1386.
  • Scroller:
  • Storage:
    • Add options early to prevent validator message.
    • Add storage_storageType option & deprecate storage_useSessionStorage.
  • Meta:
    • Update dependencies x2.

Version 2.28.7 (4/4/2017)

  • Editable:
  • Filter:
    • Add "filterAndSortReset" method. See issue #1361.
    • Prevent JS error added from last update. Fixes issue #1377.
  • Meta:
    • Fix composer.json license.

Version 2.28.6 (4/2/2017)

  • Core:
    • Prevent overwritting default widgetOptions. Fixes issue #1356.
    • Fix method of saving default widgetOptions. See issue #1356.
    • Update column count after reset.
    • Add fix it (in Abelt) note for issue #1362.
    • Update widgets after sortReset. Fixes issue #1361.
    • The applyWidget callback now occurs after "tablesorter-ready" event.
  • Docs:
    • Update jQuery to v3.2.0.
    • Fix "update" labels from previous version.
    • Add note about Excel & output_encoding. See issue #1353.
    • Clarify parser & sorter class name differences.
    • Add note about event binding after build widget completes. See issue #1370.
    • Fixed linting issues.
    • Add some internal links.
  • Build:
    • Stop build widget option warnings.
  • Filter:
    • Compare last search array (instead of a combined string). Fixes issue #1363.
  • Output:
  • Pager:
    • Fix "all" option to not set when the option doesn't exist. See PR #1364; thanks @simenflatby!
    • Stop using combined filter values. See issue #1363.
    • Use "all" only when the option exists. Fixes #1364 & #1366.
  • Sort2Hash:
  • Parsers:
    • Add leading zero parser & demo.
  • Theme:
    • Add CSS highlight file; copied from the demo.
  • Meta:
    • Add composer.json file. Fixes issue #1355.
    • Readme: Move questions section closer to the top.
    • Update dependencies.
    • Fix indentation & remove extra spaces.
    • Remove cdnjs auto-update config - see CDNJS #9080.
    • Update SPDX license.

Version 2.28.5 (1/28/2017)

  • Docs: Fix "update" labels.
  • Output:
    • Prevent multiple popups/download with dblClick (i.e. triggering "outputTable" multiple times).
    • Remove extraneous console log.
  • Resizable:
    • Add "resizableUpdate" & "resizableReset" methods.
  • Scroller:
  • Readme: Add related project, tablesorter-pagercontrols

Version 2.28.4 (1/6/2017)

  • Docs:
  • Output:
    • Prevent error on output to an already open popup.
    • Add output_savePlugin option & update download code.
    • Add output_includeHeader option & docs. Fixes issue #1349.
  • Pager:
    • (widget only) make compatible with stickyHeaders. Fixes #1313:
      • Removed all references to stored pager.$goto and pager.$size
      • Removed check if header text matches header length - this breaks when a header row has a "tablesorter-ignoreRow" class name.
      • Add stickyHeader container to pager.$container in case the pager controls are inside the thead.
    • Fix rendering of sticky headers after ajax.
    • Use option to target inner header.
    • Restore check for new headers. Fixes #1343.
    • Add data-attribute override on output. See issue #1348.
  • StickHeaders:
    • Reduce widget priority below the pager widget priority.
  • Theme:
    • Add group widget css file. See issue #1346.
    • Add column widget support to Bootstrap. See issue #1347.
    • Update high-specificity blue theme - demo; see Stack Overflow.
    • Add theme.bootstrap_4.css file (demo; Bootstrap v4-alpha - do not use in production!).
    • Duplicated theme.bootstrap_3.css from theme.bootstrap.css (maintaining this non-versioned file name until Bootstrap v4-stable has been available for about 6 months).
  • Readme:
    • Update log for v2.28.3.

Version 2.28.3 (12/16/2016)

  • Core: Fix internal version numbering.
  • Grunt: add version check.

Version 2.28.2 (12/15/2016)

  • ColumnSelector:
  • Reorder:
    • Add style to <HEAD>.
  • Resizable:
  • Scroller:
  • Theme:
  • Meta:
    • Add jsDelivr CDN link to readme.
    • Add scss to dist folder.

Version 2.28.1 (12/08/2016)

  • Core:
  • Filter:
    • Fix searchDelay & minimum character count. See issue #1299.
    • Fix liveSearch ignoring searchDelay. See issue #1299.
  • Print
    • Use hasWidget function.
  • UI-theme:

Version 2.28.0 (11/27/2016)

  • Core:
    • Return value from getColumnData if not an object.
    • Include extra headers when adding unsorted class. Fixes issue #1306.
    • Add option validator. Fixes issue #1319.
    • Maintain original settings on resetToLoadState.
  • Docs:
    • Add missing colon in CSS. Fixes issue #1307.
    • Add notes on sortList overridding sortForce & sortAppend. See issue #1286.
    • Update sortTbody widget demo showing new option.
    • Add zebra widget to sort reset demo.
    • Define a triggered "update". Fixes issue #1317.
    • Clarify recalculation update method. Fixes issue #1317.
    • Explain difference between # and 0 in the math mask. Fixes issue #1320.
    • Add link to disable thead row example. Fixes issue #1326.
  • Filter:
    • Restore filter_searchDelay function. Fixes issue #1299.
  • Grouping:
  • Math:
    • Fix prefix/suffix option names & processing. Fixes issue #1305.
    • Remove math_prefix content prior to parsing cell values.
  • Pager:
    • Set ariaDisabled property to stop MS Edge crash. Fixes issue #1303.
    • Restore settings on resetToLoadState. Fixes issue #1311.
  • Tbodysort:

Version 2.27.8 (9/28/2016)

  • Core: minor code cleanup.
  • Docs: remove code in duplicate example-widget-filter-custom. See pull #1295; thanks @themilkman!
  • ColumnSelector: updateAll properly updates the popup. See Stack Overflow.
  • Pager: Maintain filter focus on custom controls. Fixes issue #1296.
  • Readme: Add link to Grav CMS. See issue #1290.

Version 2.27.7 (9/23/2016)

  • Core:
    • Include version in log.
    • Remove space from debug message.
  • Docs: update jQuery.
  • Filter:
    • Include "input" event for searches. See issue #1280.
    • Add support for descending sort on selectSources values.
  • Mark: Remove internal case matching.
  • Pager:
    • Allow for optional output callback in favour of parsable string. See pull #1283; thanks @joelperry93!
    • Add output function support to pager widget. See pull #1283.
    • Maintain pageDisplay ID, if one exists. Fixes issue #1288.
  • RepeatHeaders:
  • Testing: update jQuery usage.

Version 2.27.6 (9/1/2016)

  • Core: textSorter option now accepts class names. See Stackoverflow.
  • Docs:
    • Update emptyTo demo. See issue #1278.
    • Add $.tablesorter.defaults variable.
  • Grouping: Add "group-date-hour" group type; added to demo.
  • Mark:
  • Parser: Header checkbox remains unchecked when table is hidden. Fixes issue #1090.
  • Pager Custom Controls (beta)
    • Prevent out-of-range page numbers. Fixes issue #1276.
    • Allow settings ends and/or aroundCurrent to zero. See issue #1276.
    • Spacer settings now include wrapper element (a <span> by default).
    • Keyboard use changes.
      • A pager element must now be focused before keyboard keys work.
      • Keyboard keys now include left, right, up, down, pageUp, pageDown, home, or end.
      • pageKeyStep option added. Number of pages to skip with pageUp or pageDown.

Version 2.27.5 (8/22/2016)

  • Readme: Update IRC link to a free client.
  • Docs: Correct usage of Sugar v2.0+ sortCollage.
  • Filter: Add any match search by column text - see updated demo.
  • Parser: Fix JSHint issue.

Version 2.27.4 (8/18/2016)

  • Docs & parser: Update Sugar library v2.0+. Fixes issue #1275.
  • Docs: Add sortStable example.

Version 2.27.3 (8/17/2016)

  • Core: getColumnData now allows falsy values.
  • Filter:
    • Add delay to "filterFormatterUpdate". See issue #1237.
    • filter_liveSearch now accepts an object.
  • Pager: use ajax flag when calculating filtered rows.
  • Readme: Fix date of last release.
  • Testing: Update QUnit.

Version 2.27.2 (8/2/2016)

  • Docs: Update versions.
  • Core: Allow leading zeros in the time parser. Fixes issue #1269.
  • Mark: Actually include options this time! See issue #1243.

Version 2.27.1 (7/31/2016)

  • ColumnSelector: Fix undefined variable.
  • Mark: Fix linting issues.

Version 2.27.0 (7/31/2016)

  • Core:
    • updateCache now ignores "remove-me" rows.
    • Add column count to debug log.
    • Tweak internal sortVars & sortReset. Fixes #1137.
  • ColumnSelector:
    • Add max/min visible columns settings.
    • Set state to null for disabled columns - Fixes JSON issues with not storing undefined values.
    • Fix null comparison & incorrect option.
  • CurrentSort: Add currentSort widget. Fixes issue #1208.
  • Filter:
    • getFilters will now always return an array. Fixes issue #1250. API change
    • Allow ES6 regex flags.
    • Add rowIndex to filter data.
    • Trigger filter formatters after update. See issue #1237.
    • Selected column query works again. Fixes issue #1267; broken since a6b25ae.
  • Grouping: Prevent js errors on non-string values.
  • Mark: Add mark widget. Fixes issue #1243.
  • Math:
    • Add data-math-target attribute.
    • Add math-debug option.
  • Output:
    • Automatically ignore widget added rows.
    • Add "url" parameter to output_callback function.
  • Scroller: Update when applyWidgets is used. See issue #1261.
  • StickyHeaders: Add appendTo option.
  • UITheme: jQuery v1.12.0 renamed "carat" to "caret". Fixes issue #1257.
  • Parsers: Url parser now ignores "www" & removed parsed flag. The filter widget finds "http" querys.
  • Docs:
    • Fix docs javascript; some demos still using jQuery < 1.7.
    • Add scroller widget RTL details. See issue #906.
    • Clarify & expand grouping widget usage.
    • Include ajax type.
    • Add ajax type example to main docs.
    • Update jQuery UI & fix uitheme docs.
    • Remove old syntax highlighter.
    • Update theme switcher.
    • Switch to use jQuery <3.0.0 for Bootstrap demos; later reverted this change after updating to Bootstrap v3.3.7.
    • Add link to cssIgnoreRow example.
    • Clarify column selector initial state.
    • Fix HTML issues.
    • Add filter event function parameter examples.
  • Themes:
    • Hide icon when column is disabled.
    • Optimize PNGs in data URLs using ZopfliPNG as well.
    • Compress PNG images further. See pull #1251; thanks @Herst!
    • Add Materialize theme style. Fixes issue #1242.
  • Meta:
    • Grunt: Fix IIFE jQuery reference. Fixes issue #1255.
    • Grunt: Update dependencies.
    • Testing: Add filter anyMatch queries; Sadly unrelated to issue #1267.
    • Bower: Oust meta warnings. Fixes issue #1264.
    • Bower: Add recommending settings. Fixes issue #1265.

Version 2.26.6 (7/11/2016)

  • Global: Fix "updated" date in various widgets & pager.
  • Docs:
    • Cleanup links & license. Fixes issue #1244.
    • Add button type to all buttons.
    • Update to jQuery v3.1.0.
  • Core: Prevent undefined error in natural sort. See issue #1151.
  • Column Selector: Check visibility of cells after colspan. See issue #1238.
  • Filter
    • Filter formatter for Select2 v3.4.6 (v4.0+ still not supported)
      • Now adheres to case sensitivity setting. See issue #1237.
      • Update after filter row rebuilt. See issue #1237.
      • Properly remove case-insensitive flag in regex.
      • Properly escaped characters in regex.
    • Use uncached widgetOptions after inside events.
    • filter_hideFilters option now accepts a function. See issue #477.
  • Grouping:
    • Fix js error when storage isn't loaded.
    • Fix group_collapsed behavior. See issue #1247.
  • Pager:
    • Prevent ajax call on init. See issue #1196.
    • Prevent setting "all" value before initialization. See issue #1196.
  • Scroller: Save scroll position of window. See issue #1240.
  • UITheme: Modify filter row after filterInit.
  • View:
    • Update to get the raw text value of a column without the span wrap.
    • Trigger "viewComplete" in the view builder, not in init, otherwise you get no trigger when switching views.
    • Replace all instances, not just the first one.
  • Bower: Add license identifiers. See pull #1239; thanks @bckfnn!

Version 2.26.5 (6/28/2016)

  • Docs:
    • Optimize png images using using zopflipng; see pull #1230 thanks @PeterDaveHello!
    • Add showProcessing toggle button.
    • Add demo link for css3 animated showProcessing icons that actually works!
    • Update to use jQuery v3.0.0.
  • Readme: Update for previous version bump.
  • Filter: Do not return altered filters variable. Fixes issue #1237.
  • Grouping:
    • Use correct pager row indexing. Fixes issue #1232.
    • Prevent JS error with ajax & filtering. Fixes issue #1232.
    • Fix lint issue.
  • Resizable: Adjust handles on pager complete.
  • Pager:
    • Fix code alignment.
    • Fix filtered regular expression definition.

Version 2.26.4 (6/15/2016)

  • Version bump due to merging issues.

Version 2.26.3 (6/15/2016)

  • Distribution: Provide source css & js files on CDNJS. Fixes issue #1222.
  • Readme:
    • Make changelog link clickable. See pull #1221; thanks @aried3r!
    • Update badge for ZenHub.
  • Docs: Update main page to use jQuery 3.0.0-rc1 & add migrate.
  • Filter: Fix select2 lint issue.
  • Scroller: Hide <col> with hidden columns. Fixes issue #1229.
  • Grunt: Update dependencies & fix pager indentation.

Version 2.26.2 (5/28/2016)

  • Docs:
    • Add missing "tablesorter-ignoreRow" class. See issue #1218.
    • Update jQuery to 1.12.3 & add migrate for v3.0.
    • Correct grouping & resizable last update.
  • Filter:
    • Remove not any match limitation. See updated demo.
    • Fix select2 v3 filter extension. See issue #1216; this code does not work with select2 v4.
  • Testing: setFilters last parameter now true by default.

Version 2.26.1 (5/16/2016)

  • Docs:
    • Update setFilters method.
    • Update playground links & cleanup.
  • Core: Minor organization of options.
  • Filter:
    • Minor organization of options.
    • Allow any match searches with no input.
  • Group:
    • Escape angled brackets in group names. Fixes issue #1206.
    • Fix HTML escape string & prevent undefined error. Seeissue #1206.
    • Ensure empty cells get a header. Fixes issue #1209.
  • Math: Add math_completed callback.
  • Resizable: update resizable handle position after init. Fixes issue #1207.

Version 2.26.0 (5/1/2016)

  • Pager:
    • Save pager size as "all" vs number. Fixes issue #1196.
    • CAUTION: This change will pass "all", if set, as a page size to the server for ajax requests. So, this may break current server methods on the number of pages to return.
  • StickyHeaders: Include caption height in calculations. Fixes issue #1205.

Version 2.25.9 (4/29/2016)

  • Docs:
    • Fix search for next/previous result positioning.
    • Add sortMultiSortKey alternative settings. See issue #1200.
  • ColumnSelector:
    • Refresh method properly saves changes. Fixes issue #1198.
    • Fix missing class name; fallback to "filtered" when the filter_filteredRows widget option is undefined.
    • Add columnSelector_maxPriorities. Fixes issue #1204.
  • Filter:
    • Include milliseconds in formatter date comparison. See issue #1191.
    • Properly initialize after using applyWidgetId. Fixes issue #1197.
  • Scroller:
    • Add multi-line caption height support in fixed column. Fixes issue #1202.
  • Parser (checkbox):
    • Header checkbox properly updates row class names.
    • Fix indeterminate checkbox issue in IE.
    • Fix indeterminate checkbox state checked state in IE.
    • See issue #1199.

Version 2.25.8 (4/11/2016)

  • Core: duplicateSpan set to false now uses textExtraction instead of setting the data to an empty string; see [Stackoverflow](See http://stackoverflow.com/q/36449711/145346).
  • Docs:
    • Update jQuery.
    • Various fixes.
  • Theme: Bootstrap: default cursor for sorter-false. Fixes issue #1189.
  • Print: Process lazyload images before printing. See issue #1169.
  • Grunt:
    • Update dependencies.
    • Update Qunit.

Version 2.25.7 (4/1/2016)

  • Filter: Check match on both internal & external filters. See issue #1177.
  • Lazyload: Trigger window scroll after update. See issue #1169.
  • Scroller: Throttle scroll event. Fixes issue #1186.
  • StickyHeaders: Update on table resize for Firefox. Fixes issue #1183.
  • Grunt: Update dependencies.

Version 2.25.6 (3/18/2016)

  • Core:
    • Add debug warning when widget not found.
    • Add debug warning when widget is added more than once.
  • Docs:
    • More notes added about including .filter { display: none; } in custom themes. See issue #1172.
    • Add support badges to readme.
  • Filter:
  • Lazyload:
    • Trigger lazyload after filtering. Fixes issue #1169.
    • Change skip_invisible option default to true.
  • Grunt:
    • Update dependencies.

Version 2.25.5 (3/1/2016)

  • Global:
    • Replace array push functions in main loops.
  • Docs:
    • Update storage widget changes.
    • Various corrections.
  • Editable:
    • Fix lint issue.
    • Replace pasted content with plain text. Fixes issue #994.
  • Filter:
  • Group:
    • Use non-cached variables when added after core init. Fixes issue #1158.
  • Math:
    • General cleanup & optimization.
    • Leave table in place or filter input lost. Fixes issue #903.
  • Print:
    • Stop print event propagation from nested tables. Fixes issue #1160.
  • Scroller:
  • StickyHeaders:
  • Storage:
  • Parser:
    • Add huge number parser. See issue #1161.
    • Huge number correction (make JSCS happy).
  • Build:
    • Update dependencies. Several times!

Version 2.25.4 (2/15/2016)

  • Core:
    • Remove id from widgets option prior to remove function. See issue #1155.
    • applyWidgetsId properly accepts jQuery table element.
  • ColumnSelector:
  • Editable:
    • Use execCommand to select all text, if supported.
  • Filter:
  • Grouping:
    • Reapply zebra after collapsed group opens. Fixes issue #1156.
  • Pager:
  • Docs:
    • Add ignoreRow class to pager row.
    • Show actual theme names; to use in the themes option.
  • Build: Update dependencies.
  • Testing: re-align code.

Version 2.25.3 (1/21/2016)

  • Filter:
    • Check that filter is not undefined before encoding/decoding it & treat null and undefined filters the same. See pull #1130; thanks tim-schilling!
    • Search delay now works properly. Fixes issue #1134.
  • Docs:
    • Add clarification about hiding columns. See issue #1133.
  • Build:
    • Update dependencies.

Version 2.25.2 (1/15/2016)

  • Docs:
    • Update main demo & test to use jQuery 3.0.0-beta.
  • Core:
    • Revert extra header class name updating. See issue #1116.
  • Filter:
  • Output:
  • Parsers:
    • checkbox value should no longer change. Fixes issue #1125.

Version 2.25.1 (1/10/2016)

  • Docs:
    • Update to jQuery v1.12.0.
    • Fix HTML hint issues.
  • Core:
    • Fix time parser detection. See issue #1107.
    • Add multiple widgets from table class. Fixes issue #1109.
    • Fix extra header class name updating. See issue #1116.
    • Fix typo in comments.
  • ColumnSelector:
  • Filter:
    • Use replacement character instead of null (for IE).
    • Fix "or" test regex. Fixes issue #1117.
    • Restore return false to fix unit tests.
    • Functions now get exact data, ignoring parsed flag. Fixes issue #1107.
    • Parsed flag now all set true if filter_useParsedData is true & stop using config.$headers.
  • Output:
    • output_callback can now return modified data. See issue #1121.
  • Grunt:
    • Add HTML hint.

Version 2.25.0 (12/13/2015)

  • Global
    • Use triggerHandler instead of trigger to prevent event bubble to any outer table. See issue #1090.
  • Core
    • Add duplicateSpan option (default is true) with unit tests (demo).
    • Add triggered "removeWidget" method & update docs.
    • applyWidgetId now properly initializes a widget, if needed.
    • applyWidgetId now adds widget name to widgets option.
    • Show parsed data in debug log. See issue #1084.
    • Prevent js error - calling "applyWidgetId" on non-existant widget.
    • Prevent js error - trying to apply a non-existent widget.
    • Fix "updateCell" issue. If "updateCell" is triggered on a thead cell, or bubbles to an outer table, tablesorter no longer gets stuck in an "isUpdating" loop.
    • Ensure table has initialized before allowing use of "updateCell". See issue #1099.
    • Fix cache debug log for multiple tbodies.
    • After init, computeColumnIndex now only adds "data-column" attribute to mismatched indexes - lessens DOM interaction on tbody (e.g. math widget).
    • Add "sortBeforeEnd" event for internal widget binding.
    • Renamed $.tablesorter.formatSortingOrder to $.tablesorter.getOrder.
    • Include table in console.error if an issue is encountered during initialization.
    • Clean up warning when no parser is found for given data.
    • Fix config.sortVars js error for non-existent header cells (makes second column of this demo sortable using "sorton").
  • Docs
    • Add reference to datejs parser. See issue #1084.
    • Add note that reflow widget only works with HTML5.
    • Add note in filter localization about escaping special characters in regular expressions. See issue #1101.
    • Update & add all options in math widget demo.
    • Fix search tooltip not hiding on side menu close.
    • Update to Bootstrap v3.3.6.
  • Editable
    • Ensure table has initialized before allowing use of "updateCell". See issue #1099.
  • Filter
    • Prevent js error when columnFilters are false. Fixes issue #1091.
    • Restore column specific default filters. Fixes issue #1088.
    • Prevent insideRange filter type (widget-filter-type-insideRange.js) searches on "all" columns.
    • Prevent edge case js error.
    • Add "filterBeforeEnd" event for internal widget binding.
    • Filters that span multiple columns now have the correct "data-column" value set.
    • Consolidated code that parsed "data-column" ranges into a findRange function (e.g. external filters with data-column="1-3,4-6,8").
  • Math
    • Add "data-math-filter" cell override of math_rowFilter option. See issue #1083.
    • Limit tbody cell processing & use cellIndex whenever possible. See issue #1048.
    • Use core textExtraction on cells. See issue #1098.
    • Initial calculation performed once - changed binding to either "filterEnd" or "pagerComplete", not both.
    • Added change flag so a cache update is only performed when cell content inside of a sortable tbody was modified.
    • Fix "data-math-filter" on "all" cell calculation with fixes to getRow & getColumn functions so that filters get priority over the "filtered" row check. See issue #1083.
    • Another "data-math-filter" fix and change flag fix. See issue #1083; thanks to @lindonb for all the feedback!
    • math_none can now be set to an empty string.
  • Print
  • Parsers
    • Checkbox row class & header now work with sorter-false set. See issue #1090.
    • Return true for header checkbox to work in IE8. See issue #1090.
  • Misc
    • gitignore file - ignore "idea" demos used for testing.

Version 2.24.6 (11/22/2015)

  • Core
    • Prevent "tablesorter-ready" event from firing multiple times in a row.
    • While detecting parsers, use cssIgnoreRow & stop after 50 rows.
  • Docs
    • Update utility options section.
  • Math
    • Add math_rowFilter option. See issue #1083.
    • Spelling corrections to math_rowFilter option.
    • Ensure internal updating flag gets cleared. Fixes issue #1083.
  • Pager
    • Initial page no longer ignored (no filter widget). Fixes issue #1085.
    • Fix other page set issues (no filter widget). Fixes issue #1085.
    • Fix page set issues (with filter widget). Fixes issue #1085.
    • Clean up pager widget code.
  • Print
    • Add print_now option. See issue #1081.
    • Fix print & close button actions.
  • SortTbodies
    • Use config parameter for numeric sorting. See issue #1082.
  • Parsers:
    • Update parser-input-select.js. See issue #971.
    • parser-date-month.js no longer removes other language data.
    • Add alternate date range parser & update filter insideRange filter type.
    • Don't use $.extend for simple additions.
  • Misc
    • Update grunt dependencies.

Version 2.24.5 (11/10/2015)

  • Pager: Fix javascript error in pager addon when using ajax.

Version 2.24.4 (11/10/2015)

  • Core
    • sortRestart works again with multi-row headers. Fixes issue #1074.
    • Add sortDisabled language setting; used in aria-labels.
  • Docs
  • Filter
  • Group
    • Include group & row data parameters in group_formatter. Fixes issue #1077.
  • HeaderTitles
    • Update aria-label usage.
  • Math
  • Pager
    • Clear tbody prior to calling ajaxProcessing. This again allows the developer to add the HTML to the table instead of needing to return it.
  • Sort2Hash
    • Make widget functions accessible.
    • Add 2 utility functions to simplify hash processing.
  • Toggle
    • Add new widget to enable/disable sort & filter. See issue #1075.
  • Parser
    • Add "file-extension" parser.
  • Misc
    • Grunt: Fix uglify comment removal & update dist folder.

Version 2.24.3 (11/4/2015)

  • Core
    • jQuery filter element parameter not defined in v1.2.6.
    • Fix sortRestart preventing sort. Fixes issue #1072.
  • Filter
    • Convert filter array to include all strings. Fixes issue #1070.
    • setFilter "apply" parameter now defaults to true. See issue #1071.
  • Resizable
    • Fix widget bindings after tablesorter "updateAll" event. See pull #1073; thanks scr34m!
  • Misc
    • One more attempt at setting ignore in bower.json. See pull #1063.

Version 2.24.2 (11/2/2015)

  • Misc
    • Restory empty bower.json ignore setting... bower is installing an empty dist folder.

Version 2.24.1 (11/2/2015)

  • Core
    • Cache "shortDate" parser & time parser now extracts the time.
  • Group
    • Add optimizations from pull #830; thanks to VorontsovIE!
    • Update demo to use new "weekday-index" parser when "group-date-week" is set, and updated "time" parser when "group-date-time" is set.
  • Print
    • Rows option now accepts custom css selectors.
  • Sort2Hash
    • Remove history push state as it ignored other tables on the page.
  • Parsers
    • Globalization parser now caches the Globalize object in a same named option.
    • Convert month & weekday parsers to utilize globalization data.
    • Add "weekday-index" parser - this parser ignores the actual date but saves the weekday from a date object
  • Misc

Version 2.24.0 (10/31/2015)

  • Docs
    • Fix mixed content using GitHub buttons on main page. See pull #1029; thanks OmgImAlexis!
    • Clarify use of pager ajaxUrl option.
    • Add theme class to tables to prevent FOUC.
    • Fix left menu push. The body no longer squeezes the content.
    • Update stickyHeaders after menu close.
    • Include horizontal scroll while jumping to search result.
    • Add some examples (filter_cssFilter).
  • Global
    • Call internal functions directly; stop using triggered events.
  • Core
    • Use plain javascript to set index attribute & remove unused variable. See issue #1048.
    • Add "entire column colspan" support. See issues #485, #746 & #1047.
    • Fix parser detect & sortVars on columns that don't exist due to colspan. See issues #485, #746 & #1047.
    • Reformat structure & expand variable names.
    • Add rowFilter parameter to getColumnText function.
    • Fix multisort indicators. Fixes issue #1005, again.
    • sortAppend now accepts an object of column references; see Stackoverflow.
    • Internalize sort counter & fix spanned sorts.
    • Add "tablesorter-ready" event.
    • Add widget from class before adding widget options.
    • Maintaining support for IE7-8 until 1/12/16.
  • Chart
    • Fix chart_layout column indexing.
  • ColumnSelector
    • Add mediaqueryHidden option. Resolves issue #964.
    • Extra rows & colspans now supported in thead & tfoot. Fixes issue #501.
    • Fix jscs reported issues.
  • Filter
    • Encode/decode filters in case they end up in cookies. See issue #1026.
    • Add "entire column colspan" support. See issues #485, #746 & #1047.
    • hideFilters applies to stickyHeaders again. Fixes issue #1050.
    • Prevent error in formatterUpdated. Fixes issue #1056.
  • Grouping
  • HeaderTitles
    • Switch to use internalized sort counter.
  • Lazyload
    • Add new widget. Demo
  • Math
    • Created new calculation type "below". It works just like "above" except in other direction starting from top to bottom. See pull #1027; thanks LvLynx!
    • Tweak changes & more tweaks for better compression.
    • Detach table prior to indexing all cells. See issue #1048.
    • Add math_none option.
    • Include config parameter in math equations - needed for math_none option.
  • Output
    • Correct formatContent function comment (missing widgetOptions variable)
    • Do not include nested table headers with parent. Fixes issue #1040.
  • Pager
    • Clear tbody if no data returned by ajax. See issue #1032.
    • Add "all" setting for page size methods; includes select option & all methods. See issue #1055.
    • Fix pager widget demo destroy method.
    • destroyPager again reveals all rows. Fixes issue #1055.
    • Parse page numbers to prevent user seeing NaN.
    • Parse page size updates.
  • Print
    • Internal variable tweaks.
    • Include css to hide filter rows. Fixes issue #1046.
    • Add print delay; allows browsers to render print preview.
  • Scroller
  • Sort2Hash
    • Update to include pager (page & size) and filter parameters.
  • SortTbodies
    • Moved config string defaults to $.tablesorter.strings to match core reformatting.
  • StickyHeaders
    • hideFilters applies to stickyHeaders again. Fixes issue #1050.
  • View
    • Add new widget. Demo.
    • Fix jscs reported issues.
  • Parsers
    • Globalize parser now allows a different language per column.
    • Fix jscs reported issues.
  • Misc

Version 2.23.5 (10/4/2015)

  • Core:
  • Docs:
    • Add instructions on how to use the new filter option (filter_childWithSibs).
    • Include filter reset in above demo.
    • Fixed spelling mistake x2. See pull #1024 & #1025; thanks OmgImAlexis!
    • Add note data-attribute values added to both parsed & raw data. Closes issue #983.
    • Move all javascript to page bottom.
  • Filter:
    • Keep parent match when no child rows match. See issue #1020.
    • Ignore filter_childWithSibs when filter_childByColumn is false. See issue #1020.
    • Select includes child rows when filter_childByColumn is set.
  • Pager
    • Prevent hiding child rows when disabling or destroying the pager. See issue #1020.

Version 2.23.4 (9/23/2015)

  • Core:
    • Ensure widgets don't get cached options. Fixes issue #946.
    • Update natural sort regular expression for chunking data.
    • Use window.console check to prevent IE9 error. Fixes issue #1019.
  • Filter:
    • Modified internal variable.
    • Add internal processOptions function & code cleanup.
    • Fix external filters not allowing columns > 9. See pull #1021; thanks a-mair!
    • Add filter_childWithSIbs option. Fixes issue #1020.
  • Build
    • Update dependencies.

Version 2.23.3 (9/1/2015)

  • Docs:
    • Correction to dateFormat demo.
  • Core:
    • Corrected sorting of col/rowspan in thead. Fixes issue #1005.
    • Correct header sort indicators in row/colspans. Fixes issue #1005.
  • Filter:
    • Use namespacing when binding reset. Fixes issue #1001.
    • Restore triggered change namespace & prevent search before init. Fixes issue #1002.
  • Group:
    • Remove unused variable.
    • Add group_forceColumn & group_enforceSort options. Fixes issue #1000.

Version 2.23.2 (8/23/2015)

  • Readme
    • Corrections for last update
  • Docs
    • Add parsed values function no longer wraps empty content.
  • Core
    • Cache regular expressions.
  • ColumnSelector
    • Add columnSelector_updated option (triggered event name).
  • Filter
    • Allow dynamically changing the "any match" filter. Fixes issue #998.
    • Cache regular expressions.
    • Add reference to widget code to make the file more compressible.

Version 2.23.1 (8/19/2015)

  • Core

    • Prevent js error when $.tablesorter.showError is called without a string. Fixes issue #997.

    • Updated $.tablesorter.showError function by including a settings parameter; a parameter passed by jQuery's .ajaxError() method, but was previously omitted.

      $.tablesorter.showError( table, xhr, settings, exception );

      I didn't bump the minor version as this is somewhat on the edge of calling this a breaking change.

  • Pager

    • Include settings parameter from ajaxError method, between the xhr and exception parameters to match the order of parameters returned by jQuery .ajaxError() method.

      ajaxError: function( config, xhr, settings, exception ){ return exception; };

Version 2.23.0 (8/17/2015)

  • Core:
    • Prevent addRows error. See issue #979.
    • Make all updating methods public
      • Call a function instead of triggering an event on the table. Changes include:
        • $.tablesorter.addRows - called by addRows method.
        • $.tablesorter.appendCache - renamed from appendToTable; appends cache to DOM, called by appendCache method.
        • $.tablesorter.isEmptyObject - clone of $.isEmptyObject (jQuery v1.4).
        • $.tablesorter.sortOn - called by sortOn method.
        • $.tablesorter.sortReset - called by sortReset method.
        • $.tablesorter.updateAll - called by updateAll method.
        • $.tablesorter.updateCache - called by updateCache method.
        • $.tablesorter.updateCell - called by updateCell method.
        • $.tablesorter.update - called by update and updateRows method.
    • addRows now accepts a row string if only one tbody exists in the table.
      • The one tbody does not include information only tbodies (which have a class name from cssInfoBlock).
      • Previously, you had to make a jQuery object, append it to the table, then pass a reference containing the new rows.
      • This method doesn't work if a table has multiple tbodies, because the plugin doesn't know where you want to add the rows.
      • Also, updated the debug message for this method.
    • Use header cells instead of references to prevent IE8 error. Fixes issue #987.
    • Fix above header cell targetting causing a javascript error in jQuery v1.2.6. Fixes issue #995.
    • Add updateHeaders method
      • Triggered event & public api function.
      • $.tablesorter.updateHeaders - called by updateHeaders method.
      • Fixes issue #989.
  • Docs:
    • Update jQuery UI theme switcher URLs.
  • ColumnSelector:
    • Modify refreshColumnSelector method so it also updates the contents of the container in case of changes to the header text, column priorities, etc.
    • See examples of these changes in the column selector methods section.
    • Fixes issue #985.
  • Editable:
    • Improve column option parsing. Fixes issues #982 & #979.
  • Filter:
    • Fix js error caused when limiting search columns - external "any" filter targeting specific columns; see Stackoverflow.
  • Pager:
    • Widget only: No more javascript error in widget ajax error message.
    • Addon only: replace use of $.isEmptyObject which was not available in jQuery v1.2.6.
    • Change enable, disable & destroy trigger methods.
      • Previously, these methods had to include a .pager namespace: enable.pager, disable.pager & destroy.pager.
      • These methods stopped working when unique pager namespaces were added.
      • New trigger methods are named as follows: enablePager, disablePager & destroyPager.
      • Fixes issue #980.
    • Unbind pager controls on destroy. Fixes issue #981.
    • Add ajaxError callback function. Fixes issue #992.
  • Parsers:
    • parser-input-select: fix javascript error when no rows returned.
  • Misc & Testing
    • Miscellaneous cleanup of testing code.
    • Add empty ignore entry to bower.json. Fixes issue #991.
    • Fix license in package.json to match the new spdx license expression syntax.

Version 2.22.5 (7/28/2015)

  • Overall:
  • Set JSHint "undef" & "unused" options. Fixed issues.
  • The math widget was throwing a javascript error after missing a changed variable name & JSHint wasn't catching it, until now.

Version 2.22.4 (7/28/2015)

  • Overall
    • update debug logging. console is now called directly & includes grouping, tables, warning & errors.
  • Core
    • Replace tbody placeholder use of a <span> with a <colgroup>. Attempt to resolve IE error reported in issue #938.
    • Fix $.tablesorter.hasWidget error introduced when fixing jscs issues.
    • Fix $.tablesorter.isProcessing error introduced when fixing jscs issues.
    • Update isValueInArray function to prevent js errors with invalid input.
  • Docs
    • Remove duplicate section in math widget docs.
    • Add resizable widget note about leaving widthFixed set to false. See issue #958.
    • Update to use jQuery v1.11.3.
    • Change deprecated window load function.
    • Improve two-digit year parser demo.
    • Minor updates.
  • Filter
    • Prevent invalid RegExp errors which occur while typing in an incomplete query.
  • Math
    • Ignored rows are now properly ignored in columns. Fixes issue #976.
  • Output
  • Pager
    • Bind using unique event namespace. See issue #961.
  • Scroller
    • Prevent error on destroy when not applied. See issue #965.
    • Fix js error in old IE.
    • Delay resize after updateAll.
    • Include sortEnd in fixed column updates. See issue #977.
  • Sort2Hash
    • This widget updates the location hash based on the table sort, and sets the table sort on initialization. demo.
    • A user can share a link with others and have the table in the same sorted order.
    • The hash can be set to use header text and any text to indicate an ascending or descending sort.
    • Add text & saveSort override options. Fixes issue #962.
    • Other minor revisions.
  • Parsers
    • Checkbox in multiple columns now toggles the row class correctly.
  • Grunt build: Add jscs checking & fix reported style issues.
  • Testing
    • Update QUnit to 1.18.0.
    • Add removeWidget test.
    • Add isValueInArray tests.
    • Add isProcessing tests.
  • Extras - dropping support for quicksearch plugin.

Version 2.22.3 (6/30/2015)

  • Scroller: fix javascript error scroller_$fixedColumns is undefined.

Version 2.22.2 (6/30/2015)

  • Core
    • Only use preventDefault in specific jQuery versions (v1.3.2 & older). Fixes issue #911.
    • The "updateCache" method now accepts a tbody object.
    • Make getParsedText a public function.
    • Allow empty string in textExtraction data-attribute. Fixes issue #954.
  • Docs
    • Update trigger sort method documentation.
    • Update information about cssIgnoreRow. See issue #911.
    • Add requirement to include .filter { display: none } in custom themes.
    • Improve Bootstrap example in column selector docs. See pull #935, thanks @Herst!
    • Clean up & corrections:
      • Code examples in math & editing demos.
      • Corrected comments in "Skip the parsing of column content" demo.
      • Fix HTML validation issues.
    • Add contributing.md link to JSCS formatting file by @Herst.
    • Update to Bootstrap v3.3.5.
  • Parsers
    • Checkbox: add checkbox parser class name option (config.checkboxClass).
    • Metric: Support metric base unit case insensitivity.
  • Editable
    • Allow Shift+Enter to create a new line (even with editable_enterToAccept set as true).
    • Update cache without requiring a hover over the thead; cache order now properly maintained on touch devices.
  • Filter
    • Target last used filter properly. See issue #920.
    • filter_selectSource now ignores parsers, if none are set (empty or ajax tables). See issue #934.
    • Add support for nesting of "AND" & "OR" searches. Fixes issues #891 & #918.
    • Filter row remains visible after focused when filter_hideFilters is set.
    • Remove trailing comma in pull #948, thanks @Herst!
  • Output
    • Allow empty string data-attributes. See issue #923.
    • output_saveRows now accepts jQuery filter selectors. See issue #923.
    • Fix hiddenColumns option causing an empty output. Fixes issue #923.
    • Prevent javascript error when no row data is passed. See issue #923.
    • Remove tfoot clone, instead concat data to the end.
    • Fix colspans and hidden columns.
    • Stop outputTable method propagation. Fixes issue #944.
  • Pager
    • Make hasWidget think the pager addon is a widget.
    • Prevent adding a row if ajax returned JSON totalrows is zero. See Stackoverflow.
  • RepeatHeaders
    • use selectorRemove option setting.
  • Resizable
    • Replace window resize trigger. See issue #912.
    • Resizing now works with overflow wrapped tables. Fixes issue #953.
  • Scroller
    • Fix added stylesheet error using "," instead of ";".
    • Remove colgroup & hidden elements in fixed columns.
    • Fix slow fixed column scrolling in Firefox. See issue #135.
    • Multiple tbody fix. See issues #906 & #913.
    • Limit horizontal scrollbar to scrolling section.
    • Removed widthFixed requirement.
    • Update RTL support.
    • Fix column alignment. Fixes issue #913.
    • Fix filter return zero to few rows.
    • Reduce init lag & correct no fixed column tbody width. See issue #906.
    • Fix mousewheel scrolling on fixed columns.
    • Cleanup & old IE fix.
    • Fix column alignment issues #940, #937, #931 & #927.
    • Throttle IE scrolling. Partially fixes issue #928.
    • Save scroll positioning. Fixes issues #926 & #932.
    • Integrate with:
  • SortTbodies (beta)
  • StickyHeaders
  • Zebra
    • Target non-info block tbodies in extra tables.
  • Grunt
    • Update grunt modules.
    • Remove moot "version" property from bower.json. See pull #941, thanks @kkirsche!
    • Don't update bower.json in Gruntfile.js.
    • Check for old IE issue in pull #949, thanks @Herst!

Version 2.22.1 (5/17/2015)

  • Filter: fix issue with searches always looking for parsed content in numeric columns.

Version 2.22.0 (5/17/2015)

  • Docs
    • Lots of minor version updates, spelling corrections & clarifications in wording.
    • Update box-sizing styles (ref).
    • Update characterEquivalents cross-reference to correctly match the code of the plugin.
    • Add Build table widget example resulting HTML for the json example.
  • Grunt build
    • package.json files now points to the entire "dist" folder. See issue #881.
    • Add grunt quick build to only update widget & parser files; it skips updating the dates in the widgets & combined files.
  • Core
    • The isDigit function now reports false on empty strings. See issue #865.
    • Add pointer events options (pointerClick, pointerDown and pointerUp). Fixes issue #885.
    • Prevent js error when using the computeColumnIndex function on empty tables (used by the math widget). Fixes issue #889.
    • Prevent js error when sortList includes an out-of-bounds column. Fixes issue #908.
    • Centralize extractor & parser code; this code is used by the main build cache loop and the "addRows" & "updateCell" methods.
    • Child row content is now properly stored in row data as an array of arrays.
    • Add "o" to sortLocaleCompare replacement table & update docs.
    • Replace all instances of using jQuery each with plain javascript. Fixes issue #827.
  • Editable
    • Modify trimContent option & use HTML to modify text. Fixes issue #886.
    • Fix selectAll & change tbody mouseleave to complete editing to thead mouseenter. Fixes issue #848.
    • Only make table cell child div/span contenteditable. See issue #900.
    • Add remove widget code & allow dynamic updating if the "no-edit" class changes. Fixes issue #900.
  • Filter
    • Regex filter searches now cache the created regex object for each query to optimize speed & a regex search now properly uses case-sensitive content
    • Add data parameter to filter_functions. This is the same data used by the filter search type functions. See issue #891.
    • Any match searches which target specific columns will no longer save each filter to its respective column; see "AnyMatch Searches" documentation.
    • Operator filter searchs now ignore empty strings (because "" < 10 is true).
    • Clean up parseFilter function.
    • Add filter_childByColumn option.
      • Setting this to true allows searching through the child rows by column.
      • When false, the search behaves as before and all child row content is included in the search of every column.
      • See a demo here.
      • Fixes issues #396 & #574.
    • Code cleanup - added a bunch of whitespace & forced line wraps at around 120.
    • Prevent setFilter function from setting the same filters after an update. Fixes issues #903 & #733.
  • Grouping
    • Add keyboard accessibility to group headers. See issue #260.
  • Math
    • Fix issues with isNaN('') // false. See issue #873.
    • Reapply column indexing after updates & prevent js error on empty tables. Fixes issue #889.
    • Reduce update time to 20ms. See issue #898.
    • Exclude ignored cells even if math_ignore is empty. Fixes issue #896.
  • Output
    • Add BOM back to downloaded file. Fixes issue #862.
    • Add output_hiddenColumns option. Fixes issue #869.
    • Add known issues section about downloading in Safari.
  • Pager (addon & widget)
    • Replace all instances of using jQuery each with plain javascript. Fixes issue #827.
  • Resizable
    • Refreshing the widget will now preserve the storage. See issue #874.
  • Scroller
    • Set overflow-x auto & apply border-box to scroller. See issue #135.
    • Remove pointer-events: none from fixed column. See issue #878.
    • Hide fixed column scrollbar in IE9 & older. See issue #135.
    • Update pointer-events and tabbing accessibility. See issue #135.
    • setFixedColumnSize now properly updates with no set size.
    • Add scroller_addFixedOverlay
      • When true, a fixed column overlay is added for additional styling. See issue #887.
      • It includes css pointer-events set to none to allow interaction with elements underneath; make sure your browser supports it!
    • Fix selector issue in the remove function.
    • Properly refresh column size after an update. Fixes the third part of issue #906.
  • Parsers
    • Add "inputs-numeric" parser. Fixes issue #888.
    • Add jQuery Globalize date & number parsers.
    • "namedNumbers" parser: ignores adjacent puncutation. Fixes issue #890.
    • input-select parsers:
      • Clean up & add event namespaces.
      • Now return an empty string if the value is empty; previously, it would return the cell text when the value was empty.
    • Network "MAC" parser:
      • Return the original string if the address is grossly invalid. Fixes issue #895.
      • No longer auto-detect as iPv6. See issue #895.
  • Themes

Version 2.21.5 (4/8/2015)

  • Filter
    • Cache main loop variables - speed enhancement.
    • Allow setting filter_selectSource along with filter_functions (demo).
  • Resizable
    • Integrate with columnSelector. See issue #859.
    • Prevent javascript error.
    • Resizable handles now properly align when the table is within a layout with margins. Fixes issue #864.
  • Scroller

Version 2.21.4 (3/28/2015)

  • Core
    • Add a utility $.tablesorter.getColumnText() function.
      • This function will provide a centralized method of obtaining column data (raw & parsed text from cells) and allow processing cells.
      • I plan to update all widgets that need to interact or obtain column data to use this function in v2.22.0.
  • Build
    • The build process now includes selected parsers (added parsers option to build json).
    • A new jquery.tablesorter.combined.js file is created which will contain the core plugin along with all selected widgets & parsers; a default build does not have any selected parsers.
    • This will work around, but not resolve, issue #855.
  • Extras
    • Update semver.js & semver-mod.js to v4.3.3.

Version 2.21.3 (3/26/2015)

  • Core
    • Fix icon targeting for class names
    • Modified sort initiation method. A "click" event can now be triggered on a header to initiate a sort - issue #849. Thanks johnjameswhitman.
    • General code cleanup; mostly changing tagName to nodeName.
    • Modified, then removed all references to config.$extraTables and config.$extraHeaders as it was causing a memory leak.
  • Docs
    • Update jQuery to v1.11.2.
    • Update Bootstrap to v3.3.4.
  • Grunt Build
    • Add custom build file name. See issue #829.
    • The default custom build file name is now "jquery.tablesorter.custom-widgets.js".
    • See the Customize wiki page for more details.
  • Filter
    • Make "disabled" a modifiable class name - modify it in $.tablesorter.css.filterDisabled.
    • Select2 filter formatter now escapes forward slashes.
  • Output:
    • Minor code tweak.
  • Pager:
    • Make pagerUpdate method page parameter optional. It was previously required or the page would reset to 0.
    • Remove "refreshComplete" bind on destroy. Fixes issue #854.
  • Resizable:
    • Major overhaul of this widget to now make it compatible with the stickyHeaders widget.
    • Sadly, it still doesn't work properly with the updated scroller widget; it's on my to-do list!
  • Scroller:
  • Storage:
    • Add option (widgetOptions.storage_useSessionStorage) to allow switching from local to session storage. Fixes #851.
    • Add a bunch of other storage widget options including storage_tableId, storage_group, storage_fixedUrl and storage_page. See the documentation on how they might be useful.
    • Deprecated config.fixedUrl in favor of the widgetOptions.storage_fixedUrl option.
  • Themes
    • Add "hover" class to all hover definitions (for the scroller widget mostly).
    • Remove filter element offsetting margins.
    • Target background-color instead of background. Fixes issue #853.

Version 2.21.2 (3/13/2015)

  • Core: get accurate column count. Fixes issue #840.
  • Docs
    • Update to use jQuery UI v1.11.4.
    • Add note about resizable widget needing a non-breaking space in an empty cell. Fixes issue #844.
  • Editable: fix editable not updating properly on update/pager complete.
  • Filter: prevent error if parseFilter returns NaN - this depends on what custom parsers return.
  • Output: change carriage returns & tabs to unicode equivalent so it works in Excel. Fixes issue #845.
  • Pager
    • Don't recalculate total rows/pages if using ajax.
    • Remove outdated pager.min file in the addons folder; it is now available in the dist/js/extras folder.
  • Uitheme: add icon classes while using stickyHeaders. See issue #842.

Version 2.21.1 (3/10/2015)

  • Core:
    • Optimize getColumnData function.
    • Use :last instead of .last() to maintain jQuery v1.2.6 compatibility.
    • Allow multiple icon class names in the cssIcon definition.
  • Docs
    • Remove initial sort on first table to avoid confusion.
    • Miscellaneous tweaks.
  • Build
    • Add UMD wrapper to built "jquery.tablesorter.widgets.js" file. Thanks to nburlett (pull #837)!
  • Scroller
    • Properly adjust column widths; fixes issue #836.

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.

Version 2.19.1 (2/9/2015)

  • Core
    • Replace all double quote with a single - OCD made me do it!
    • Save raw table cell text (unparsed) into the cache.
  • Core/Widgets
    • Fix a problem with event unbinding when using jQuery versions 1.7 & 1.8.
    • When an unbind (or off) event string contains an untrimmed or central double space, all events on the element become unbound.
    • See jQuery bug or this demo.
    • Updated the core, and the cssStickyHeaders, editable, filter, formatter, math, pager (addon & widget), staticRow widgets and stickyHeaders widgets.
  • Chart
    • Add more data points.
  • Filter
  • Math
    • Add math_event option.
  • StaticRow
    • Add staticRow_event option.

Version 2.19.0 (2/7/2015)

  • Core
    • Add AMD/browserify support; See pull #786, thanks to mwiencek!
    • Resort variable can now contain a new sort. See issue #782.
    • Prevent resort when serverSideSorting is true. Fixes issue #764.
    • Add resort option. It is used as the fallback value when no resort parameter is included with the "updateAll", "update", "addRows" and "updateCell" methods.
    • Add removeWidget function which calls the widget remove function & removes the named widget from the config.widget option.
    • A refreshing parameter was added to the widget remove function; when true it indicates that a refreshWidgets method was triggered and that the widget will only be temporarily removed.
    • Make fixColumnWidth a public function ($.tablesorter.fixColumnWidth). Calling it will refresh set column widths dynamically. See issue #680.
    • The default textExtraction function has been optimized - node.innerText was completely removed as it is significantly slower in IE.
    • Modified the "updateCell" method to not reapply widgets if the resort parameter is false; this may resolve issue with widgets causing elements to lose focus.
    • Updated the refreshWidgets to use the removeWidget function. Once the widgets have been refreshed a "refreshComplete" event will be triggered.
    • Updated applyWidget function to allow passing a callback function.
    • Prevent adding multiple icons on refresh.
    • Trim header text added to aria label.
    • The updateAll method no longer restores headers since it is only refreshing.
    • Fix parser check while building cache which can cause unresolving parsers in case the first tbody is empty and remaining tbodies have less rows than a number of tbody. See pull #814. Thanks prijutme4ty!
  • Docs
    • Specify pager's pageSet method requires a one-based index value.
    • Miscellaneous corrections & fixes. Thanks prijutme4ty!
    • Remove uitheme widget option (it was removed in v2.14.0, but not properly documented). Pertinent information on how to modify the uitheme widget class names was moved to the core theme documentation.
    • Add a new pager variables section which contains some useful variables within the pager object (table.config.pager).
    • Update "jQuery data" demo to show the difference between setting a data-attribute and jQuery data directly.
    • Add api documentation for using the getColumnData function.
  • Parsers
    • Add countdown parser (hh:mm:ss) - demo included with the duration parser.
    • Update input-select parser to use the resort option.
  • Widgets (general)
    • Build widget & storage extension: Pass "null" to $.parseJSON as a fallback. Fixes issue #586.
    • Update remove widget function for columnSelector, cssStickyHeaders, math, pager, repeatHeaders, saveSort & stickyHeaders.
    • Widgets removed from beta: alignChar, columnSelector, math, output, print, reflow & staticRow.
  • AlignChar:
    • Don't add align character when no content is right of it. Prevents adding a hanging decimal, e.g. 3000..
  • Chart widget (New; beta):
    • Generic chart widget used to basically extract data from the table and output in multiple formats.
    • Current chart libraries supported: Google charts, Highcharts & FusionCharts.
    • Some additional processing may be required to add extra variables (graph colors, labels, etc).
    • A demo is available here.
    • An example of this widget is also available here.
    • Thanks to TheSin- for creating this widget!
  • ColumnSelector:
    • Fix column index issue, again.
    • The refreshColumnSelector method has been updated to accept a parameter (get more details):
      • If an array of zero-based column indexes is passed by this method, "auto" mode will be disabled & only columns within the array will be shown - critical or disabled columns will always be shown.
      • If a non-array is passed by this method, the "auto" mode will be enabled.
      • Fixes issue #798.
    • A change in "auto" checkbox now triggers a "columnUpdate" event.
  • Dragtable (New; beta)
    • The dragtable jQuery UI widget adds column reordering to a table.

    • This isn't a tablesorter widget, but a modification made to a jQuery UI widget to better integrate with tablesorter - demo.

    • A modified version of dragtable has been included in the "extras" folder; this is a jQuery UI widget, not a tablesorter widget!

      $(function () {
        $('table')
          .dragtable({
            dragHandle: '.table-handle',
            excludeFooter: true
          })
          .tablesorter({
            theme: 'blue',
            selectorSort: '.sort',
            widgets: ['zebra', 'filter']
          });
      });
    • This modified version, so far, allows column reordering to work with the filter & resizable widgets.

    • Additional work will be required to get this jQuery UI widget to work with the scroller, columnSelector &amp stickyHeaders widgets.

    • Fixes issue #781, and portions of issue #215 and #186.

  • Editable
    • Update to add a editable_columnsArray which is created from the editable_columns option. When editable_columns contains a string (e.g. 0-3), this option will contain an array of zero-based column indexes.
    • The dragtable mod widget can then use this option to rearrange and maintain editable columns properly.
  • Filter
    • Hide filter row using the filtered class name (table.config.widgetOptions.filter_filteredRow).
    • Select source, and unparsed filter text now priorities data from the textAttribute. Fixes issues with Formatter widget - see issue #812.
    • Update select2 filterFormatter code to properly escape regexp characters. Fixes issue #796.
    • Normalize table parameter for public functions.
  • Formatter (New; beta)
    • This new widget allows you to apply formatting to the columns (demo).
    • Fixes issue #812.
  • Output
    • Fix trim spaces for header cells.
  • Pager
    • pageReset now used while filtering. See issue #778.
    • Get most up-to-date filter before setting pageReset. Fixes issue #783.
    • filteredRows now properly calculated when first tbody is set with a cssInfoBlock class name`.
    • Page size resets to original page setting instead of always 10.
    • Add pageAndSize method to set both the page & size.
    • Add pagerUpdate method to force a pager update; even if no ajax parameters have changed. Fixes issue #801.
    • Add cachedIndex variable which is useful if you need to find the currently visible rows within the pager in the internal cache (table.config.cache). See the documentation for an example.
    • Update goto selector independently of other elements. Fixes issue #811.
    • Modified to apply widgets & fire "pagerComplete" after the cache is built; this specifically applies to ajax tables.
  • Print
    • Ignore columnSelector "auto" setting when columnSelector_mediaquery option is disabled (false). Fixes issue #808.
  • Reflow
    • Trim stored header text.
  • Scroller
    • Resizing & browser zooming should now show proper widths. Fixes issues #680 & #634.
  • UITheme
    • Now updates properly when dynamically changing the table.config.theme option.
    • During an update, add inner wrapper to specific columns that are missing it.
    • Add separate sort class names to both the header & icon element; breaks old demos, but falls in-line with the addition of core css icon class settings in v2.18.3.
  • Themes
    • Add filter row background color; it appears that Chrome uses the <tr> background color when the hideme class is added to the row.
    • Updated Bootstrap to 3.3.2.
  • Testing
    • Update QUnit.
    • Remove jsHint checks.

Version 2.18.4 (12/22/2014)

  • Docs
    • Add link to demo showing how to apply jQuery selectmenu widget to a filter
    • Update theme switcher linked styles
    • Add clarification on using jQuery selectors that target the header cell. Fixes issue #766.
    • Fix various typos. Thanks seanhussey!
    • Add cssIgnoreRow docs.
  • Core
    • Add cssIgnoreRow option. Added to a header row that is to be ignored & not added to the config.$headers variable.
    • Allow passing alternate headers to getColumnData function.
  • ColumnSelector widget
    • Add columnUpdate event when columnSelector is updated.
    • Add columnSelector_cssChecked option - css class name added to checkboxes.
  • Pager (addon & widget)
    • Ensure filteredRows variable gets updated before the move to page function is called. Fixes issue #778.
  • StickyHeaders widget
    • Make includeCaption option dynamic; add note of new jQuery requirement.
    • Add popup window demo to sticky headers example.
  • Themes
    • Style filter input & selects only.
    • Only style <i> tags from tablesorter on theme Bootstrap v2 & less file. Thanks frodrigo!
    • Modify theme Dropbox & grey to also only target icon class name for css styling.

Version 2.18.3 (11/7/2014)

  • Core
    • Add class names to the header icons: cssIconNone, cssIconAsc & cssIconDesc to indicate the sort status.
    • The widthFixed option will no longer target nested table colgroup elements to determine if it needs to add a new colgroup.
  • Docs
    • Updated Bootstrap theme example.
    • Pager widget option comment corrections.
  • Themes: update all themes to hide all elements in the filter row when the filter_hideFilters option is true
  • CssStickyHeaders widget: tables with a caption now work properly in Firefox.

Version 2.18.2 (11/3/2014)

  • Filter widget

    • Fixed initialization intermittently stalling.
  • Pager addon & widget

    • Fixed pager addon javascript error.
    • Fixed pager widget not firing off "pagerComplete" in non-ajax tables.
    • Fixed savePages being overwritten on initialization.
    • Fixed pager widget updating the table content in non-ajax tables.

Version 2.18.1 (11/3/2014)

  • Core

    • Add cssAllowClicks option; setting "tablesorter-allowClicks" on a header cell will allow clicks to bubble up.
    • A column can now be targeted using a class name within the header cell as well as the header cell itself; this only applies to previous options that could use a class name/id to target the header cell.
  • Docs

    • Emphasize that this is a fork of tablesorter. Fixes issue #758.
    • Update jQuery UI to 1.11.2.
    • Update to Bootstrap 3.3.0.
    • Update QUnit & fixed testing errors.
    • Various updates to version numbers & corrections.
  • ColumnSelector widget:

  • CssStickyHeaders widget:

    • Fixed Chrome caption issue.
    • Nested tables now work properly in IE.
  • Pager addon & widget

    • Fix selectorRemove class name parsing.
    • A pagerComplete event now fires off immediately after initialization & once again fires on non-ajax tables.
    • Fix double pagerComplete events firing on init & initial filter settings.
    • Fix pager initialization with filter widget & displaying page output. Fixes issue #755 & issue #757.
    • Current filters now update properly. See issue #757.
  • UItheme widget:

    • Fixed undefined removeClass selector which previously removed all classes.

Version 2.18.0 (10/26/2014)

  • Core
    • Move "ipAddress" parser into parser-network.js parser file.
    • Add "image" parser to core.
    • Add widgetClass option
      • Allows adding widgets to the table by adding a table class name.
      • Fix debug logs for applying widgets.
      • Fixes issue #743.
    • Add $cell parameter to parser detection is function (is: function(s, table, cell, $cell) { /* ... */ }).
    • Add $table parameter to onRenderHeader function (onRenderHeader: function (index, config, $table){ /* ... */ }).
    • Fix ARIA caption label reference.
    • Get column index from data-attribute when sorting.
    • The aria-labelledby attribute is no longer to all nested captions.
    • Update widgetClass option matching. See issue #743.
  • Themes
    • Include caption element in metro theme; update various demo theme selectors to include the metro theme.
    • Fix zebra striping in nested tables.
  • Parsers
    • Created parser-network.js parser
      • Removed "ipAddress" parser from core.
      • Move "ipAddress" parser into this file; a duplicate of the parser named "ipv4Address" is included.
      • Moved "ipv6Address" parser into this file.
      • Added new MAC parser.
    • Update all date parsers to ensure a valid date is being parsed.
    • Add named number parser & demo.
  • Column Selector widget
    • Prevent adding a media query when no priorities are set.
    • col element will now be hidden along with the column. Fixes issues #740.
  • Editable widget
    • Make updatable so this widget works with the pager. Fixes issue #732.
  • Filter widget
    • Fix wildcard match logic to behave logically. Fixes issue #727.
    • Add filter_cellFilter option. Fixes issue #731.
    • External inputs can now target multiple columns (e.g. data-column="0-2,4,6-7"); see this Stackoverflow question.
    • Any match filters now properly uses filter_ignoreCase. Fixes issue #748.
    • Fix saved filter updates to multiple or "any" column inputs.
  • Grouping widget
    • Add "monthyear" grouping to dates. Fixes issue #744.
  • Pager addon & widget
    • Use a sample of page number links for large collections.
      • Add maxOptionSize option
      • Tweak code & fix problems introduces in pull #711.
      • Thanks camallen!
    • Fix output display not updating on initialization.
    • Add url check to allow ajax updating of table. Fixes issue #730.
    • Check for dynamically changing ajaxUrl option.
    • Add ajaxObject to the table.config.pager variable.
    • IE requires a value attribute for every option. Fixes issue #734.
    • Revert some code modified for large collections to use jQuery instead of native javascript (more IE issues).
    • Ensure pager.filteredRows is current on page move. See issue #745.
    • Fix empty table select showing 0 & 1 pages.
    • The fixedHeight option is now working properly. Fixes issue #742 & issue #729.
    • Widget cleanup & only use the last search data.
    • Add note about including an ajax success function within the ajaxObject definition. See issue #749.
  • RepeatHeaders widget
    • Now works with filtered & nested tables.
  • Resizable widget
    • Make it work inside of an overflow container. Fixes issue #737.
  • Scroller widget
    • Remove scroller_idPrefix in lieu of a unique namespace id.
  • StickyHeaders widget
    • Now stacks when within a nested table.
    • Wrapped sticky header components (thead & caption) in a sticky div.
    • Added stickyHeaders_xScroll and stickyHeaders_yScroll options.
    • Removed jQuery UI selection from the demo to allow the accordion to be properly themed.
  • CssStickyHeaders widget
    • Now stacks when within a nested table.
    • Removed cssStickyHeaders_zIndex option as the widget no longer uses relative positioning (it wasn't necessary)
    • Please note that using this widget on nested tables does not work properly in ALL versions of IE (including IE11).
  • UITheme
    • Ignore nested tables.
    • Add method to remove previous theme.
    • Fix multiple header row sort icons.

Version 2.17.8 (9/15/2014)

  • Core
    • Fix widthFixed option to ignore info block tbodies.
    • Make emptyTo & stringTo settings case insensitive.
    • An empty string headerTemplate option will now prevent adding an inner div to the header.
  • Docs
    • Fix setting active accordion from hash script.
    • Add emptyTo clarification.
    • Main readme: Add related projects section.
  • Editable
    • Autoresort true no longer breaks the table.
    • Update demo to use row id instead of index.
    • Update validate function to allow setting it per column.
    • Add editable_focus, editable_blur and editable_selectAll options. See issue #708.
    • Add editable_wrapContent option.
    • Add editable_trimContent option.
    • Validate function now includes a contenteditable element parameter.
    • All text callback parameters are now trimmed.
    • Trim everything & revert widget changes.
    • Refocus edited element after resort only.
    • Switch form focus to focusout.
  • Filter
    • Add filter_defaultFilter option.
      • fix issue with using class selectors.
      • Make happy with spaces within the query.
      • Will override exact/partial select filters. Fixes issue #721.
      • Fixes issue #704.
    • Add filter_excludeFilter option; add multiple exclusions separated by spaces, not commas.
    • Prevent multiple searches during initialization.
    • Ensure initial filter settings get applied.
    • Selects will exactly match the selected option unless "filter-match" class is set. Fixes issue #721.
  • Pager
    • Update cache & rows copy. Fixes issue #703.
    • Use native javascript to populate & set the goto select. Fixes issue #711.
    • Custom pager controls. Fix control updates for multiple tables.
    • Fix pager widget to be properly applied after a page move.
  • StickyHeaders: Fix issue so it works with jQuery v1.2.6 again.
  • Zebra: Apply style to one row. Fixes issue #715.
  • Parser
    • Duration parser - added with demo.
    • Select parser - Fix for IE10+ not allowing select options to be clicked.
    • IgnoreArticles parser - Added ignoreArticlesExcept option.
    • url parser - ensure it is used by the filter widget.

Version 2.17.7 (8/9/2014)

  • Core: Do not detach rows before appending to prevent ajax rows from disappearing. Fixes issue #701.
  • Docs: Fix change log links.
  • Filter: attached external select causing javascript errors. Fixes issue #702.

Version 2.17.6 (8/1/2014)

  • Core
    • Adding a class name of parser-false to a column will now automatically set sorter-false and filter-false behavior.
    • Add extractor type which allows giving a column two parsers, one to extract content from an input/select and the second to parse the extracted text. Thanks to TheSin-!
    • Ensure custom parsed data adheres to the ignoreCase option.
    • Add a delay to any sort if there is an update in progress. This prevents issues with a sort being applied causing duplicate rows to be added to the table, hopefully.
    • The widthFixed option now finds both visible th and td cells within the first row of the tbody to set column width percentages.
    • Ensure all rows have a set role for screen readers (role="row"). Fixes issue #690.
    • Redefine c.$headers when building headers for new/replaced header cells (not just content). Fixes issue #683.
  • Docs
    • Fixed lots of minor HTML issues (e.g. missing closing </li> & <p> tags)
  • Parsers
    • Add parser for textareas within the parser-input-select.js file.
    • Modify input & textarea parser to only update the table cache when:
      • The user presses enter (input) or alt + enter (textarea) within the element.
      • When the element is blurred.
      • Or, when the mouse leaves the tbody.
  • Editable
    • Add two new options:
      • editable_autoAccept: accepts any changes made to the table cell automatically (true by default)
      • editable_validate: a function used to validate the changes; return a valid string (null by default)
    • Modify editable_columns type check to prevent javascript errors. See pull #688. Thanks scratcher28!
    • Limit the editable_columns array value to columns within the table.
  • Filter
    • Make all options show within the current select when the filter-onlyAvail class is set on a column.
    • Updated & added docs for $.tablesorter.filter.buildSelect function to allow external calls to modify filter select options.
    • Update filter_selectSource to accept arrays instead of a function. This was documented as working, but it wasn't coded until now. Sorry!
    • Add filter_selectSourceSeparator option:
      • Include a separator within the filter_selectSource array (e.g. "a-z|A through Z").
      • The text that is left of the separator is added to the option value, the the text on the right is added to the option text.
      • So "a-z|A through Z" becomes <option value="a-z">A through Z</option>.
      • Fixes issue #692.
    • Add role="row" to the filter row. Fixes issue #697.
    • Any match inputs now follow the filter_startsWith setting. See this Stackoverflow question.
  • Pager
    • The output option can now include user modifiable startRow ({startRow:input}) or page ({page:input}) inputs within the output.
    • Remove selected attribute from page selector options. Fixes issue #700.
  • Resizable
    • Update $.tablesorter.addHeaderResizeEvent function's first parameter table to accept table DOM elements as well as jQuery objects. Fixes issue #687.

Version 2.17.5 (7/17/2014)

  • Core

    • Update config.totalRows variable before initialization. Fixes issue #670.
    • Add config.table variable; useful for functions that only pass the config.
    • Ensure widget init functions are only called once; and set indicator for all widgets, not just ones with options (for hasWidget).
  • Docs

  • Filter

    • Force cache build on initial search when delayInit is true. Fixes issue #678.
    • Make config.filteredRows count available within filterInit event. Fixes issue #670.
    • Selects now obtain parsed data when it is set for a particular column. Fixes issue #684.
    • Ignore change event if input value hasn't changed, otherwise it interferes with other events within the table. Fixes issue #685.
    • Ensure search query is parsed for both specific filter types and non-filter type searches, if the column is set to use parsed data.
    • Filter initialization ("filterInit") event is now delayed to prevent filterStart & filterEnd event spamming. Fixes issue #668.
    • Filter formatter functions are now required to call a function after initialization to delay "filterInit" event. Fixes issue #668.
  • Output

    • Update download method which allows downloading files without modifying the server htaccess. Fixes issue #681.
  • Pager

    • Initialize without building cache when delayInit is true. Fixes issue #678.
  • Parsers

    • Update input/select element binding
    • Add image alt parser; set config.imgAttr with attribute to target (default is "alt").
    • Add select-text parser which grabs the currently selected option text instead of the select value.
  • Resizable

    • Remove unused grip code

Version 2.17.4 (7/4/2014)

  • Docs

    • Copied the tablesorter initialized option from the event section into the configuration; renamed the event appropriately (tablesorter-initialized event)
    • Added notes about how to bind to "init" events; they should be bound before initializing tablesorter because in most cases, the events fire before the binding occurs.
  • Core

    • Add $.tablesorter.hasWidget(table, 'widgetId') function. It returns a boolean value of true when the named widget is actively applied to the table.
  • Filter

    • Add filter_searchFiltered option to allow disabling the search of already filtered rows.
    • The filter_initialized flag now gets set appropriately. Fixes issue #668.
    • Include any column filter in determination of searching already filtered rows. Fixes issue #669.
    • Add internal config.filteredRows variable. Provides a value of the number of currently filtered (visible) rows. Fixes issue #670.
    • Add internal config.totalRows variable. Provides a value of the total number of rows in the current table, not including info-tbody rows.
    • Fix change/search event being ignored for selects & filterFormatter extensions.
    • filterInit and filterEnd events now pass config as a parameter.
  • Pager

    • Removed from beta status
    • Filtered rows now equals the total rows when ajaxProcessing returns an array. Fixes issue #667.
    • Update the config.filteredRows when using ajax to match the internal config.pager.filteredRows. See issue #670.
    • Widget only: ensure pagerComplete event fires on initialization.
  • Resizable

    • Bind mousemove to document instead of table header. Makes resizable handle use consistent with other resizing libraries, as the user would expect. Fixes issue #665.
    • Add resizable_throttle option to allow throttling of the mousemove/resize event. Set this option to true or a number between 1 and 10 to add a throttling delay. Fixes issue #662.
  • UITheme: non-existent columns no longer cause a js error. Fixes issue #672.

Version 2.17.3 (6/28/2014)

  • Docs

    • Added bold notes to the output widget demo about setting the server content-disposition. Fixes issue #653.
    • Updated to latest Bootstrap (v3.2.0), jQuery UI (v1.11.0) and Cupertino theme.
    • Embedded gists within the documentation should now work properly.
  • Core

    • Add "tablesorter-processing" class name to table during processing. Fixes issue #655.
  • Filter

    • When filter_liveSearch is set to a number, it now searches when pressing enter. Fixes issue #654.
    • Modify change event so a select searches the table without requiring a carriage return. Fixes issue #650.
  • Pager

    • Objects returned by ajaxProcessing can now include a filteredRows value. Fixes issue #649.
    • Fix internal use of selectorRemove option, to consistently extract out the class name from the selector string.
    • Previous & Next buttons now disable with zero filtered pages. Fixes issue #649.
    • Changed pager widget goto page selector option to gotoPage, because goto is a reserved word. Fixes issue #657.
  • Scroller

    • Add scroller_upAfterSort option to prevent scrolling after clicking a checkbox. Fixes issue #660.
  • Static Row

    • Static rows are now manipulated witin a detached tbody.
    • Updated demo to allow toggling of static rows using ctrl (or command on Mac) + click.
  • Parsers

    • Added new Roman numeral parsers. There are three different parsers to cover three different use cases. Please see the roman numeral parser demo for details.

Version 2.17.2 (6/18/2014)

  • Docs

    • Added more details about using pager ajax options.
  • Core

    • The clearTableBody function now detaches rows instead of incorrectly detaching the tbody.
  • Editable widget:

  • Filter widget:

    • The selectSource option now correctly handles parsed values that return zero.
    • Filter formatter for jQuery UI datepicker now remembers the correct date.
    • Corrected filter events & prevent table manipulation if filters are empty on initialization. Fixes issue #645.
  • Pager addon/widget:

    • Specifically target rows to prevent issues with ember scripts. Fixes issue #638.
    • Correctly detach and append jQuery rows provided by the ajaxProcessing function. Fixes issue #650.
  • Print

    • jQuery requirement modified to support jQuery v1.2+ (previously it was v1.7+).
    • Popup now automatically closes with print dialog. Fixes issue #643.
  • Scroller widget:

    • The thead width is now set in IE. Fixes issue #637.
    • Set column widths are now maintained, including Bootstrap. Fixes issues #634 & #380.
    • Change default scroll bar width to 18. Fixes issue #363.
    • Scroller now behaves properly with horizontal overflow scroll, column alignments, and hidden cells. Fixes issues #340 & #333.
  • Themes

    • Bootstrap white unsorted icon now shows when the icon-white class is added. See issue #648.
    • Remove auto height settings from filter elements.

Version 2.17.1 (5/28/2014)

  • Docs:

    • Add some missing examples & updated some version number comments for the last update
    • Reflow widget: Fix demo to use preset widths & css transitions instead of forcing users to manually resize the examples.
    • Output widget: add note about modifying the .htaccess file to enable downloading in both IE & Firefox.
  • Core

    • Allow use of select & buttons within header cells. Previously only inputs were allowed. Fixes issue #625.
    • Add parser-false setting to prevent extracting & parsing of content from set columns. Fixes issue #629.
  • Filter widget

    • Add a not-exact-match (!=) filter type (e.g. !"Bruce" or !Bruce= will show all rows that don't exactly match Bruce). See issue #628.
  • Math widget

    • Values are now obtained from data-attributes first, then the actual cell content. This will allow making calculations with higher precision values. Fixes issue #624.
  • Pager (addon & widget)

    • The ajaxProcessing function now includes the jqxhr parameter. Thanks JuarezTurrini! See pull #626
    • Update the custom controls example to properly work with the pager widget. Fixes issue #631.
    • Fix widgets sometimes not being applied after page change.
  • Parser

    • input-select parser no longer binds to non-tablesorter tables. Fixes issue #633.

Version 2.17.0 (5/22/2014)

  • Overall

    • You can now target a column using a jQuery selector targeting the header cell (e.g. a class name, id or column index, as before).
    • This works with the core options: headers, textExtraction.
    • This also works with the widgets: filter_formatter, filter_functions, filter_selectSource and the headers options for filter & resizable.
    • This change has not yet been implemented to the following options: textSorter, sortList, sortForce, sortAppend and numberSorter (will modify this option to target columns soon).
    • What won't work is if you try to target the header using a filtering selector that uses an index, e.g. "th:eq()", ":gt()", ":lt()", ":first", ":last", ":even" or ":odd", ":first-child", ":last-child", ":nth-child()", ":nth-last-child()", etc.
  • Docs

    • Switch from using CDN versions of jQuery, jQuery UI, Bootstrap, Sugar and Select2 instead of using protocol-relative URLs because they are a pain to use locally.
    • Change style of "Update" tags to be slightly lighter than "New" tags.
    • Updated reflow widget demo with demo tables in a resizable iframe, so the browser window no longer needs to be resized.
    • Miscellaneous updates including correcting some version numbers, fixing links & other issues with the demos.
  • Themes

    • Fix green theme to properly include a background with the css3 sticky headers widget.
  • Core

    • Instead of using empty or clearing rows from the table, the rows are now detached. This also applies to the pager.

    • Added resetToLoadState method

      • Using this method will clear out any settings that have changed since the table was initialized (refreshes the entire table); so any sorting or modified widget options will be cleared.
      • However, it will not clear any values that were saved to storage. This method is basically like reloading the page.
    • Refer to columns in the headers and/or textExtraction option by class name, ID, or column index (as before).

      headers : {
          '.first-name' : { sorter: 'text' },
          '.disabled'   : { sorter: false }
      },
      textExtraction : {
          '.styled' : function(node, table, cellIndex) {
              return $(node).find('strong').text();
          }
      }
    • Added new "sorton" method values: "a" (ascending), "d" (descending), "n" (next), "s" (same) & "o" (opposite).

      // column 0: desc sort, column 1: asc sort
      $("#table1").trigger("sorton", [ [[0,"d"],[1,"a"]] ]);
      // column 0: next sort, column 1: opposite of column 0, column 2: same as column 0
      $("#table2").trigger("sorton", [ [[0,"n"],[1,"o"],[2,"s"]] ]);

      Please refer to the Sort table using a link outside the table demo for more details.

  • ColumnSelector widget

    • Added a method to refresh the selected columns using $('table').trigger('refreshColumnSelector');.
    • Fix a js error when removing the widget.
  • Filter widget

    • Fix child row filtering.

    • Fix filter-match searches.

    • Set filter parser or disable a filter in the headers option by referring to the header class name, ID, or column index (as before)

      headers : {
          '.first-name' : { filter : false },
          '.last-name'  : { filter : 'parsed' }
      }
    • Refer to filter_functions, filter_formatter and filter_selectSource columns by class name, ID, or column index (as before)

      filter_functions : {
          ".col-date" : {
              "< 2004" : function (e, n, f, i) {
                  return n < Date.UTC(2004, 0, 1); // < Jan 1 2004
              },
              ...
          }
      },
      filter_formatter : {
          ".col-value" : function($cell, indx){
            return $.tablesorter.filterFormatter.uiSpinner( $cell, indx, {
              ...
            });
          }
      },
      filter_selectSource : {
          ".model-number" : [ "abc", "def", "ghi", "xyz" ]
      }
  • Math widget

    • Now works properly with the pager. Fixes issue #621.
  • Output widget

    • Add output_ignoreColumns option. Set the zero-based index of the columns to ignore in this array. Fixes issue #607
    • Add config parameter to output_callback function. NOTE: this parameter is added before the data parameter, so it may break any already existing custom callback functions.
    • Add output_duplicateSpans option. Setting this option to false adds blank entries instead of duplicating the colspan or rowspan content. Fixes issue #619.
  • Pager (addon & widget)

    • Use detach instead of empty on tbody rows. This should save any data associated with the rows.
    • Fix pager updating not showing correct totals.
  • Print widget

    • Add print_callback option allowing manipulation of the table & stylesheet before printing.
    • Corrected the print_columns settings comments.
  • Resizable widget

    • Disable a resizable header within the headers option by referring to the column class name, ID, or column index (as before)

      headers : {
          '.first-name' : { resizable: false }
      }
    • Added note about using box-sizing & jQuery versions older than 1.8.

  • Scroller widget

    • Filter widget works with this widget again. Fixes issue #620.

Version 2.16.4 (5/5/2014)

  • Docs

    • Fix stickyHeaders scroll position adjustment.
    • Update sticky headers widget demo to include the stickyHeaders_filteredToTop option
  • ColumnSelector widget: updated css to include print media for the new print widget.

  • cssStickyHeaders widget: add cssStickyHeaders_filteredToTop option.

  • Filter widget

    • Search operators (< <= >= >) now properly uses the parser.
    • Range, not matches (!) & search operators now search all rows as needed.
    • Add filter language option, set the lanuage of to, or and and. Fixes issue #602.
    • Prevent form submission when pressing enter within the filter.
    • Prevent javascript error if delayInit is set to true.
    • Add a bunch of filter tests.
  • Math widget

    • Add math_prefix and math_suffix options.
    • The demo now includes a bunch of mask examples and an interactive example.
  • Output widget

  • Pager:

    • Updated custom pager controls code to show the correct number of pages when the table is filtered.
    • Fixes issue #605.
  • Print widget (new)

    • The user can print all, visible or filtered rows. And, choose to print all, visible or selected columns (using the columnSelector widget).
    • By default, the widget is set to only print filtered rows & visible columns.
    • Note this required an update to the columnSelector widget to include print media.
    • Try out the print widget demo.
  • Miscellaneous

    • Add Metro dark theme css file & demo
    • Add Metro LESS file - see this interactive demo.
    • Add Bootstrap LESS file - see this interactive demo.
    • Metro style includes encoded images. The images & psd have also been included.

Version 2.16.3 (4/30/2014)

  • Docs:

  • Core:

    • Fix headers option indexing of cells in multiple header rows
      • Setting an index in the multiple row header will now correctly set the column parser.
      • See this demo - the 10th cell (zero-based index) in the header has the sorter set to "month".
    • Set processing icon to only show after 500ms, it will not show at all if the sort ends before then.
    • Check for jQuery's closest function and use it, or fall back to equivalent code (maintaining support for jQuery 1.2.6+). Fixes issue #597.
    • Remove widget init delay added in v2.16.1-beta.
  • Filter:

    • Remove old cached indexing:
    • Update check for "filter-parsed" class, because the getData function will only return the first class name starting with "filter-".
    • Filter select updates:
      • Add filter-select-nosort header class name to prevent select option sorting.
      • Filter select option sort now uses the assigned column parser to parse & sort the options.
      • Filter select options are now sorted using the textSorter function, if set, and if not set, it falls back to natural sorting.
      • Fixes issue #599.
      • Add note to ensure textSorter receives strings, or a javascript error occurs.
    • Select2 filterFormatter now allows setting of initial settings. Fixes issue #598.
  • Sticky Headers

Version 2.16.2 (4/27/2014)

  • Docs:
    • Added basic setup for output widget.
    • Show various updates.
    • Update readme with more resources.
  • Core:
    • update addRows method will now accept a string or jQuery object.
    • Sort direction is now counted correctly.
    • Add "emptyMin" & "emptyMax" setting to emptyTo option. Fixes issue #577.
    • Add internal config.$extraHeaders variable.
  • Filter widget:
    • Search already filtered rows when not exactly matching content. Fixes issue #593.
    • Ensure filter_functions option is not null. Fixes issue #593.
    • Filter formatter: set datepicker to null. Fixes issue #512.
  • Math widget: add data-math-mask for each cell.
  • StickyHeaders
    • Check for filters before trying to set focus. Fixes issue #594.
    • Add stickyHeaders_filteredToTop option. Fixes issue #570.
  • Input select parser: don't update columns with both sorter & filter disabled. See issue #570.

Version 2.16.1 (4/24/2014)

  • Core:
    • Fixed an issue where ajax loaded data would cause a javascript error because of improper ignoring of data.
    • Ajax loaded data will now be parsed and cached - so stuff like the grouping widget will work properly.

Version 2.16.0 (4/23/2014)

  • Docs

    • Add notice to readme about upgrading to v2.16.
    • Add question section to readme about where to ask questions, including the new IRC channel.
    • Update jQuery UI accordion code to reapply widgets to tables within the section, when open.
  • Build widget

    • Now works with HTML in the data
    • Add zebra widget to demos.
  • Core

    • Check more than the first tbody when detecting parsers. Fixes issue #589.
    • Apply widgets on table initialization after a short delay.
  • Filter widget:

    • Fix search already filtered rows
    • Fix filteredRows count & cleanup.
    • SetFilters now behaves more like a triggered search. Fixes issue #588.
    • Filterformatter - Fix both datepicker scripts to work properly with non-U.S. formats. Fixes issue #587.
  • Pager: Now stays on the same page after updating. Fixes issue #590.

  • Testing: Add some preliminary tests for the filter widget.

Version 2.16.1-beta (4/22/2014)

  • Docs:
    • Add note about using buttons in forms (include type="button"). Fixes issue #543.
    • Add example link to select2 demo for the filter_selectSource entry.
  • Filter widget: setFilters now supports passing it a jQuery table object
  • Static Row widget
    • Add more inline comments
    • Fix issue with not repositioning static row properly within mutliple tbodies.

Version 2.16.0-beta (4/20/2014)

  • Doc & testing updates

    • More version numbers added - when certain variable & functions were added or last updated.
    • Update to use Bootstrap 3.1.1.
    • Update to the latest testing files.
    • Reorganize example section & cleanup.
    • Fix demos that include togglable parsed data.
    • Fix miscellaneous typos.
  • Core

    • Make computeColumnIndex function public (get details).
    • Move cache rows into the normalized data
      • This is a big change, as the cache rows no longer exist and did break several widgets.
      • This change allows for the Filter widget to better work with cached data (pager with removeRows set to true) & makes the sort tbodies widget possible.
      • Updated core tests.
    • Update textExtraction option
      • Default option is now "basic" and checks for a data-attribute (set by by the new textAttribute option).
      • Set this option to any string (besides an empty string) to revert back to the original method; this may be necessary in older versions of IE due to initialization speed issues.
      • Fixes issue #154
    • Add textAttribute option
      • It contains the data-attribute name which contains alternative table cell text.
      • This only applies to tbody table cells.
    • Add sortReset method callback (e.g. $("table").trigger("sortReset", [callback]);)
    • Update applyWidgets method to prevent being called numerous consecutive times.
    • Destroy method now clears the table cache & pager rows copy
  • Parsers (extract date parsers)

    • "extractUSLongDate" - this parser finds a US long date anywhere in a table cell (demo)
    • "extractMMDDYYYY" - this parser extracts dates in MMDDYYYY format (demo)
    • "extractDDMMYYYY" - this parser extracts dates in DDMMYYYY format (demo)
    • "extractYYYYMMDD" - this parser extracts dates in MMDDYYYY format (demo)
  • Filter widget

    • Updated to use the new modified internal cache format.
      • Now usable with the pager with the removeRows option set to true.
      • Fixes issue #515.
    • Add filter_placeholder global settings. Fixes issue #582.
    • Add filter_selectSource option.
      • Allows add filter select options from an alternate source (e.g. ajax), or customizing options from the set column contents.
      • Fixes issue #328.
    • Include th's in the tbody.
    • Fix build select tbody indexing.
    • Filter reset (filter_reset) now accepts a jQuery object.
  • Filter formatter

  • Math widget

    • New math widget demo Replaces the previous alpha "Column sum widget" demo.
    • This widget adds basic math capabilities; by default the following functions are available: count, sum, max, min, mean, median, mode, range, variance (sample & population), standard deviation (sample & population).
    • Custom math functions can be added
    • Data from cells is gathered from the row, cells "above" the target cell, column, or the entire table.
    • More details are provided on the demo page.
    • Fixes issue #136.
  • Output widget

    • This widget will output the table data as any of the following data formats:
      • Any separator: comma (csv), tabs (tsv), spaces, etc
      • Javascript array
      • JSON
    • Output the entire table, filtered or visible rows.
    • Works with the filter & pager widgets.
    • See this demo for more details.
  • Pager

    • The ajaxObject success function will no longer be called twice on initialization. Fixes issue #540.
    • Update to work with the filter widget & the modified row cache. Fixes issue #515.
    • Destroy method now clears the table cache & pager rows copy.
    • Add pageReset option - pager resets to set page after filtering the table. Fixes issue #565.
  • Reflow & Reflow2 widget

    • These widgets change the layout of the table when a set browser width breakpoint is reached.
    • Each tbody cell will display the header cell text when the table reflows.
    • See this demo.
    • Fixes issue #165.
  • Scroller widget

    • Update to work properly with the filter widget. Fixes issues #584 & #370.
    • Update method to bind table headers.
    • Added remove function so this widget now works properly with the "updateAll" method.
  • Static Row widget

  • StickyHeaders widget - the cloned table (sticky part) tbody & tfoot are now removed instead of hidden.

Version 2.15.14 (4/10/2014)

  • Modified bower.json to allow "read-components" compatibility. See PR #573
  • Corrected docs:
    • Filter-external doc error. Fixes issue #571
    • Added pager ajaxProcessing documentation about extra values available for the output. Fixes issue #576.
    • Grouping widget demo update (now uses collapsible table for options)
  • Core: Destroy method update
    • When including a false parameter with the destroy method, class names will be left intact as before. But this now includes the reapplying of the uitheme and zebra widgets.

      $("table").trigger("destroy", [false]);
    • This change will maintain the table's appearance.

    • See this Stackoverflow question for why this change was made.

  • Grouping widget: group name now saves after callback. Fixes issue #514.
  • Pager processAjaxOnInit now works with jQuery objects. Fixes issue #572.
  • Filter widget: getFilters will not cause a js error when it targets a non-tablesorter table.

Version 2.15.13 (4/3/2014)

  • Core:
    • Fix widgets not being applied after an update.
    • Ignore child row class name if it is the first table row
  • Filter widget ignores info tbodies again. Fixes issue #568
  • Docs: show resizable widget update
  • Bootstrap theme:
    • Fix zebra highlighting for child rows
    • Thanks to ilyai - PR #567

Version 2.15.12 (3/31/2014)

  • Replaced references to cell.cellIndex with $(cell).index()
    • Prevents an error in IE8
    • Thanks sylvain-hamel!
    • Fixed merge issues, then modified code to minize use of this indexing
    • Cell column property has correct value again.
    • Fixes issue #554
  • Fix docs so nested accordions open with hash.
  • Child row updates
    • Added tablesorter-hasChildRow class name to all parents of child rows.
    • Added .tablesorter .filtered { display: none; } to every included theme; needed to properly hide child rows
    • Fixed pager so that if the last pager row has any child rows, they are now included. Fixes part of issue #396.
    • Fixes issue #556.
  • Add resizable_widths option
    • Set the default & reset header widths using this option
    • Fixes issue #555.
  • I apologize for the last version error... it is set to 2.5.11 instead of 2.15.11 in the git repo tag. It is correct everywhere else.

Version 2.15.11 (3/18/2014)

  • Updated Bootstrap to v3.1.1
  • Check if cell has parser to catch undefined error. Fixes issue #546. Thanks antila!
  • Column count is now correct with nested tables (with tfoot). Fixes issue #547.
  • Fix table reset on pagination change. Fixes issue #548. Thanks evanboho!

Version 2.15.10 (3/13/2014)

  • Fix numberSorter option causing a javascript error & added test.

Version 2.15.9 (3/12/2014)

  • jQuery UI Filter formatter scripts work again (broken since adding unique namespaces in v2.15.7).

Version 2.15.8 (3/12/2014)

  • Filter widget

    • Search delay is no longer ignored.
    • Fixes issues #544 & #545
    • Thanks to @dturkenk for this contribution!
  • Align Character widget (beta)

    • Added this widget to help align cell content on a character (space, decimal, etc).
    • Check out the demo!

Version 2.15.7 (3/9/2014)

  • Core

    • Minor natural sort algorithm optimization
    • Added namespace which should contain a unique namespace for each table; it is used when binding to event listeners.
  • Build table widget

    • Removed inappropriate empty table console message when initializing.
    • build table widget documentation update (includes <head> scripts & css)
    • Fixed nested accordions
  • Column selector widget

    • Setting the columnSelector_saveColumns option to true now saves the "auto" state. Fixes issue #517.
  • Filter widget

    • Use the new namespace option to use with event listeners. Fixes issue #535.
  • headerTitles widget

    • Sorry for all of these breaking changes, I should have left this widget in beta.
    • The headerTitle_prefix, headerTitle_text, headerTitle_numeric options has been replaced, in lieu of the new output options; sorry for no deprecation notice.
    • Added headerTitle_useAria, headerTitle_tooltip, headerTitle_output_sorted, headerTitle_output_unsorted, headerTitle_output_nosort, headerTitle_cur_text, headerTitle_cur_numeric, headerTitle_nxt_text, headerTitle_nxt_numeric, headerTitle_type & headerTitle_callback options. See the headerTitles widget demo for more details.
    • Added "refreshHeaderTitle" method to force the widget to update.

Version 2.15.6 (3/7/2014)

  • Doc

    • Added docs for $.tablesorter.language which contains the text used in the aria-label for the header
    • Update isValueInArray & sortAppend docs.
  • Core

    • Destroy now unbinds the updateCache method properly
    • Update $.tablesorter.isValueInArray function & sortAppend option. Fixes issue #523.
    • All test dates are now time zone & DST independent. Fixes issue #516.
    • Added tests for sortForce, sortAppend, sortMultiSortKey and sortResetKey.
    • Cache natural sort regex.
    • Date parsers now return the original cell text instead of an empty string when encountering invalid dates. Sort of fixes issue #531.
    • Event fixes:
      • Sort events will now only show when the table is being sorted; previously when updating an unsorted table, sort events would fire.
      • The updateComplete event now fires after every triggered update (update, updateRows, updateAll, updateCell & addRows)
      • Updated pager to correctly trigger the updateComplete event when using ajax.
      • Added unit tests to ensure these events fire on an empty table.
      • Fixes issue #532
  • ColumnSelector widget

    • Make column disable, visible & invisible methods consistent. Fixes issue #519
  • Filter widget

    • Preset filter searches (set by data-value on the header) work again. Fixes issues #511 & #525.
    • Add note to docs about adding a placeholder. Fixes issue #522.
    • Filter build select function no longer causes a javascript error on empty tables. Fixes issue #528.
  • Grouping widget

    • The collapsed option once again shows the group headers. Fixes issues #514 & 533
    • Add group_saveGroups & group_saveReset options:
      • The group_saveGroups option (true by default) saves the group name of any collapsed groups (requires group_collapsible to be true)
      • The group_saveReset option (null by default) contains a jQuery selector string or jQuery object pointing to an element to be used to clear the saved groups.
      • Both of these options require the storage utility script contained within the jquery.tablesorter.widgets.js file.
      • Fullfils feature request of issue #514.
    • Added details about using regular expressions within the group_separator option.
  • Header Titles widget (headerTitles)

    • New widget which adds the current sort to the header title attribute.
    • It distinguishes between a text and numeric sort and includes the current sort direction
    • A prefix can be included.
    • By default, an ascending sort shows either "A - Z" or "0 - 9", or "Z - A" or "9 - 0" for descending sorts.
    • Note that date columns will show as numeric
    • Fixes issue #529.
  • Pager (addon & widget)

    • Ensure empty array [] and array of empty strings ['', '', ''] evaluate as the same when checking if the filters have changed. Fixes issue #202 (again).
    • Compare totalRows vs. totalPages when preventing an ajax call.
    • Changes to make the updateComplete event fire, but because of the asynchronous nature of ajax, it fires before any sortEnd events. It may take some more work to resolve this, if it becomes a concern.
    • Attempted to fix pager row count issue. See issue #455.
  • Miscellaneous

    • Pager custom controls (beta) now shows no pages on a single page. Fixes issue #518
    • Increase Bootstrap 3 theme css specificity. See issue #515
    • Checkbox parser no longer causes a js error when a checkbox doesn't exist.

Version 2.15.5 (2/23/2014)

  • Pager widget now initializes properly when using ajax. Fixes issue #510.

Version 2.15.4 (2/22/2014)

  • Add "updateCache" method
    • This method updates the parsers, if undefined, then updates the internal cache.
    • Used by the pager (addon & widget) to update the internal cache after an ajax update.
  • Pager (addon & widget)
    • Fixed several undefined variable javascript errors. Fixes issue #509.
    • Fixed an issue with recursion in the pager widget - removed several unnecessary "applyWidget" methods.
    • Now uses the "updateCache" method after the table is rendered using ajax.

Version 2.15.3 (2/21/2014)

  • Stickyheaders
    • Sorting works again. Fixes issue #508.
    • Table no longer scrolls to the top after initializing a sort from the sticky header.

Version 2.15.2 (2/20/2014)

  • Filter widget
    • Fix js error on empty tables & multiple rows in thead while managing c.parsers. Fixes issue #507.
    • filter-onlyAvail now updates all selects properly. Fixes issue #473.
    • Fix annoying filter search caret jumping to end while typing
  • Doc updates
    • Added delayInit demo (pull #504) - thanks Infeligo!
    • Fixed some markup issues & rearranged some links
    • Updated minified widget file date. Fixes issue #505

Version 2.15.1 (2/19/2014)

  • Filter widget
    • Switched method of saving last search times, as cloned table parts would not include saved data
    • Fixes issue #473.

Version 2.15.0 (2/19/2014)

  • Core

    • Add accessibility attributes to tablesorter (aria).
    • Make header's bindEvent function public to allow easier binding to cloned table headers.
    • Add an unsorted header class name option cssNone (empty string by default) and now all unsorted headers will have a class name of tablesorter-headerUnSorted applied; updated destroy method to remove header unsorted class name.
    • Ensure only "updateRow" is triggered within the pager plugin to prevent issues with Proptype.js, see issue #217.
    • Clean up all public API functions to accept table as either a DOM element or a jQuery table object.
    • The log will now display console errors and/or warnings based on those key words.
    • Consolidated all default class names used by the plugin within $.tablesorter.css - these are class names that are not set by the options.
  • Docs

    • Organize the examples section to make it easier to find the desired sort demo.
    • Add associated tablesorter option (with link) with the appropriate examples.
    • Add a "Custom parsers" section instead of lumping it in with the widgets.
    • Add a "Work-in-progress" section for some beta demos.
    • Add indicators to show which widgets are contained within the jquery.tablesorter.widgets.js file.
    • Add an "API" section which gives details on how to use tablesorters available public variables & functions in both the core and widgets.
    • Colorize the left border of code blocks to differentiate HTML, CSS and javascript.
    • Update & consolidate jQuery UI accordion code.
    • Miscellaneous demo fixes.
  • Parsers

    • The "shortDate" parser now works properly with header colspans. Fixes issue #474.
    • The "currency" parser will now properly detect currencies which include a plus or minus sign.
    • The "checkbox" parser (contained in the parser-input-select.js file) will now toggle a class name of checked-# (# is the column index) on the row.
    • A new parsed parameter has been added to the parser code block.
      • This parameter is set with a boolean value (i.e. true or false), to signal the filter widget to only search through parsed data when true.
      • All parsers within the "parser-input-select.js" file now include a parsed:true parameter.
      • The parsers and parsers-advanced demos have been updated to reflect this addition.
  • css Sticky headers widget:

    • Add cssStickyHeaders_zIndex option. Fixes issue #466.
    • Browser will now scroll to table top after filtering. Fixes issue #482.
  • Column selector widget (new!)

    • This widget can make a table responsive. It uses similar parameters as those used by jQuery mobile to set priorities for hiding columns (uses "data-priority" attribute).
    • The column priorities range from 1 to 6, with 1 having the highest priority. As the browser window shrinks, lower priority (higher numbers) columns will be hidden first until all numbered priority columns are hidden.
    • Any named data-priority, other than the numbers 1 - 6, (e.g. "critical" or "persistent") will be treated as a column which will not be included in the column selector.
    • With the addition of some basic selector markup and css, this widget will also allow selecting (hiding or showing) table columns.
    • Popups can also be targeted for addition of these selectors; the demo includes a Bootstrap popover sample.
    • Css selectors are used to hide/show columns for optimal speed and therefore will not work in IE8 and older browsers.
    • jQuery version 1.7+ and tablesorter verison 2.8+ are needed for this widget to work properly.
    • Check out the demo with more details on how to setup this widget!
  • Editable widget

    • Refresh other widgets after a cell has been edited. Fixes issue #487.
  • Filter widget:

    • Make operator match higher priority than exact matching. Fixes issue #465.
    • Fix " OR " is now matched case insensitive.
    • The filter_cssFilter option can now contain an array of class names to be applied to each filter input; added in addition to the "tablesorter-filter" class name.
    • Start filter values are now preserved. Fixes issue #452.
    • Filter formatter demo: Update jQuery UI & stylesheet - fixes UI spinner.
    • Fix child rows always visible when filtering.
    • Update beta demo - select2 external table filters demo, thanks to mohitmayank; see pull request #469.
    • Add filter_hideEmpty option
      • Set this option to false to always show the filter row.
      • By default, the filter row is completely hidden when no rows exist within the tbody (previous behavior)
      • Fixes issue #450
    • Rewrite filter match any column code
      • Removed filter_anyMatch option - sorry about not deprecating this first!
      • Added a filter_external option which is set to a jQuery selector string of inputs, outside of the table, to be used for searching table content.
      • External inputs must have a data-column="x" attribute where "x" is the associated column to filter; "x" can also be set as "any" to match any column.
      • All filters, internal and external, now automatically update and be used with the $.tablesorter.getFilters and $.tablesorter.setFilters functions.
      • Please refer to the documentation for the filter_external option for more details.
      • Also check out the updated filter widget external option and filter widget external inputs demos.
      • This fixes issues #114, #370, #471 and #490.
    • Parsers with a parsed: true flag will now automatically force the filter widget to only search through parsed data instead of actual table cell data
      • This is needed specifically for parsers of input, textarea and select elements.
      • All parsers within the "parser-input-select.js" file have been updated with this parameter.
      • This flag is essentially does the same thing as adding a class name of filter-parsed to the column header, or filter: "parsed" setting to the headers option.
  • Filter Formatter (Filter widget extension):

    • These updated filter widget functions are not completely backward compatible with older versions of the filter widget. Please update both!
    • Added compare & selected options:
      • These options allow the adding of a comparison operator selector to the cell (e.g. &gt;, &gt;=, &lt;, &lt;=, etc).
      • If any cellText is included, it is now wrapped in a label with a class name of "compare-select-label" and "compare-select-label#" (where "#" is the column index).
      • The selector has a class name of "compare-select" and "compare-select#" (where "#" is the column index)
      • Whichever type of input that is added to the cell is then wrapped in a div with class "compare-select-wrapper" and "compare-select-wrapper#" (where "#" is the column index).
      • These class names allow styling of an individual filter to keep elements in line, or however you wish to style it.
    • Filter reset now sets these filters to their default values, not an empty string.
    • Updated to now properly restore saved filters.
    • Added endOfDay option for jQuery UI Datepicker.
      • When true search dates will include all times from the date chosen when a comparison is made of dates "less than" the set date.
      • Example 1: if a table entry has a date of "Jan 14, 2014 11:23 AM" and the filter search is set to <= 1/14/2014, the table entry will be included in the search; the default set time would otherwise be "1/14/2014 00:00:00" and not include the entry from "11:23 AM". So, the endOfDay option sets the time to "23:59:59".
      • Example 2: if searching for one specific date, this option will now search for all times within that day. For example, searching for =1/20/2014, and the results will include dates from 1/20/2014 00:00:00 to 1/20/2014 23:59:59.
      • When comparing dates greater than the set date, the time will be set to midnight; so this option will not be applied.
      • Example 3: in two date inputs, the endOfDay time is only applied to the "to" input; search for 1/20/2014 - 1/20/2014
      • This option is available in both the comparison (one input) and range (two inputs; "to" date input only) date pickers.
    • Fixes issue #325 and issue #430.
  • Group widget:

    • Attempt to fix ajax issue. See issue #437.
    • Combining group widget with pager should now work properly. Fixes isse #437.
    • The widget will now find the correct header cell when multiple thead rows are present.
  • Pager (plugin & widget):

    • Fixed pager issues with empty tables
      • When existing rows are removed from the table, the pager display will no properly update to show zero total rows.
      • When starting from an empty table and content is added, all widgets are refreshed
      • When updating the table via an update method, the filter search will now be applied properly.
      • Fixes issues #426 & #455
    • Correct page calculation. Fixes issue #468.
    • Added custom storage keys. Thanks to eire1130; see pull request #480 & issue #481.
    • Added a public show error function $.tablesorter.showError( table, message );
      • Pass this function the table DOM element or jQuery object in table
      • The message can either be a string with a message ("table refuses to cooperate")
      • or, the message can be an HTML string of an entire table row ('<tr><td colspan="' + table.config.columns + '">yeah, instead of showing your data... I am taking a nap</td></tr>')
      • If the message is blank, all error rows are removed
      • Fulfills issue #486
      • Please note that this function was added to both the pager widget & pager plugin; In the next major release, this function will be separate from both, and can be included in the build.
      • All theme files included a minor update with this change.
    • Added accessibility attributes to the pager.
    • Fix jsHint warnings.
  • Resizable widget

    • Fix reported js error.
    • The resizable reset function $.tablesorter.resizableReset(table); now accepts jQuery objects.
  • Sticky headers widget

    • Select boxes work again within sticky headers. Fixes issue #473.
    • Browser will scroll to table top after filtering.
      • This only occurs if the sticky header is active and after a filter is applied.
      • Fixes issue #482.
    • Use core's new bindEvents public function to bind events to cloned sticky header.
    • Fix sticky header alignment within attachTo elements.
  • Miscellaneous

    • Update all Bootstrap demos to use the latest version (v3.0.3). Thanks themilkman!
    • Update all demo pages that use jQuery UI accordion with the newest version. Also added a clickable anchor to each accordion header.
    • Consolidate default class names within $.tablesorter.css for the filter, resizer and stickyHeaders widgets.
    • Renamed component.json to bower.json

Version 2.14.5 (12/16/2013)

  • Pager
    • Fix pager update when ajax returns no rows. Fixes issue #456.
    • Add pager processAjaxOnInit option. Fixes issue #424.
    • Fix & document inconsistentcies in pager triggered event parameters.
    • Disable pager arrows & show zero in display when totalPages is zero. Fixes issue #460.
    • Filter row is now included in sticky header while using the pager. Fixes issue #449.
    • Lots of thanks to Lynesth for sharing code fixes :)
  • Fix stickyHeaders_attachTo no positioning correctly. See issue #295.

Version 2.14.4 (12/14/2013)

  • Add Bootstrap 2 theme. Thanks to themilkman.
  • The addRows method now works with an empty table. Fixes issue #450.
  • Sticky headers widget
    • Add stickyHeaders_attachTo option. Fixes issues #295 & #314.
    • Add cssStickyHeaders_attachTo option. Fixes issue #453.
    • Added padding to wrapper in demo so Chrome doesn't add a horizontal scroll bar
  • Filter widget
    • Fix forced search to work again (i.e. $('table').trigger('search', false);)
    • Fix child row filtering - see this Stackoverflow question
  • Pager
    • The pager will update properly when ajax returns no rows. Fixes issue #456
    • Filter searches will now reset pager to the first page. Fixes issue #456
    • The pager will now properly count filtered rows when including/excluding child rows. Fixes this Stackoverflow question.
    • The table cache will once again update after an ajax call. Fixes issues #436 & #437.

Version 2.14.3 (12/2/2013)

  • Core
    • Refreshing widgets now only applies to previously installed widgets. Fixes issue #442.
  • Pager
    • Ajax arrays now accept html instead of cell contents, e.g. <td class="red">- 10</td>. Thanks @christhomas; fixes issue #434.
    • Add ajax counter to only allow the most recent request to process. Thanks @christhomas; fixes issue #443.
    • When filtering rows, the output will now show zeros for row & page counts instead of empty strings.
    • No more fixedHeight pager errors. Thanks @hempel; fixes issue #448.
  • Filter widget
  • Sticky Headers widget
    • Now uses the filter widget bindSearch function allowing live search, delayed searching and escape to cancel on sticky header filters.
    • Thanks to @haraldkrischner for his help!
    • Fixes issues #439 & #440.
  • CSS Sticky Headers widget (beta)
  • Added Semantic version sorting demo
    • See the demo here.
    • This demo does not use a custom parser nor widget, it requires a modified semver.js for node file to sort the column using the textSorter option.
    • The modified semver-mod.js file is contained within the new "extras" folder (tablesorter/js/extras) along with the original unmodified semver.js file.
    • Extra code is also included to highlight invalid semantic versions within the table.
    • Fixes issue #395.
  • Sorry I didn't get around to finding solutions for some of the other issues that I promised to have done this patch :(

Version 2.14.2 (11/25/2013)

  • Removed Bootstrap filter cell background color. Fixes issue #425.
  • Added css sticky header widget (beta)
    • This widget uses css3 transforms to make the table header sticky. It's a bit jumpy in Chrome, but works well in other tested browsers.
    • This widget doesn't appear to work in IE10, but it should... it will not work in IE8 and older.
    • See issue #429 for more information.
  • Stop repeat filter widget searches. Fixes issue #431.
  • Prevent filter error. Fixes issue #432.
  • Merged in and reverted issue #433.
  • Editable widget
    • Updated docs with missing editable_editComplete callback event name option.
    • Modified the editable_columns option to allow setting a column range string, e.g. "2-4" instead of creating an array ([2,3,4]).
    • Fixes issue #435.
  • Grouping widget
    • Invalid group class now fails silently.
    • Fixes issue #438.

Version 2.14.1 (11/22/2013)

  • Filter widget
    • External inputs bound using the filter bindSearch function now clear on the "filterReset" event.
    • Replace Array.indexOf() due to IE8.
  • Pager (plugin & widget)
    • Replace Array.indexOf() due to IE8. Fixes issue #388.
  • Themes
    • Non-sortables headers now show the default cursor
    • Fix Dropbox theme to work properly within the sticky header demo
    • Fix Ice theme to include a top border in the sticky header demo
    • Tweaked sticky header widget to better align columns in Firefox & adjust caption to hide border edges.
    • See the sticky header demo to see these changes.
    • Fixes #407.
  • Documentation
    • Update FAQ page to include information on the zebra widget not always working.
    • Update demos to use Bootstrap 3.0.2.
    • Add search instructions to the wiki documentation pages.
    • Add link to FAQ & search instructions on the main documenation page.
  • Add associated core version number to pager addon & widget, main widget file and filter formatter file.

Version 2.14.0 (11/19/2013)

Core

  • Changed sorting algorithms:
    • Due to problems with sorting multiple columns improperly sorting algorithms again include code to sort empty cells.
    • Internal sorting again has separate ascending and descending functions; but the previous $.tablesorter.sortNatural (ascending only), $.tablesorter.sortNumeric (ascending only) and $.tablesorter.sortText (ascending only) functions are still available.
    • Custom text & numeric sort functions, added via textSorter and numberSorter options now require you to return the sort in the correct direction.
    • Custom sort functions no longer have empty cells automatically handled for you.
    • Fixes issue #419.
  • Added sortStable option which when true will sort exactly equal items by placing them in their original unsorted order (or, perform a stable sort).
  • Removed double icon class names.
  • Added tabIndex option
    • When true, a tabindex is added to the headers for keyboard accessibility; this was previously always applied
    • When false, table headers will not be included when tabbing through the page
    • Fulfills issue #415.

Filter widget

  • Setting a filter to build a select no longer causes an error. Fixes issue #421.
  • Added filter_saveFilters option
    • When true, this option saves the current filters using the storage utility (local storage with cookie fallback).
    • This option is set to false by default.
    • See issue #388.
  • Allow multiple external filter inputs
    • The $.tablesorter.filter.bindSearch( $table, $external ) function now allows binding searches using the built-in functioning.
    • The bind search function will unbind any previously bound keyup and search event listeners on the $external elements.
    • External inputs must not have a tablesorter-filter class to distinguish them from internal filters.
    • If not using the filter_anyMatch option, external filters can be set to target specific columns by including a data-column attribute.
    • See the new filter external inputs demo.
  • Filter reset button clicks will again trigger a filterReset event. Fixes issue #423.

Grouping widget

  • Merged in fix for grouping widget + filter widget + child row widget.
  • Renamed variables & cleanup
  • Added group_dateString function to format the date string for group-date header class name.

Zebra widget

  • Now skips removable rows added by other widgets, more specifically, it skips rows with a remove-me class name (set by the selectorRemove option).

Docs updates

  • Added a side menu with search to the main document page.
    • The main documentation page now uses Bootstrap for some styles.
    • Search includes a count with clear search, previous result and next result buttons.
    • Search options included to find letters or whole words only, and choose if the search is case sensitive, or not.
    • The advantage of this search over the browser's built-in search (Ctrl-F) is that this search will find text within the hidden content
    • Indexing of the search results may not always be in order, i.e. "10/10" may not always be the lowest result on the page due to nested elements.
    • Sorry, IE7 and older users, the search works but but is really slow. And the side menu styling leaves much to be desired (using Bootstrap).
  • jQuery UI theme selector updates. See issue #407.
  • Updated typos & css in various demos
  • Added Utility options section for options used by parsers, storage utility and pager ajax data.
  • Added removed options section.
    • This applies to pager options available in the original version of tablesorter which are no longer supported.
    • Fixes issue #416.
  • Added kbd styling for better visualization of keyboard keys.

Other

  • Renamed variables within the pager custom control demo (still in beta)
  • Renamed variables within default widgets file
    • Utilities: storage, addHeaderResizeEvent,, resizableReset
    • Widgets: columns, resizable, stickyHeaders, uitheme, saveSort
  • Updated parser-date-two-digit-year.js to allow changing the date range
    • Set a different date range by adding a value to table.config.dateRange.
    • Instructions added to main documents under utility options
  • Storage utility ($.tablesorter.storage) now accepts a jQuery object as well as a DOM object of the table
    • $.tablesorter.storage( $('#mytable'), 'myvariable', 'YAY' );, or
    • $.tablesorter.storage( $('#mytable')[0], 'myvariable', 'YAY' );

Version 2.13.3 (11/9/2013)

  • Pager (plugin/widget)

    • Fixed initial filter settings when using pager ajax. Fixes issue #388.
    • Fixed ajax pager not recognizing column sorting. Fixes issue #408.
    • The core plugin now remove rows from table when using pager ajax. Fixes issue #411.
  • Filter widget

    • Renamed all variables & restructured the entire widget.
    • Added better integration with the pager plugin/widget to minimize ajax server calls by getting default filter settings. Fixes issue #388.
    • Fixed filter formatter HTML5 spinner to properly find exact matches.
    • Added a new fuzzy search parameter
      • Fuzzy searches match sequential characters, similar to how Sublime Text searches work
      • Start the search with a tilde ~ followed by any sequential characters to match.
      • Examples: ~bee will match both "Bruce Lee" and "Brenda Lee", ~bcd will find "Brandon Clark" and ~piano will find "Philip Aaron Wong"
    • Added filter_anyMatch
      • Set this option to true when using an external search filter.
      • Setting this option should work properly with or without the column filters. The only issue you would have is if you triggered a search on the table using an array with undefined or null array values.
      • Some limitations are applied when using any match. Search operators, range queries and not-matches are not allowed.
      • See the demo for examples & more details.
      • Thanks to @prainho for the suggestion, code and feedback in issue #405!
    • Modified the bindSearch function to allow using it on external filters:
      • Use as follows: $.tablesorter.filter.bindSearch( $('table'), $('.search') );
      • Binding the search input using this method allows the search to use filter_liveSearch, delayed searching and pressing escape to clear the search.
      • See the filter any match demo for example usage.
  • UITheme widget

    • Added caption styling
    • Updated css for jQuery UI theme and Bootstrap theme.
  • Theme, demo & doc updates

Version 2.13.2 (11/2/2013)

  • Updated pager & filter widget to work when the pager countChildRows option is true:
    • Filter widget now properly added a "filtered" class to child rows
    • Pager plugin & widget now properly calculate a correct total number of rows
    • See issue #396.
  • Updated editable widget to target table cell children if they exist
    • This fixes the issue in IE where making a table element contenteditable is not allowed.
    • See issue #404 for further details.

Version 2.13.1 (10/31/2013)

  • Fixed filter widget issues
    • filter indexing will now be correct, even if a "tablesorter-filter" input/select doesn't exist in the filter row
    • Already parsed filters (filter-formatter) will not attempt to reparse the value; problem was caused by parsed dates.

Version 2.13 (10/30/2013)

  • Added a "Development" branch to the repository.

    • I have started development on version 3 of tablesorter and this branch will have a basic structure to allow modularization of tablesorter.
    • So far, only the tablesorter core has been restructured and reorganized.
    • Added basic Zepto support to the core and some basic widgets, this is a work-in-progress. See issue #398.
  • Ensure resized headers have stored data, or provide a fallback. Fixes issue #394.

  • Added pager countChildRows option (plugin & widget)

    • When true, the pager treats child rows as if it were a parent row and strictly enforces showing only the set number of pager rows.
    • This can cause problems as a child row may not appear associated with its parent, may be split across pages or possibly distort the table layout if the parent or child row contain row or cell spans.
    • When false the pager always includes the child row with its parent, ignoring the set pager size.
    • See issue #396.
  • Removed triggered change event to fix issue #400.

  • Merged in filter formatter fix for jQuery UI dateFormat conflict; pull #403. Thanks @Craga89!

  • Grouping widget update

    • Added group_separator option which is used when a group-separator-# class name is applied
    • Updated grouping widget demo.
  • Added a file-type parser

    • Optimally used with the grouping widget to sort similar file types (e.g. video extensions: .mp4, .avi, .mov, etc)
    • File type sorting demo added.
  • Updated LESS theme to work properly with LESS 4.1+

  • Other changes

    • Improved formatFloat() replace method.
    • Sorting a zero hex value (0x00) is now possible.

Version 2.12 (10/18/2013)

Core

  • Added numberSorter option allowing you to modify the overall numeric sorter.

  • Updated the textSorter option to allow setting a text sorter for each column.

    • The textSorter functon parameters have changed from (a, b, table, column) to (a, b, direction, column, table).
    • Restructured & combined sorting functions internally so that tablesorter will always sort empty cells no matter what sorting algorithm is used by the textSorter.
    • Renamed $.tablesorter.sortText() to $.tablesorter.sortNatural()
    • Added a new basic alphabetical sort algorithm $.tablesorter.sortText = function(a, b) { return a > b ? 1 : (a < b ? -1 : 0); }; which can be set using the textSorter option.
    • New examples can be found in the updated custom sort demo.
  • Added fixedUrl option for use with the $.tablesorter.storage() function.

    • Setting this with a fixed name (it doesn't need to be a url) allows saving table data (saveSort widget, savePages in pager widget) for tables on multiple pages in a domain.
    • Additional storage options are described below under "Storage".
  • An accurate number of table columns is now contained within table.config.columns. This accounts for multiple header rows, tds, ths, etc.

  • Replaced .innerHTML with jQuery's .html() to fix issues in IE8. Fixes issue #385.

  • Version numbers should now all be accurate, even in the comments.. at least this time ;). Fixes issue #386.

Pager

  • In attempts to initialize the pager after the filter widget:
    • Added a pager widget (still beta testing) to allow initializing the pager after certain widgets (filter widget).
    • Updated tablesorter core (properly count table columns) & filter widget code to allow it to initialize on an empty table (thanks @stanislavprokopov!).
    • Hopefully one or both of these changes fixes issue #388.
    • New pager widget demos: basic & ajax.
  • savePages option
    • Should no longer cause an error if stored data is malformed or unrecognized. Fixes issue #387.
    • The stored size and page is now cleared if the table is destroyed.
  • Fixed an error occuring in IE when trying to determine if a variable is an array (toString function call not recognized). Fixes issue #390.
  • Updated pager rendering to prevent multiple ajax calls.
  • During this update, the pager page size would return as zero and set the totalPages value to inifinity. Yeah, it doesn't do that anymore; but you can still set the pager size to zero if you want!

Widgets

  • Filter widget:
    • Should now properly initialize when the pager plugin/widget is used with ajax and/or the filter_serversideFiltering option is true. Fixes issue #388.
    • Please note that the select dropdowns still sort using the natural sort algorithm, but since it is using the function directly, empty cells will not sort based on the emptyTo option. If this is a big problem, let me know!
  • Grouping widget:
    • Added group_callback option - this sets a callback function which allows modification of each group header label - like adding a subtotal for each group, or something. See the updated demo.
    • Added group_complete option which is "groupingComplete" by default. This is the name of the event that is triggered once the grouping widget has completed updating.
  • Updated the editable widget:
    • Added editable_editComplete option which names the event that is triggered after tablesorter has completed updating the recent edit.
    • You can also bind to the change event for that editable element, but it may occur before tablesorter has updated its internal data cache.
  • Storage
    • The $.tablesorter.storage() function now has options including the fixedUrl option described in the core section above.
    • Also added storage options which can be used for custom widgets: $.tablesorter.storage(table, key, value, { url : 'mydomain', id : 'table-group' }).
    • Additionally, for already build-in widgets, you can apply data-attributes to the table: <table class="tablesorter" data-table-page="mydomain" data-table-group="financial">...</table>.
    • For more details, please see issue #389.

Parsers

  • Added an IPv6 parser
    • This parser will auto-detect (the is function checks for valid IPv6 addresses).
    • Added a new IPv6 parser demo.
    • Included rather extensive unit tests for just this parser o.O.

Version 2.11.1 (10/11/2013)

  • Fixed an updating bug:
    • The pager was not updating properly
    • The updateComplete event was not firing when not using ajax.
    • Thanks @sbine for sharing the fix!

Version 2.11.0 (10/10/2013)

Core

  • Initialized widgets (widgets with options) are now tracked to ensure widget options are extended when using "applyWidgets". Fixes issue #330.
  • An javascript error no longer pops up when setting the delayInit option to true and using the saveSort widget (or triggering a sorton method). Fixes issue #346.
  • Only visible columns will be considered when fixing column widths. Fixes issue #371.
  • Merged in fix for jQuery version check (pull #338). This also fixes issue #379. Thanks @lemoinem!
  • Removed natural sort's ability to sort dates. This shouldn't be a problem since tablesorter uses parsers detect & parse date columns automatically. Fixes issue #373.
  • Fixed issue #381.
    • Any class name that is set by an option and is later used to search for that element now has an empty default class name.
    • The reasoning is that if a developer adds two class names to the option, the jQuery find breaks.
    • All default single class name options are now contained within $.tablesorter.css
    • Options affected include: tableClass, cssAsc, cssDesc, cssHeader, cssIcon, cssHeaderRow, cssProcessing in the core.
    • Note that the cssIcon option retains it's default class name & functionality to not add an <i> inside the table cell if this extra class name is undefined.
    • Widget options affected include: filter_cssFilter and stickyHeaders.
  • Removed return false from header mouse/keyboard interaction. Fixes issue #305 & issue #366.

Parsers

  • Fixed sugar date parser demo to point to the correct parser file and sugarjs resource.
  • General cleaned up date, fraction and metric parsers & fixing of minor bugs.

Build Table Widget (new)

  • Build a table starting with an assortment of data types ( array, text (CSV, HTML) or object (json) ).
  • This widget isn't really a widget because it is run and does it's processing before tablesorter has initialized; but the options for it are contained within the tablesorter widgetOptions.

Column Widget

  • General cleanup

Filter Widget

  • Exact matches can still be made if the user enters an exact match indicator twice (i.e. John== will still find John in the column; before it would think the user was looking for John= after the second = was typed)
  • Dynamically added filter reset buttons will now work automatically. Added by pull #327. Thanks @riker09!
  • Chrome appears to have fixed the hidden input bug, so reverted changes to the basic filter demo. Fixes issue #341.
  • The filter widget will work properly with sub-tables. Fixes issue #354. Thanks @johngrogg!
  • Fixed issues with filter_columnFilters set to false. Fixes issue #355.
  • Searches now have accents replaced if the sortLocaleCompare option is true. Fixes issue #357.
  • Merged in enhancement for the filter widget & updated docs - add row to filter_functions parameters (issue #367, pull #368). Thanks @gknights!
  • FilterFormatter jQuery UI Datepicker now includes the user selected time for comparisons. Thanks @TheSin-!
  • Another fix to the filteFormatter jQuery UI Datepicker to make it work properly with the sticky header widget. Thanks @TheSin-!
  • Removed filter_cssFilter default class name. The "tablesorter-filter" class name is automatically added, and this option now contains any additional class names to add. Fixes issue #381.

Grouping Widget

  • The grouping widget now works across multiple tbodies.
  • Added group-false header option which disables the grouping widget for a specific column. Fixes issue #344.
  • Added the group_collapsed option which when true and the group_collapsible option is also true, all groups will start collapsed. Fulfills issue #352.
  • You can now toggle all group rows by holding down the shift key while clicking on a group header.
  • This widget now works properly with the pager addon (pager addon updated). Fixes issue #281.

StickyHeaders Widget

  • Caption outerheight now used to get the correct full height of the caption. Thanks @TheSin-!
  • stickyHeaders_zIndex option added to allow users to customize their sticky header z-index. Fixes issue #332. Thanks @TheSin-!

UITheme widget

  • Updated Bootstrap theme to work with Bootstrap v3
    • Only additions were made to the sorting icons class names within in the $.tablesorter.themes.bootstrap defaults (contained in the jquery.tablesorter.widgets.js file).
    • So the theme will support all current versions of Bootstrap, just make sure you are using the appropriate icon class name (icon-{name} = v2; glyphicon glyphicon-{name} = v3).
    • Removed the gradient background from the header & footer cells.
    • Added a reduced icon font side for header sort icons.
    • Renamed the pager class from pager to ts-pager as Bootstrap adds a lot of padding to that class. See Bootstrap theme demo.
    • Thanks @YeaYeah for sharing how to fix the top border in issue #365.

Pager

  • Fixed the removeRows option error when set to true.
  • The pager now stores any object returned by the ajaxProcessing function in table.config.pager.ajaxData
    • The object should contain attributes for total (numeric), headers (array) and rows (array of arrays).
    • A replacement output option can also be loaded via this method and must be included in the output attribute (i.e. ajaxData.output).
    • Additional attributes are also available to the output display by using the attribute key wrapped in curly brackets (e.g. {extra} from ajaxData.extra).
    • Additional attributes can also be objects or arrays and can be accessed via the output string as {extra:0} (for arrays) or {extra:key} for objects.
    • The page number is processed first, so it would be possible to use this string {extra:{page}} ({page} is a one-based index), or if you need a different value use {page+1} (zero-based index plus any number), or {page-1} (zero-based index minus any number).
    • For more details, please see issue #326.
    • Thanks @camallen for the suggestions & feedback!
  • The "updateComplete" event should now properly trigger after an ansynchronous ajax call has completed. Fixes issue #343.
  • Added a new savePages option
    • Requires requires the $.tablesorter.storage script within the jquery.tablesorter.widget.js file to work properly.
    • When true, it saves pager page & size if the storage script is loaded (requires $.tablesorter.storage in jquery.tablesorter.widgets.js).
    • The pager will continue to function properly without the storage script, it just won't save the current page or pager size.
    • Fulfills enhancement request from issue #345.
  • Removed table update when using ajax with a server that is already doing all of the work. Fixes issue #372 & issue #361. Thanks @sbine!
  • Merged in change to count table th length after ajaxProcessing (pull #383). Thanks @harryxu!
  • Reverted changes made in pull #349 as the error row was not showing because the urls did not exactly equal each other.
  • Child rows within the pager will now properly display/hide. Fixes issue #348.
  • Merged in fix for pager redundant ajax requests (pull #336). Thanks @camallen!
  • Merged in fix for pager totalRows check (pull #324). Thanks @camallen!

Internal fixes

  • Modified the pager plugin internal variables to use p for pager options and c for table config options - for consistency.
  • Cleaned up the formatting of a few parsers (mostly cosmetic!)
  • Some parser functions were added to the $.tablesorter object instead of keeping them as private functions, just because my OCD compelled me to do it.
  • Some of the changes made the parsers are no longer backward compatible to the original version of tablesorter. Break away man, just do it!

Thanks

  • Thanks to @thezoggy and @TheSin- for help maintaining and supporting the tablesorter github project while I was away!
  • Also thanks to everyone else that contributed and even more thanks to those that helped troubleshoot and solve problems!

Version 2.10.8 (6/3/2013)

  • Updated the percent parser to only detect if the content is shorter than 15 characters. This prevents columns with a lot of content and one percent sign (%) from being set to be parsed as a percent numeric column. Fixes issue #320.
  • Updated filter widget & filter_formatter:
    • Added a new filter_defaultAttrib which points to the default 'data-value' attribute in the table header which will contain the filter's default (starting) value and will override any set values within the filter_formatter functions. Updated the custom filter widget function demo age column to show this in action.
    • The $.tablesorter.setFilter() method now properly updates the filter formatter elements when set.
    • The uiDateCompare and uiDatepicker functions now adds a time of 11:59:59 to the "to" date or when a "less than" comparison is made so as to include all times within that selected day.
    • The defaultDate option (not date option, sorry) of the uiDateCompare now properly sets the value upon initialization.
    • The from and to options of the uiDatepicker now properly sets those values properly upon initialization.
    • Fixes issue #321.
  • Fixed stickyHeaders widget:
    • When removing a sticky headers widget, it no longer unbinds scrolling when other sticky headers are still active.
    • Added stickyHeaders_includeCaption option (set as true by default). When this option is false and a caption exists, it will not be included in teh sticky header. Fixes issue #322.

Version 2.10.7 (5/31/2013)

Version 2.10.6 (5/30/2013)

  • Added skipTest options to the HTML5 filter formatter functions. Fixes issue #307.

Version 2.10.5 (5/30/2013)

  • Filter formatter functions now works properly within sticky headers. Fixes issues #290 & #317.

Version 2.10.4 (5/28/2013)

  • Added stickyHeadersInit event, which is triggered on the table after the sticky headers widget has completed initializing.
  • Filtering child rows should now work properly; fixes #306.

Version 2.10.3 (5/27/2013)

  • Updated pager pageSize method to properly store the set page size; fixes #287.

Version 2.10.2 (5/27/2013)

  • The minified scripts are now updated =/.

Version 2.10.1 (5/27/2013)

  • Core fixes

    • Fixed updateAll function to properly refresh the widgets.
    • Added keyboard accessibility
      • Header cells can now be accessed using the tab key and sorted by pressing enter when they have "focus".
      • Thanks to debugwand for sharing the code!
  • Filter widget updates:

    • Added filter_onlyAvail option
    • Added compare option to various filter formatter functions
      • This addition was made to the "uiSpinner", "uiSlider", "html5Range", "html5Number" and the new "uiDateCompare" functions

      • So, for example the html5Number function can be set up as follows:

        filter_formatter : {
          0: function($cell, indx) {
            return $.tablesorter.filterFormatter.html5Number( $cell, indx, {
              value: 1,
              min: 1,
              max: 100,
              delay: true,
              addToggle: false,
              exactMatch: false,
              compare: '>='
            })
          }
        }

        now the number type input will allow filtering rows with values greater than or equal to the selected value.

      • Thanks to The Sin- for sharing the idea and code in issue #304.

    • The jQuery UI Datepicker range filter formatter code has been updated:
      • Use the new uiDateCompare filter formatter for one input comparisons, or use this uiDatepicker update to do comparisons within the two inputs.
      • The two input now functions so that when the "to" input is empty, all dates greater than the "from" date are shown.
      • If the "from" input is empty, all dates less than the "to" input date are shown.
      • Added options textFrom (default is from) and textTo (default is to) to allow changing the text label language.
    • Modified the logical "or" search such that it tries to find an exact match for each "or". For example:
      • If "1|2|3" is entered into the filter, only column cells that exactly match 1, 2, or 3 will be visible.
      • If "Mike|Br|John" is entered, only cells with Mike, Br and John will be visible. If you want to include Bruce, then use a wild card: "Mike|Br*|John".
      • To only match content using the logical "or" search, simply add the class name filter-match to the header cell, then "1|2|3" will show cells with 1, 11, 12, etc.
      • Updated the basic filter widget demo to include a "filter-match" column toggle.
    • Fixed javascript error from improper reference to the "dateFormat". Fixes issue #306.
    • Fixed $.tablesorter.getFilters() and $.tablesorter.setFilters() functions to work properly when the filter_columnFilters option is false (do not build filter row).
    • Fixed filter widget numeric range error introduces in v2.10.0. Sorry =(.
    • Fixed filter search delay issue, again. =(
    • Fixed filter widget data comparisons, so now you can type in the filter something like > 1/1/2010 (using the same date format as the column).
    • Filter search input placeholders can now be set using jQuery data:
      • Previously, only a data attribute could contain the filter placeholder text data-placeholder="Enter something..."
      • Another method using script can now be used: $('.tablesorter th:eq(0)').data('placeholder', 'Enter something...'); (where eq() contains a zero-based index of the column).
    • Optimized filter queries to search already filtered rows if the previous search is contained within the current search. Fulfills part of issue #313.
    • Added a caution note in the filter widget (basic) demo stating the issue with Chrome not rendering search input text properly when previously hidden.
      • For now, I set the filter_hideFilters option to false until the source of this problem is determined.
      • Check out this demo to see the issue (in Chrome); but I think I'm the only one seeing it.
  • Updated the $.tablesorter.storage() function

    • The update is to checking for localStorage browser support.
    • It should now work properly in iOS with private browsing protection.
    • Check out this great summary of Modernizr updates by Paul Irish.
  • Documentation fixes

    • Removed console.log from the documentation script. Fixes issue #309.
    • Updated all <button> elements in the documentation to include a type (<button type="button">) to prevent IE from triggering a form submit. Fixes issue #285.

Version 2.10 (5/8/2013)

  • Core changes:

    • Fixed/updated content selection & form interaction in both headers and sticky headers.
    • Added missing sortBegin event when the sorton method is used. YAY for unit testing!
    • Fixed digit and currency parsers not returning appropriately formatted text, when encountered. Another point for unit testing! :P
  • Added a public function $.tablesorter.addHeaderResizeEvent

    • This function exists within the jquery.tablesorter.widgets.js file.

    • There is no built-in resize event for non-window elements, so when this function is active it triggers a resize event when the header cell changes size.

    • Enable the triggering of header cell resize events as follows:

      var table = $('table')[0],
          disable = false,
          options = {
            timer : 250 // header cell size is checked every 250 milliseconds (1/4 of a second)
          };
      $.tablesorter.addHeaderResizeEvent( table, disable, options );
    • To disable resize event triggering:

      var table = $('table')[0];
      $.tablesorter.addHeaderResizeEvent( table, true );
  • Filter widget updates:

    • Triggered filter searches now properly update the filter column inputs. See issue #146.
    • Added disabled filter styling to the Bootstrap theme. Thanks to riker09 (issue #283).
    • Fixed filter_liveSearch option to properly work in non-webkit browsers. See issue #285.
    • Modified filter_liveSearch to allow adding a numeric value to the option, this sets a character threshold which triggers the search when met. Fulfills issue #286.
    • Fixed select dropdowns within the sticky header now work properly. Fixes issue #288.
    • Added a method to allow properly parsed dates to be comparible using <, <=, >, >= and date ranges. Fulfills issue #302.
    • Added filter_filteredRow option which contains the class name added to each visible filtered row. Used by the pager to properly count filtered rows.
    • Fixed a problem with filter_searchDelay which was broken in v2.9.0. Opps, sorry!
    • Minor tweaks to the filter formatter file to allow elements in multiple tables (removed some IDs). More fixing needed!
  • Sticky Headers widget:

    • Fixed/updated content selection & form interaction in both headers and sticky headers. Fixes issue #57.
    • Fixed an issue with content resizing the table, but not the sticky header.
      • Added stickyHeaders_addResizeEvent option to enable this updating.
      • This option uses the new $.tablesorter.addHeaderResizeEvent function.
      • Fixes issue #289.
    • Added stickyHeaders_offset option
      • This option sets the point where the sticky header locks while scrolling. Allowing space for sticky navigation bars, etc.
      • This option accepts:
        • pixel value: stickyHeaders_offset: 20
        • jQuery selector: stickyHeaders_offset: '.navbar-fixed-top
        • jQuery object: stickyHeaders_offset: $('.navbar-fixed-top')
      • Fullfills feature request #294.
  • Pager addon updates:

    • Controls are now cached internally.

      • table.config.pager.$container now stores the jQuery object targeted by the pager container option.
      • table.config.pager.$goto stores the jQuery object targeted by cssGoto.
      • table.config.pager.$size stores the jQuery object targeted by cssPageSize.
    • Page size selectors should now update properly when the pageSet or pageSize methods are used.

    • The pager should now properly target the first sortable tbody (it will skip any "info-only" tbodies).

    • Fixed pagerComplete callback firing more than once while sorting or filtering. Fixes issue #291.

    • Fixed pager not updating when the filter widget reveals zero matches. Fixes issue #297.

    • The pager ajax function now does better error handling.

    • Updated the pager ajax error displayed row; including updating all themes.

    • Added ajaxObject option:

      • You can now customize how the pager plugin interacts performs its ajax functioning.

      • Modify the ajaxObject to include any of the ajax settings:

        ajaxObject: {
          dataType: 'json'
        }
      • The only option that gets overwritten is the url option. It is set by the ajaxUrl and customAjaxUrl options.

      • Fulfills issue #280.

    • Updated ajaxProcessing to now make returning rows optional, or it can now accept the rows as a jQuery object instead of an array. The addon triggers an "update" event internally, so no need to include that.

      • Return a jQuery object

        ajaxProcessing: function(data, table){
          if (data && data.hasOwnProperty('rows')) {
            var r, row, c, d = data.rows,
            // total number of rows (required)
            total = data.total_rows,
            // array of header names (optional)
            headers = data.headers,
            // all rows: array of arrays; each internal array has the table cell data for that row
            rows = '',
            // len should match pager set size (c.size)
            len = d.length;
            // this will depend on how the json is set up - see City0.json
            // rows
            for ( r=0; r < len; r++ ) {
              rows += '<tr class="ajax-row">'; // new row array
              // cells
              for ( c in d[r] ) {
                if (typeof(c) === "string") {
                  rows += '<td>' + d[r][c] + '</td>'; // add each table cell data to row array
                }
              }
              rows += '</tr>'; // add new row array to rows array
            }
            // don't attach the $(rows) because it's difficult to tell old from new data
            // and no need to trigger an update method, it's done internally
            return [ total, $(rows), headers ];
          }
        },
      • Build the table yourself (just return the total number of rows):

        ajaxProcessing: function(data, table){
          if (data && data.hasOwnProperty('rows')) {
            var r, row, c, d = data.rows,
            // total number of rows (required)
            total = data.total_rows,
            // all rows: array of arrays; each internal array has the table cell data for that row
            rows = '',
            // len should match pager set size (c.size)
            len = d.length;
            // this will depend on how the json is set up - see City0.json
            // rows
            for ( r=0; r < len; r++ ) {
              rows += '<tr class="ajax-row">'; // new row array
              // cells
              for ( c in d[r] ) {
                if (typeof(c) === "string") {
                  rows += '<td>' + d[r][c] + '</td>'; // add each table cell data to row array
                }
              }
              rows += '</tr>'; // add new row array to rows array
            }
            // find first sortable tbody, then add new rows
            table.config.$tbodies.eq(0).html(rows);
            return [ total ];
          }
        },
  • Tablesorter unit testing updates; tests for the following have been added:

    • sortStart, sortBegin & sortEnd events.
    • updateComplete event.
    • empty cells: emptyTo, empty to top, bottom & zero.
    • strings in numeric columns: stringTo, string to max, min, top, bottom & none.
    • sort method
    • table class, table header class & tbody info only class.

Version 2.9.1 (4/13/2013)

  • Modified stickyHeaders widget:
    • Only visible cells within the sticky header will be adjusted
    • Fixes issue #278.
    • Thanks to Exinaus for sharing his code!
    • This change doesn't fix the lag on a table with a lot of visible columns; I don't have an exact number where it will start lagging, but the one in issue #278 had 68 columns.

Version 2.9.0 (4/12/2013)

  • Core changes

    • Added a column sort method.
      • With this method, you can target a header column and trigger a sort:

        $('table').find('th:eq(2)').trigger('sort');
      • This method will maintain the sorting order; so, if the column is already sorted in ascending order, this method will act as if you manually clicked on the header.

      • Whatever next sort order is applied is dependent on other option settings such as initialSortOrder, lockedOrder (set within the headers), sortReset option, sortRestart and will be ignored if the column sort is disabled (sorter: false).

      • Triggering a click on the header cell will not work as expected.

  • Widgets, general

    • All of the current widgets within jquery.tablesorter.widgets.js and in the js/widgets directory use the newest addWidget template, and are no longer compatible with tablesorter versions older than 2.8!
  • Added widget priorities

    • Basically when a widget is added, it can be assigned a priority number and applied in that order from lowest to highest.
    • The priority can be any number and can be thought of as similar to applying a z-index to an element in that multiple widgets can have the same priority.
    • This is needed in case a widget is applied to the table, but is dependent on another widget. For example:
      • The uitheme widget is the first to be applied (priority of 10) because other widgets that copy/clone the table will need the jQuery UI/Bootstrap class names already applied to the table.
      • The sticky headers widget (priority 60) is applied after the filter widget (priority 50), so that it knows to update the filters within the sticky header.
    • Priorities are optional, and any widget applied without a priority value will automatically be assigned a priority of 10.
    • Updated the writing custom widgets demo to show how to add a widget priority.
    • I was planning on adding this in version 3.0, but the need arose sooner with the additions of all of the new widgets.
  • Updated Filter widget

    • Fixed a bug that only occurred when using the filter widget with the pager plugin getting ajax data
      • The pager no longers repeatedly tries to get the first page of table content
      • Fixes issue #270.
    • Fixed filter widget to correctly target the filter row cells.
    • The current filter row cells (td's) are now saved to table.config.$filters.
    • Added a filter_liveSearch option:
      • If true (default), a search is performed while the user is typing, after a short delay.
      • If false, the user will have to press enter on the keyboard to initiate the search
    • Added a filter get method to work with the filter inputs
      • Use $.tablesorter.getFilters( $('table') ); to get an array of the current filters applied to the table
    • Added a filter set method to work with the filter inputs
      • Use $.tablesorter.setFilters( $('table'), ['abc', '1'] ); to set the first two filters values to "abc" and "1" respectively; but this does not initiate a search.
      • Use $.tablesorter.setFilters( $('table'), ['abc', '1'], true ); to set the filters values and initiate a search.
      • The difference between $.tablesorter.setFilters( $('table'), ['abc', '1'] ); and $('table').trigger('search', [ ['abc', '1'] ]); is that the setFilters method will update the actual filter inputs with the search query, whereas the triggered search will not.
      • If the $('table') does not target a table with a filter widget applied, it will return false.
  • Updated Resizable widget

    • Added resizable_addLastColumn option which allows you to make the last column resizable, essentially making a non-full width table resizable.
    • Updated the resizable demo to show this option.
    • The resizable demo also now highlights the non-resizable "Age" column to make it more obvious.
  • Updated Sticky headers widget

    • Added a stickyHeaders_cloneId option
      • This option is only used if the table has an ID defined, then the value from this option will be added to the end of the ID of the cloned sticky table.
      • Default value is -sticky.
      • Fixes issue #271.
    • Fixed an issue with scrolling lag:
      • If the page had a large number of hidden tables (inside tabs), there would be a noticable delay while scrolling up.
      • Only visible tables are now monitored.
      • Fixes issue #278.
    • This widget will now include the table caption in the sticky header:
      • Additional css was added to every theme to apply a background color to the caption, otherwise it would be transparent and content could then be seen to scroll behind it.

        caption { background: #fff; }
      • This fullfills the enhancement request in issue #126.

    • This widget will now include the filter row in the sticky header:
      • The filter row is duplicated, so searches within either filter row will update the content of the other filter row.
      • This fullfills the enhancement request in issue #249.
    • Removed the processing icon from the sticky header (reported via email).
  • Added a content editable widget

    • Added a widget to enable content editing of the table (using the contenteditable attribute), by column.

    • It has four options, used as follows:

      $('table.tablesorter').tablesorter({
        widgets: ['editable'],
        widgetOptions: {
          editable_columns       : [0,1,2],  // array that points to the columns to make editable (zero-based index)
          editable_enterToAccept : true,     // press enter to accept content, or click outside if false
          editable_autoResort    : false,    // auto resort after the content has changed.
          editable_noEdit        : 'no-edit' // class name of cell that is no editable
        }
      });
    • Make a table cell uneditable by added the class no-edit, set in the editable_noEdit option.

    • Added a content editable widget demo.

  • Added Repeat headers widget

    • This widget has always been the example used in the Writing custom widgets demo.

    • It has been updated and now follows the same format as the widget template for tablesorter version 2.9+

    • As written, it will no longer work with tablesorter versions older than 2.8.

    • Only one option for this widget is available:

      $('table.tablesorter').tablesorter({
        widgets: ['zebra', 'scroller'],
        widgetOptions : {
          rowsToSkip : 4 // number of rows to show between the repeated headers
        }
      });
  • Added Scroller widget

    • This widget is a modified version of the scroller widget made by Tim Connell (original demo)

    • It has four options, used as follows:

      $('table.tablesorter').tablesorter({
        widgets: ['zebra', 'scroller'],
        widgetOptions : {
          scroller_height       : 300,  // height of scroll window
          scroller_barWidth     : 17,   // scroll bar width
          scroller_jumpToHeader : true, // header snap to browser top when scrolling the tbody
          scroller_idPrefix     : 's_'  // cloned thead id prefix (random number added to end)
        }
      });
    • Added a scroller widget demo.

  • Updated Pager Plugin

    • Added all pager plugin options within the widget options table on the main documentation page.
    • Added a better example of how to use the customAjaxUrl function.
    • Updated the {page} tag used withing the ajaxUrl option:
      • Previously {page} was replaced with a zero-based index of the targeted page number, now this format can also be used {page+1}.
      • A tag of {page+1} will be replaced with the targeted page number plus one, making it a one-based index.
      • Actually any number can be added, or subtracted, from the page number using this format: {page+2}, {page-1}, {page+10}, etc.
    • The List portion of the {sortList:col} and {filterList:fcol} tag are now optional:
      • These tags are used within the ajaxUrl option.
      • So, {sort:col} and {filter:fcol} can now be used. It just seems clearer/cleaner to me.
    • The pager's ajaxProcessing function is now more flexible
      • When returning the processed ajax data, it was required to return it in this form: [ total, rows, headers ].
      • With this update, you can now also return the data as [ rows, total, headers ].
      • If your database is dynamic and doesn't have a total, then you can just give it a really big number & disable the "last" page button. The only reason the plugin needs the total is to calculate the total pages and to know what number to set when the user clicks on the last page button.
  • General documentation cleanup & updates

Version 2.8.2 (3/28/2013)

  • Updated the "ignore-leads" parser:
    • Renamed the parser to "ignore-articles"
    • Added language support and a few languages
    • Added a method to add custom articles.
    • Please see the updated demo (also renamed)
    • Thanks for thezoggy for feedback.
  • Fixed a bug in the grouping widget demo:
    • The "priority (letter)" column was incorrectly parsing the data which, for some reason, worked in some browsers.
    • Thanks again to thezoggy for reporting this issue.

Version 2.8.1 (3/27/2013)

  • Added customAjaxUrl option to the pager:
    • This function is called after all processing has been applied to the ajaxUrl string.
    • Use this function to make any other string modifications, as desired.
    • Thanks to Cthulhu59 for contributing. See pull request #256.

Version 2.8.0 (3/27/2013)

  • Added an updateAll method

    • This method allows you to update the cache with data from both the thead and tbody of the table.
    • The update method only updates the cache from the tbody.
    • This fixes issue #262.
  • Added a grouping rows widget:

    • It only works in tablesorter 2.8+ and jQuery v1.7+.
    • This widget was added to a subfolder named widgets within the js directory.
    • A group header is added, after sorting a column, which groups rows that match the selector.
    • Selectors include whole words, letters, numbers and dates (year, month, day, weekday and time).
    • Check out the demo and get more details on how to use the widget there.
    • Thanks to Brian Ghidinelli for sharing his custom widget code.
  • Added multiple parsers

  • Tablesorter's "update" method now checks if a column sort has been enabled or disabled:

    • Please note that the sorter precendence (order of priority) is still inforced (reference).

    • So, for example, if you add a "sorter-false" class name to the header, it will disable the column sort if no jQuery data, metadata, headers option or other `"sorter-{some parser}" class name is already in place.

    • To make sure a column becomes disabled, set it's jQuery data, then update:

      $('th:eq(0)').data('sorter', false);
      $('table').trigger('update');
    • Thanks to dibs76 for asking about this on StackOverflow.

    • This is also related to issue #262.

  • Custom parsers detection now has higher priority over default parsers:

    • If your custom parser just has an is() check that only returns false, nothing will change. You can still set the parser using jQuery data, metadata, the headers option or header class name as usual (in this order of priority).
    • What this means is that if you wrote a custom parser with an is() check (which tests the string and returns a boolean where true shows a match for your parser), it would have previously been checked after all of the default parsers were checked.
    • Now the automatic parser detection works in reverse, from newest (custom parsers) to oldest (default parsers). So the default text and digit parsers will always be checked last.
  • The addWidget method will now extend an included options object into the widget options (table.config.widgetOptions).

    • Default widgets will not use this functionality until version 3.0, to keep them backwards compatible.

    • Include any widget options, when writing a new widget, as follows:

      // *******************
      // parameters:
      // table = table object (DOM)
      // c = config object (from table.config)
      // wo = all widget options (from table.config.widgetOptions)
      $.tablesorter.addWidget({
        id: 'myWidget',
        // widget options (added v2.8) - added to table.config.widgetOptions
        options: {
          myWidget_option1 : 'setting1',
          myWidget_option2 : 'setting2'
        },
        // The init function (added v2.0.28) is called only after tablesorter has
        // initialized, but before initial sort & before any of the widgets are applied.
        init: function(table, thisWidget, c, wo){
          // widget initialization code - this is only *RUN ONCE*
          // but in this example, only the format function is called to from here
          // to keep the widget backwards compatible with the original tablesorter
          thisWidget.format(table, config, widgetOptions, true);
        },
        format: function(table, c, wo, initFlag) {
          // widget code to apply to the table *AFTER EACH SORT*
          // the initFlag is true when this format is called from the init
          // function above otherwise initFlag is undefined
          // * see the saveSort widget for a full example *
          // access the widget options as follows:
          if (wo.myWidget_option1 === 'setting1') {
            alert('YAY');
          }
        },
        remove: function(table, c, wo){
          // do what ever needs to be done to remove stuff added by your widget
          // unbind events, restore hidden content, etc.
        }
      });
    • Updated the demo showing how you can write your own widget

  • Updated all methods to stop event propagation past the table. This prevents sorted inner tables from also sorting the outer table. Fixes issue #263.

  • Updated filter widget to restore previous search after an update. Fixes issue #253.

  • Updated bower manifest file, thanks to joyvuu-dave for the pull request #252.

  • Updated several public methods that require a table element:

    • These methods will now accept either a table DOM element or a jQuery object; previously it would only accept a DOM element.
    • Modified these $.tablesorter functions: isProcessing, clearTableBody, destroy, applyWidget and refreshWidgets.
    • Example: $.tablesorter.destroy( document.getElementById('myTable') ); or $.tablesorter.destroy( $('#myTable') );
    • See issue #243.
  • Updated Bootstrap from version 2.1.1 to 2.3.1.

  • Fixed issue with bootstrap demo not working in IE7. It was a silly trailing comma. Fixes issue #265.

  • Fixed the filter widget to work properly across tbodies. It now leaves non-sortable tbodies intact. Fixes issue #264.

  • Fixed the updateCell method which would cause a javascript error when spammed. It would try to resort the table while the tbody was detached.

  • Fixed shortDate parser so that it no longer detects semantic version numbers (e.g. "1.0.0").

  • Fixed the internal getData() function to properly get dashed class names; e.g. "sorter-my-custom-parser" will look for a parser with an id of "my-custom-parser".

  • Fixed IE code examples all appearing in line.

  • Did some general code cleanup and rearranging.

Version 2.7.12 (3/1/2013)

  • Fixed hiding filter rows when using filter_formatter elements. See issue #250.
  • Fixed an issue with updateCell method not removing extra table rows before computing the row index of the cell that was just updated.
  • Added an exactMatch option to the html5color filter_formatter function.
  • Added missing documentation for the updateCell callback method. It's been there for a while!

Version 2.7.11 (2/24/2013)

  • Fixed several javascript errors:

    • Empty cells in a numeric column should no longer cause an error - fixes issue #246.
    • The tablesorter storage function should no longer cause an error when provided an undefined key - fixes issue #244.
  • Added saveSortReset method to clear any saved sorts for a specific table. Use it as follows:

    $('table').trigger('saveSortReset');
  • Added delayed options to several filter formatter functions.

    • Selectors that can be changed quickly - uiSlider, uiRange, uiSpinner, html5Range and html5Number - will now execute the filter query after a short delay.
    • The filter delay time is set in the filter function option filter_searchDelay. The default delay is 300 milliseconds.

Version 2.7.10 (2/22/2013)

  • Updated widget storage function to ensure no invalid strings are passed to the $.parseJSON function.
  • Updated filter widget:
    • When cell content contains quotes and the filter select is added, the quotes are now properly processed to be included within the options. Fixes issue #242.

    • Empty cells are no longer added to the options. If you want to include empty cells, add the following (see this StackOverflow question):

      <span style="display:none">{empty}</span>

      Then you'll get a select dropdown showing {empty} allowing you to select empty content.

Version 2.7.9 (2/20/2013)

  • Fixed an issue with the pager targeting an incorrect page when the table starts out empty.
  • Get the correct number of columns when widthFixed is true and the first row contains a table. See issue #238.

Version 2.7.8 (2/17/2013)

  • Fixed script errors:
    • Comment start was stripped when converting files from UTF-8 w/BOM to UTF-8 w/o BOM.
    • Fixed Firefox error in the filter-formatter files, when HTML5 elements don't exist, oops!

Version 2.7.7 (2/17/2013)

  • Updated the currency parser to ignore formatting (commas, decimals and spaces) when detecting the column parser.

  • Updated the natural sort regex to better work with scientific notation and alphanumerics with the number first - see this issue.

  • Reverted code to only add a colgroup if the widthFixed option is true and no colgroup exists. Fixes issues #238 and #239.

  • Added a tablesorter namespace to all bound events. Fixes issue #233.

  • Added a filterReset method which is the same code executed when the filter_reset element is clicked.

  • Added a pageSet method to the pager which allows you to easily change the pager page (see issue #231):

    // go to page 3
    $('table').trigger('pageSet', 3);
  • Added a range filter to the filter widget.

    • You can now search for a range of values using either of these formats: 10 - 20 or 10 to 20. Note the space before and after the dash so as to differentiate it from a negative sign.
    • You can also use symbols within the range 10% - 20% or $10 - $20.
    • Thanks to matzhu and satacoy for code ideas in issue #166.
  • Added logical AND and OR operators to the filters to the filter widget.

    • Entering box && bat (or box AND bat) will only show rows that contain box and bat within the same column below the filter. It does not search other columns. The spaces between the operators and the queries are important.
    • Entering box|bat (or box OR bat) will only show rows that contain either box or bat within the same column below the filter. It does not search other columns. The spaces between the operators and the queries are important.
    • At this time you cannot combine different operators. So, >= 100 AND <= 200 will not work, use the range filter operator (100 - 200) instead.
    • Using the | (or operator) was previously undocumented, but useable.
    • This was also requested in issue #166.
  • Added a new filter widget option named filter_formatter:

    • This option allows you to add custom selectors into the filter row.

    • Because of the amount of coding, new files named "jquery.tablesorter.widgets-filter-formatter.js" and "filter.formatter.css" were added. They include code to add jQuery UI and HTML5 controls via the filter_formatter option.

    • Filter formatter functions include: "uiSpinner", "uiSlider", "uiRange" (uiSlider ranged), "uiDatepicker" (range only), "html5Number", "html5Range" and "html5Color".

    • As an example, this code will add the jQuery UI spinner to the first column:

      filter_formatter : {
        0 : function($cell, indx){
          return $.tablesorter.filterFormatter.uiSpinner( $cell, indx, {
            value : 0,  // starting value
            min   : 0,  // minimum value
            max   : 50, // maximum value
            step  : 1,  // increment value by
            addToggle: true, // enable or disable the control
            exactMatch: true,
            numberFormat: "n"
          });
        }
      }
    • You can also choose to add the current selector value into a css3 tooltip or into the header by setting the valueToHeader option, if available.

    • Fulfills ErinsMatthew's feature request - issue #232. Thanks for the great idea!

  • NOTE: I know the js folder is getting messy. In version 3, I plan on having a separate folder for widgets and parsers. And with the build system, you'll be able to pick and choose which components you need.

Version 2.7.6 (2/6/2013)

  • Merged in an update from Somebi to fix a javascript error which occurs when the table doesn't have a thead or tbody, or it is already initialized.

Version 2.7.5 (1/31/2013)

  • Added pager pageSize method to the docs.
  • Added chili syntax highlighting script files back to the repo as some other external demos were still linking to it.

Version 2.7.4 (1/29/2013)

  • Fixed an problem with the pager not pointing to a tbody, and breaking on an empty tbody. See issue #223.
  • Modified core to always add a <colgroup> to the table. Only when the widthFixed option is true will it add percentage based widths.
  • Modified the parsers code to no longer require an is function; or if the function is missing, no error will be thrown.
  • Modified the isoDate and usLongDate parsers:
    • isoDate parser will now auto-detect dates with times
    • usLongDate parser will now auto-detect dates in this format: "DD MMMMMMMMM YYYY" (25 Jan 2013)
  • Added manifest files:
    • component.json for bower package manager. Thanks to appleboy; also see issue #190.
    • tablesorter.jquery.json for the jquery plugin registry.
  • Added "updateRows" method which is the exact same as "update", but needed due to issues with Prototype. See issue #217.
  • Added pageSize method to change the pager page size more easily. See issue #218.
  • Added a method to disable specific columns in the resizable widget.
    • Disable a column using jQuery data, metadata, the headers option, or header class name (resizable-false); to see a full list of methods, see the updated demo.
    • Enhancement request from issue #215.
  • Added filter widget change log to the wiki pages.
  • Added a config variable config.columns:
    • This variable indicates the number of columns in the table.
    • Previously, config.parsers.length or config.$headers.length were used. Neither of which were accurate if the table was empty or multiple rows in the header existed.
    • This value may still be inaccurate if a rowspan is used in the header.
  • Updated index page to use jQuery 1.9.
    • jQuery 2.0 is has a bug adding rows to the table, so I didn't upgrade the demos to use it.
    • Changed syntax highlighting script from chilli to google's prettify.

Version 2.7.3 (1/10/2013)

  • Fixed a serious bug in the filter widget that was breaking the widget completely if filter_functions was not defined (introduced in v2.7.2). Fixes issue #213.

Version 2.7.2 (1/8/2013)

  • Updated filter widget to update the filter-select when an update event is triggered. See this StackOverflow question.
  • Replaced background-image: url(); with background-image: none; in all applicable theme files.

Version 2.7.1 (1/4/2013)

  • Added two internal parameters to always make sure we're targeting the correct elements.
  • Added table.config.$table which is a jQuery object of the table.
  • Added table.config.$tbodies which is a jQuery object of sortable tbodies; the ones without the class name in the cssInfoBlock option.
  • Fixed removal methods:
  • Tablesorter destroy will now properly restore the header and remove all bindings.
  • Widgets should now again be removed properly.
  • Updated the storage utility to allow setting a property to an empty string, previously it was just ignored.
  • Fixed pager issues:
  • Pager status will now update properly while filtering rows.
  • Pager status will also update properly after sorting filtered rows.
  • The above issues were fixes for issue #207.
  • Fixed the pager's fixedHeight option to again properly pad the table to maintain the height.

Version 2.7 (12/26/2012)

  • Added headerTemplate option:
  • headerTemplate is a template string which allows adding additional content to the header while it is being built.
  • This template string has two default tags: {content} and {icon}.
  • {content} will be replaced by the current header HTML content.
  • {icon} will be replaced by <i class="tablesorter-icon"></i>, but only if a class name is defined in the cssIcon option.
  • Everything within this template string will be wrapped in a div with class tablesorter-header-inner.
  • The default template is {content}.
  • The following themes DO NEED the icon ({icon}) included in the template: Bootstrap, jQuery UI, Grey and Dropbox.
  • Added onRenderTemplate option:
  • This is a function that is called after the template string has been built, but before the template string is applied to the header and before the onRenderHeader function is called.
  • The onRenderTemplate function receives a column index and template string parameters. The template string, from the headerTemplate option, will already have the {icon} and {content} tags replaced; it's just a string of formatted HTML. When done manipulating this string, return it.
  • Check out the demo here.
  • Updated uitheme widget
    • The uitheme setting is no longer required, use the theme option instead.
    • When using the bootstrap or jui theme, just add the name to the theme option: e.g. theme: "bootstrap".
    • The uitheme widget option will still work, but if the theme name exists within $.tablesorter.themes it will override the uitheme option.
    • Look at the theme demo source for a better example.
  • Fixed sortReset bug - see issue #167.
  • Fixed an issue with the pager resetting to the first page after every sort.
  • Fixed javascript errors popping up when initializing the plugin on an empty table. Fixes issue #206.

Version 2.6.2 (12/20/2012)

  • Fixed sort breaking when tfoot contained a table. Fixes problem mentioned in issue #196.
  • Fixed javascript error due to using hasOwnProperty inside of the formatFloat function in IE8. Fixes issue #200.
  • Fixed the reformatted minified widget file. Fixes issue #201.
  • Fixed pager ajax. It no longer load the initial page twice. Fixes issue #202.

Version 2.6.1 (12/19/2012)

  • Updated the pager

    • Added an event named pagerBeforeInitialized which is triggered after all of the controls have been set up, but before rendering of the table or ajax data is obtained.
    • Cleaned up pager code.
  • Modifed the formatFloat function

    • Previously you had to call the formatFloat function with a table so it could get the number format configuration

      $.tablesorter.formatFloat('1,234,567.89', table); // result if usNumberFormat true = 1234567.89
    • Now you can either pass the table or a boolean to indicate the format:

      var usNumberFormat = true;
      $.tablesorter.formatFloat('1,234', usNumberFormat); // result = 1234
      $.tablesorter.formatFloat('1,234', false); // non-U.S. format result = 1.234
  • Fixed pager size result incorrect with nested tables. Fixes issue #196.

  • Fixed parser javascript error when clearing tr's from table. Fixes issue #199.

  • Fixed themes so that the sorter-false class now restores the header padding. Mentioned in issue #.

Version 2.6 (12/18/2012)

  • Added sortResetKey:
    • By default, holding down the ctrl key while clicking on a header cell will reset that column's sort.
    • When sorting multiple columns, holding shift+ctrl will maintain the previous sorts and reset the selected column.
    • Thanks to emmerich for sharing this code!
  • Added basic unit testing:
    • JSHint checks of core, widgets and pager addon.
    • Checks of various public functions, parsers and methods.
    • This is a work-in-progress, so many more tests still need to be added.
    • See the basic test results here.
  • Sorting arrows no longer show when a header column is disabled. Fixes issue #188.
  • Improved pager AJAX support:
    • Added serverSideSorting option (default is false) to the plugin core which when true will disable client-side sorting.
    • Added filter_serversideFiltering filter widget option (default is false) which when true will disable client-side filter widget processing.
    • Added a filterList ({filterList:fcol}) ajax parameter to the pager's ajaxUrl option.
    • Added cssErrorRow option to the pager options, allowing you to style the ajax error row which only appears with ajax errors.
    • This update also fixes an issue with page size changing. See issue #198.
    • Thanks to dhamma for this enhancement!
  • Added footerRow and footerCells to the tablesorter themes ($.tablesorter.themes):
    • This allows styling of the footer in the bootstrap and jQuery UI themes.
    • Used by the uitheme widget.

Version 2.5 (11/22/2012)

  • Improved multi-column sorting
    • Huge thanks to Nick Craver for making multicolumn sorting no longer uses an eval() during the sort!
    • This change improves performance of the sort across all browsers.
    • It also allows use of numerous minifier scripts.
    • See pull request #177 for more details.
  • Fixed using addRows on an empty table, issue #179.
  • Fixed inconsistencies in the usage of sort up (ascending) and sort down (descending) in the javascript and css.
    • Updated the cssAsc default value to tablesorter-headerAsc.
    • Updated the cssDesc default value to tablesorter-headerDesc.
    • All css themes now include these new class names. References to older class names were not removed, but they will be removed in version 3.
    • Renamed image files and switched data URIs to match these changes.
    • This fixes issue #173. Thanks bitti!
  • Updated all theme css files to use image data URIs instead of the images.
    • The images are all still contained in the css/images directory.
    • References to the image files have been commented out instead of removed.

Version 2.4.8 (11/15/2012)

  • Fixed a few issues:
    • The pager plugin will no longer cause a javascript error when initialized on a table that doesn't have tablesorter applied.
    • The sticky header widget will now add the cloned table with the sticky header AFTER the table, in case the table has an ID applied.
    • See issue #175 for more details.

Version 2.4.7 (11/14/2012)

  • Added sortReset method.
    • This event can be triggered on the table and it will reset all sorts.
    • Added a demo.
    • Fullfills enhancement request from issue #.
  • Added a live LESS theme demo at codepen.io.
  • Fixed QtWebkit browsers (includes Safari & Arora) error when running jQuery v1.8+:
    • The problem was with a selector which worked without any problems until jQuery v1.8+.
    • Fixes issue #132 & #174.
  • Fixed sticky header issues
    • Sticky header bug when the sticky header contained a sticky-false row - see issue #172.
    • Javascript error fixed in IE8 - see issue #.
    • Sticky header breaking when first rows hidden - see issue #168.

Version 2.4.6 (10/25/2012)

  • Filter widget select dropdowns will now trim extra spaces before adding them as an option. Fixes issue #161.
  • Fixed pager addon page size selector. There is an order of priority:
    • If an option has selected="selected" as an attribute, it will override the pager size option.
    • Pager size option is no longer ignored even if no option in the page size select is selected.
    • Fixes an problem brought up in issue #122.
  • The pager plugin will now update when an updateComplete or filterEnd event is triggered on the table.
    • Added to make the pager plugin work with this quicksearch plugin.
    • To make them work together, filtered rows need to get a class name of filtered before triggering the updateComplete event.
    • See issue #160 for more details.

Version 2.4.5 (10/17/2012)

  • The filter widget no longer builds the filter row when all columns have filter-false set. Fixes issue #156.
  • Pager plugin updates:
    • Added an optional ajax url parameter to include the current sort per column
      • Add the {sortList:col} parameter, where col is the actual parameter added to the URL.
      • So this parameter {sortList:sort} with a sortList value of [[2,0],[3,0]] becomes &sort[2]=0&sort[3]=0 in the URL.
      • Thanks to trevorbernard for the enhancement request from issue #155.
    • Fixed an issue with the cssPageSize and cssGoto not becoming disabled when multiple elements exist. Fixes issue #157.

Version 2.4.4 (10/15/2012)

  • Updated pager plugin:
    • Added pagerInitialized event which is triggered after the pager has completed initialization.
    • Added pageMoved event which may fire before the pagerComplete event when ajax processing is involved, or after the pagerComplete on normal use. See issue #153.

Version 2.4.3 (10/13/2012)

  • Fixed an error with the filter widget using parsed data. Fixes issue #149.

Version 2.4.2 (10/13/2012)

  • Updated the Bootstrap theme:
    • Bootstrap demo version updated to v2.1.1.
    • Darkened header gradient - see issue #142.
    • Made some other tweaks to clean up the theme - bold header text, select box sizes (pager), etc.
  • Updated LESS theme to include filter widget styling, column widget footer styling and themes.
  • Updated updateCell method to not use jQuery's closest() function which is not supported by jQuery v1.2.6.
  • Changed tablesorter selectorRemove option default to ".remove-me" (see the pager plugin ajax change below).
  • Fixed sticky headers not scrolling horizontally. Fixes issue #143.
  • Fixed pager plugin Ajax:
    • Ajax loaded tables will no longer hide pages other than the first. Fixes issue #151.
    • Ajax header data now properly replaces the header text.
    • The error message row is now added with the class name from the selectorRemove option.

Version 2.4.1 (9/29/2012)

  • Fixed uitheme widget:
    • A second div is now wrapped around the table cell contents.
    • This allows using relative & absolute positioning on the content as Firefox does not support this directly on table cells.
  • Fixed support for jQuery v1.2.6
    • Core modified to not use closest() function.
    • Resizable widget modified to not use closest() & isEmptyObject functions.

Version 2.4 (9/27/2012)

  • Core changes:

    • Table bodies are now detached before processing the contents. There is a noticable speed increase when sorting large tables, especially in IE. Fix for issue #72 and possibly issue #75.

    • Changed cssChildRow option default from expand-child to tablesorter-childRow to make it more clear.

    • Changed selectorHeaders option default from '> thead th' to `'> thead th, > thead td' to include non-header cells.

    • Fixed sortAppend being applied multiple times when sorting multiple columns. Fix for issue #115.

    • Fixed updateCell method to correctly target the table cell from the cache.

    • Fixed something, somewhere to fix issue #128 LOL... darn you IE!

    • Updated the widthFixed option to set the column widths as a percentage instead of pixels to better resize the table dynamically.

    • Updated the script so that data-column attributes are no longer removed from disabled columns. This fixes an issue where filter-false doesn't apply to disabled columns.

    • Updated the widgets option so that the order of widgets no longer matters. The array now is sorted in reverse alphabetical order, but the zebra widget is always applied last. See the table here.

    • Updated the $.tablesorter.isDigit() function to ensure that no errors pop up when giving it an element of type number. Fix for issue #121.

    • Updated the natural sort function to better sort numbers with leading zeros. See this issue for more details.

    • Updated the code to always check that the sortList option contains numeric values. See issue #127.

    • Updated the date parser to not be so rigid. See issue #125.

    • Updated several internal functions to keep tablesorter compatible with jQuery 1.2.6. Fixs issue #124.

    • Tablesorter can no longer be initialized multiple times on the same table, unless the destroy method is called.

    • Bound events now have unbind executed before bind to fix an issue with Microsoft ajax.net. See issue #119.

    • Added cssHeaderRow option

      • This option contains the class name added to the header row.
      • Previously it got the same class name as cssHeader.
      • Default value is "tablesorter-headerRow".
    • Added cssIcon option:

      • This option contains the class name added to the <i> element that is now automatically added to every header cell.
      • To prevent the plugin from adding an <i> element to the headers, set this option to an empty string.
      • Default value is "tablesorter-icon".
    • Added theme option & new themes!

      • Default theme is now default.
      • Note that ALL of the documentation demos now need the theme option set to "blue" to apply the blue theme.
      • Thanks to thezoggy, numerous themes have been added including default, ice, black-ice, dark & dropbox.
      • Updated hovered row styling to include child rows in some themes (blue, green and less themes).
      • See the column widget update for details on styling of the thead and tfoot cells as well.
      • Removed the blue and green zipped theme files.
    • Added selectorSort option:

      • This option allows you to set which element within the table header triggers the sort.
      • Previously the entire header cell would trigger a sort so any extra elements within the cell would not be clickable.
      • See issue #137.
    • Added cssProcessing option:

      • When true, an indeterminate progress icon is added to the header while tablesorter is sorting or filtering columns.
      • It is disabled by default, but can be enabled by setting the showProcessing option to true.
      • The icon can also be shown using the API: $.tablesorter.isProcessing(table, toggle, $ths);
        • The table parameter is the table to target.
        • toggle is a boolean which when true will add the cssProcessing option class name to the header.
        • The last parameter $ths is optional. When set it will target specific header cells. If undefined, only the sorted headers will be targeted.
      • Note that for small tables, this processing icon may quickly flash and may be distracting. In larger tables, it will be more visible, but may not animate. I believe this is because of all the javascript processing going on (single threaded) prevents the animation from occurring - I'll try to find a better solution.
  • Parsers:

    • All parsers now have publically available methods.
    • Access the parsers using $.tablesorter.parsers.
    • Get the desired parser code using parser = $.tablesorter.getParserById("parser_name").
  • Widgets:

    • All widgets now have publically available methods:
    • Access the widgets using $.tablesorter.widgets.
    • Get the desired widget code using $.tablesorter.getWidgetById("widget_name").
    • Apply all selected widgets from the widgets option directly using $.tablesroter.applyWidget(table, initialize);, where initialize is a boolean indicating to run the widget's init function versus the format function. This is the same as triggering applyWidgets on the table.
    • All widgets now have a remove function which when called will remove the widget from the table, see the writing custom widgets demo page for an example.
    • Updated the destroy method to call all widget's remove function, if it exists.
    • Added a method to refresh widgets:
      • Trigger this method using $('table').trigger('refreshWidgets', [doAll, dontapply]);, or call it directly using $.tablesorter.refreshWidgets(table, doAll, dontapply)
      • If doAll is true it removes all widgets from the table. If false only non-current widgets (from the widgets option) are removed.
      • When done removing widgets, the widget re-initializes the currently selected widgets, unless the dontapply parameter is true leaving the table widget-less.
      • Note that if the widgets option has any named widgets, they will be re-applied to the table when it gets resorted. So if you want to completely remove all widgets from the table, also clear out the widgets option $('table')[0].config.widgets = [];
      • Enhancement request from issue #112.
    • Added a jQuery compatibility table to the WidgetOptions section to show the limitations of each widget. See issue #124.
  • Columns widget updates:

    • The column class names from the widgetOptions.columns option can now be applied to the header row (including the sticky header) and footer row.
    • Added a new option named columns_thead which is true by default. Set it to false to not add the columns class name to the header.
    • Added a new option named columns_tfoot which is true by default. Set it to false to not add the columns class name to the footer.
    • In addition to the column class name, the tfoot also gets the class name for an ascending or desending sort obtained from the cssAsc and cssDesc option.
    • Added a remove function method.
  • Filter widget changes:

    • Added the ability to enter operators into the filter. Added < <= >= > ! =.

      • To find values greater than 10, enter >10.
      • To find letters less than M, enter <m, but to find letters greater than M, enter >=n, because >m will include ma because ma > m.
      • To find people that aren't George, enter !George or to only look for males, enter !female. This doesn't work in the quick search filter because
      • Exact matches can be done using quotes, as before, or by using an equal sign =, e.g. find the exact number 10 by using 10=.
      • Note #1 In currency, percent or other numerical columns with numbers, the operators will ignore these extra symbols when parsing the value. So to find values greater than 10%, ignore the percent sign and use > 10.
      • Note #2 when using any of the above operators, the child row content is ignored even if filter_childRows is set to true.
    • Added filter_columnFilters option which when true will add a filter to each column. If false, no filter row is added.

    • Added filter_hideFilters option which when true will hide the filter row initially. The rows is revealed by hovering over the filter row or giving any filter input/select focus.

    • Added filter_reset option which will contain a jQuery selector pointing to a reset element (button or link).

    • Added filter_useParsedData option

      • When true, ALL filter searches will only use parsed data.
      • To only use parsed data in specific columns, set this option to false and use any of the following methods (they all do the same thing), in order of priority:
        • jQuery data data-filter="parsed".
        • metadata class="{ filter: 'parsed'}". This requires the metadata plugin.
        • headers option headers : { 0 : { filter : 'parsed' } }.
        • header class name class="filter-parsed".
      • Remember that parsed data most likely doesn't match the actual table cell text, 20% becomes 20 and Jan 1, 2013 12:01 AM becomes 1357020060000.
      • Enhancement request from issue #96.
    • Added a method to apply a filter to the table when filter_columnFilters is false by triggering a search on the table.

      // search using an array - the index of the array matches the column index
      // [ column0, column1, column2, ..., columnN ]
      var columns = []; // undefined array elements are treated as an empty search ''
      columns[4] = '2?%'; // is equivalent to defining the array this way [ '', '', '', '2?%' ]
      $('table').trigger('search', [columns]);
    • Added "filterInit" triggered event on the table after the filter widget has finished initializing.

    • Added "filterStart" triggered event on the table. Enhancement request from issue #108.

    • Added "filterEnd" triggered event on the table. This is used by the updated pager plugin to allow it to work with the filter widget. Enhancement request from issue #108.

    • Modified filter select dropowns (still added by using filter-select or setting a filter_functions column to true):

      • By default the select will filter exact matches. To only match column content, add a "filter-match" class to the column. Fixes issue #102.
      • The contents of the select are now alphanumerically sorted. Fixes issue #103.
    • The filter widget should properly target columns when multiple header rows with column and row spans are included. Fixes issue #113.

    • Added a remove function method.

  • Resizable widget update

    • Added an option resize to widgetOptions
      • When false the resized columns widths will not save to storage (localStorage/cookie).
      • Default is true which saves resized column widths.
    • Modified the resize method to smooth out the resizing.
    • Right clicking (opening the context menu) on the header will now reset the resizing of the columns. If you right-click on the header with no resized columns, the context menu will open as it normally does.
    • Added a remove function method.
  • saveSort widget update

    • Added an option saveSort to widgetOptions
      • When false the saved sort in storage (localStorage/cookie) will still apply to the table upon initialization, but any new sorts will not save.
      • Default is true which loads the saved sort on initialization and saves, and overwrites, any new sorts of the table.
      • Added a remove function method which only clears the saved sort.
  • Sticky Headers Widget update

    • This widget now clones the entire thead for stickyfying ( yes, I know that isn't a real word :P ). This is a similar method used by jmosbech in his StickyTableHeaders plugin.
    • Header rows containing column and row spans should now correctly align.
    • Attempted to correct the border spacing issue in non-webkit browsers. It's not perfect, so this may be tweaked in the future to make it pixel perfect, if that is ever possible.
    • Added a remove function method.
  • UITheme widget updated to be more generalized:

    • This widget will now apply a jQuery UI or Bootstrap theme. It was designed to me extendable to other platforms.

    • Added a Bootstrap theme demo. This demo also includes the filter widget with the pager plugin to show their interaction and other styling possibilities.

    • To extend the uitheme widget to other platforms, add/extend the theme in the $.tablesorter.themes variable contained in the jquery.tablesorter.widgets.js file.

    • To add either a jQuery UI or Bootstrap theme to the table, set it up as follows (also see the jQuery UI or Bootstrap demo):

      $("table").tablesorter({
        // widget code now contained in the jquery.tablesorter.widgets.js file
        widgets : [ 'uitheme', 'zebra' ],
        widgetOptions : {
          // set the uitheme widget to use the jQuery UI theme class names ## NEW ##
          uitheme : 'jui' // or 'bootstrap'
        }
      });
      • The widgets option must include the uitheme widget.
      • The widgetOptions for uitheme now only contains the name of the platform to use (previously it was the 3 icon class names to use). For now, use either jui for jQuery UI or bootstrap for a Twitter Bootstrap theme.
    • I am working on changing tablesorter's core to do all of this automatically, so if it works out it will be available in tablesorter version 3 and this widget will be obsolete.

    • Bootstrap theme enhancement requested in issue #104.

    • Added a remove function method.

  • Zebra widget updates:

    • It will no longer apply to nested tables. Fix for issue #98 and also fixed by styson in issue #116. Thanks!
    • The zebra widget is needed if using the bootstrap striped theme. See the Bootstrap demo for an example. Fixes issue #111.
    • The tbody is no longer hidden (or removed) when applying row class names. It appears to not change the speed significantly. But please feel free to report any speed issues.
    • Added a remove function method.
  • Pager addon changes:

    • The pager plugin now plays nice with the filter widget.

    Fixes issue #6.

    • Added cssGoto option which contains a jQuery selector pointing to a page select dropdown. Updated the pager demo with an example.
    • Updated pager addon to now work with the filter and advanced filter widgets.
    • Added {filteredRows} and {filteredPages} parameters to the output option. They contain the number of rows and pages that result from the filter widget search.
  • Updated the jquery.metadata.js file to the latest version and modified the code to better work with JSHint.

Version 2.3.11 (7/12/2012)

  • Merged in mmeisel's ipAddress parser fix. Optimized the format code.
  • Merged in two fixes from wwalser. Thanks for finding and fixes this issue!
  • Made the sort functions public. This is in anticipation of using the natural sort function in the filter widget to sort select options.

Version 2.3.10 (6/21/2012)

  • Fixed the filter widget causing an error when initialized on an empty table. Fixes issue #95. Thanks to Raigen for all of the diligent testing!

Version 2.3.9 (6/21/2012)

  • Theme updates:

    • Modified the blue & green themes to make the column colors better match the header.
    • Added row hovered styling.
    • Added a theme.less file which is set up to allow you to set a one color to create a palette of colors for even and odd rows, columns widget styling and row hovered colors.
  • Modified update, updateCell and addRows methods:

    • An updateComplete event is now fired after each method has completed.

    • Added a callback to each method. Used as follows:

      var resort = true, // resort table using the current sort
          callback = function(table){
              alert('new sort applied');
          };
      $("table").trigger("update", [resort, callback]);
  • Added a callback to the sorton method. It is used as follows:

    var sort = [[0,0],[2,0]],
        callback = function(table){
            alert('new sort applied to ' + table.id);
        };
    // Note that the sort value below is inside of another array (inside another set of square brackets)
    // A callback method was added in 2.3.9.
    $("table").trigger("sorton", [sort, callback]);
  • Fixed isDigit function returning true on an empty string. Fix for issue #88.

  • Fixed filter widget:

    • Filter inputs in multiple thead rows now correctly correspond to the column.
    • Fixed filtering of child rows to use the filter_ignoreCase option.
    • Fixed child rows displaying incorrectly when not filtered. Fix for issue #89.
    • The default filter select will now properly update after an update event. Fix for issue #91.
  • Fixed sortList to prevent errors. Fix for issue #92.

  • Fixed onRenderHeader option missing the last column. Fix for issue #93, and thanks to OBCENEIKON for the fix!

Version 2.3.8 (6/5/2012)

  • Filter widget search will now update on table updates. Fix for issue #86.
  • Fixed errors when entering invalid regex into the filter widget search input. Fix for issue #87.
  • Removed unnecessary semi-colons from the unicode characters in the sorting accented characters demo.
  • Added a Language wiki page which contains the character equivalent code for different languages (well only for Polish so far).

Version 2.3.7 (6/3/2012)

  • Updated $.tablesorter.replaceAccents() function to be independent of the table.
    • It was originally table dependent to allow making tables with different languages. I'll have to add another table option to allow this, if the need arises.
    • Modified as suggested in issue #81.
  • Fixed the url parser is function to properly detect complete urls.
  • Fixed an issue with the updateCell method incorrectly targeting the cell when there was more than one row in the header. Fix for issue #83.

Version 2.3.6 (6/1/2012)

  • Made the following enhancements to the filter widget:
    • Include placeholder text in the filter input boxes by adding data-placeholder with the text to the header cell; e.g. data-placeholder="First Name". See the examples in the filter widget demo.
    • Exact match added. Add a quote (single or double) to the end of the string to find an exact match. In the first column enter Clark" to only find "Clark" and not "Brandon Clark".
    • Wild cards added:
      • ? (question mark) finds any single non-space character.
        In the discount column, adding 1?% in the filter will find all percentages between "10%" and "19%". In the last column, J?n will find "Jun" and "Jan".
      • * (asterisk) finds multiple non-space characters.
        In the first column below Enter Br* will find multiple names starting with "Br". Now add a space at the end, and "Bruce" will not be included in the results.
    • Regex added. Search columns using regex. For example enter /20[^0]\d/ in the last column to find all date greater than 2009.
    • Added filter_functions option which allows you to add a select dropdown to the specified column that either gathers the options from the column contents or obtains options from custom function settings. Additionally, you can use this option to apply a custom filter function to the column. For more details, see the new custom filter widget demo.

Version 2.3.5 (5/28/2012)

  • Added more optimizations to speed up IE (except IE7):
    • Hide tbody during manipulation - added "tablesorter-hidden" css definition.
    • Parsing of the table contents using textContent for modern browsers (including IE9); see this jsperf.
    • Columns widget.
    • Filter widget.
    • Zebra widget.
  • Updated the shortDate detection regex to look for two or four grouped digits instead of two through four digits. Fix for issue #76.
  • Widget updates:
    • Added initWidgets option
      • If true, all selected widgets (from the widgets option) will be applied after the table has initialized.
      • when false, selected widgets init function will be called, but not the format function. So none of the widget formating will be applied to the table. Note: almost all included widgets do not use the init function to keep backward compatibility, except for the saveSort widget in which the init function immediately calls the format function. This information is only important if you are writing a custom widget.
      • It would be useful to set this option to false if using the pager plugin along with a very large table, say 1000+ rows. The table will be initialized, but no widgets are applied. Then the pager plugin is called and the table is modified and all of the widgets are applied when completed. So essentially this saves time by only running the widgets once.
      • Modified the pager plugin to make sure it doesn't apply widgets more than once.
    • Added filter widget option filter_ignoreCase:
      • The default setting is true and all searches will be case insensitive.
      • Set this option to false to make the searches case sensitive.
    • Added filter widget option filter_searchDelay:
      • Default set to 300 milliseconds.
      • This is the delay before the filter widget starts searching.
      • This option prevents searching for every character while typing and should make searching large tables faster.
    • Resizable widget will no longer initialize a sort after releasing the mouse.

Version 2.3.4 (5/20/2012)

  • Added selector change suggested by AnthonyM1229 in issue #74 to fix IE8 ignoring class name parsers. Thanks again Anthony for all of your hard work and input!

Version 2.3.3 (5/19/2012)

  • Fixed the method used to get data from jQuery data, meta data, header options or header class names.
    • This should fix the "filter-false" problem reported in issue #73,
    • and fix issue #74 with setting parsers by class name.
  • Performance improvements:
    • Modified the zebra and columns widget to use document fragments to modify changes to the table. I didn't log all of the times, but there was a speed increase in reported time when using the triggered events demo (1022 rows).
    • Changed the shortDate parser to cache header information.
  • Updated multiple demos to show how to set some options using jQuery data, class names, etc.

Version 2.3.2 (5/11/2012)

  • Added a method to remove tablesorter from a table
    • Use $('table').trigger('destroy'); to remove it.
    • Some classes applied by widgets will remain (zebra, columns, etc); but the functionality will be removed. I've been thinking about adding a "remove" function to each widget to specifically remove that widget.
    • Rows hidden by the filter widget will not reappear. I may work on an option to fix that in the future.
    • The "tablesorter" class is removed from the table; but if you want to leave this class, then use this example: $('table').trigger('destroy', [false]);.
  • Fixed percent parser to not be automatically applied to text columns. Fix for issue #67.
  • Fixed filter widget not working in v2.3.1. It was actually a problem with getting jQuery data breaking the widget.
  • The first tbody can now be an info block.
  • The zebra and column widgets should now properly ignore info blocks (it was missing periods in the class selectors!).
  • Text extracted from table cells is now automatically trimmed of extra spaces, tabs and carriage returns. If these elements are important to you, then please refer to the advanced use custom parser demo which allows you to access the table cell $(cell) directly.
  • Fixed and/or updated a bunch of demos:
    • Demos that include jQuery UI seem to need jQuery v1.4+ now or script errors will completely break the plugin. Updated ui theme and sticky headers widget demos.
    • Render headers demo now targets the div wrapping header cell contents. Previously it was a span.

Version 2.3.1 (5/8/2012)

  • Fixed an issue where header & metadata settings would ignore sorter:false inappropriately.
  • Fixed minified version:
    • Apparently Dean Edwards packer now breaks the minified version, so I switched to using Uglify.
    • I prefer Google Closure Complier but it completely removes the eval needed to get multi-column sorting to work unless the "Whitespace only" mode is used and results in a file 2k larger than the Uglify version.
  • Modified header settings to now check for settings with the following priority: jQuery data > metadata > headers option > header class name > overall option. Added:
  • Added the ability to set the sortList via jQuery data. See the updated sortList documents on how to use it
  • Fixed date parsers (isoDate, usLongDate, shortDate and time) which did not handle empty cell data properly.

Version 2.3 (5/8/2012)

  • Added ability to sort all columns under a header cell that spans multiple columns.
    • Previously clicking on the header cell would only sort the left-most column.
    • Added a demo.
  • Added support for "Content-type: application/xhtml+xml". Fix for issue #62. Thanks to MelTraX for the fix!
  • Added delayInit option:
    • This option delays parsing of all table cell data until the user initializes a sort.
    • This speeds up the initialization process of very large tables, but the data still needs to be parsed, so the delay is still present upon initial sort.
    • Enhancement suggested by MelTraX in issue #66.
  • Column parsers & settings can now be set using jQuery data.
    • This setting has a higher priority than metadata: jQuery data > metadata > headers option > header class name > overall setting.
    • This applies to the parsers, stringTo and emptyTo options.
  • Nested tables will no longer be targeted inappropriately - change value of selectorHeaders to "> thead th". Fix for issue #65. Thanks to MelTraX for sharing some code!
  • Reordered parsers to detect other numeric parsers before the general one. Fix for issue #64.
  • Completed minor document corrections, general code cleanup, optimization and removal of a global variable.

Version 2.2.2 (5/4/2012)

Version 2.2.1 (5/4/2012)

  • Widgets should now apply properly while the pager is active. Fix for issue #60.

Version 2.2 (5/3/2012)

  • Multiple tbody sorting:
    • Each tbody within a table will now sort separately.
    • To add in a non-sorting tbody, add the class "tablesorter-infoOnly", modifiable by the new cssInfoBlock option
    • See the main document's options table for an example.
    • NOTE The pager plugin will only be applied to the first tbody as always. I may work on modifying this behavior in the future, if I can figure out the best implementation.
  • Added ignoreCase option:
    • When true (default), text character case is ignored during sorting.
    • If false, upper case characters will sort before lower case characters.
  • Added textSorter option:
  • Modified sortLocaleCompare option:
    • This option no longer switches the sort to use the String.localeCompare method.

    • When this option is true, the text parsed from table cells will convert accented characters to their equivalent to allow the alphanumeric sort to properly sort.

    • If false (default), any accented characters are treated as their value in the standard unicode order.

    • The following characters are replaced for both upper and lower case (information obtained from sugar.js sorting equivalents table):

      • áàâãä replaced with a
      • ç replaced with c
      • éèêë replaced with e
      • íìIîï replaced with i
      • óòôõö replaced with o
      • úùûü replaced with u
      • ß replaced with S
    • If you would like to continuing using the String.localeCompare method, then set the sortLocaleCompare option to false and use the new textSorter option as follows:

      $('table').tablesorter({
        textSorter: function(a,b) {
         return a.localeCompare(b);
        }
      });

Version 2.1.20 (4/28/2012)

  • Optimized table rebuilding after sort by using a document fragment instead of appending cells directly to the table. This results in about a 20% increase in sort speed (very roughly determined).
  • Optimized pager table rebuilding to also use document fragments, and by removing two extra calls that reapplied the current widgets.

Version 2.1.19 (4/23/2012)

  • The filter widget will now ignore leading spaces so when the filter_startsWith is true it will match the text. Fix from issue #55. Thanks to aarkay18 for the code!
  • Fixed a problem with empty table cells returning an empty string instead of parsing the cell - needed when there is HTML like an input tag to process. Reverted the change accidently added back in version 2.1.15.
  • Added a resort flag that when set to false, it will prevent the resorting of the table when "update", "updateCell" or "addRows" is called. Use the appropriate format below:
    • update: `$('table').trigger('update', [false]);
    • updateCell: $('table').trigger('updateCell', [ this, false ]); - see the updating a table cell demo.
    • addRows: $('table').trigger('addRows', [$row, false]); - see the adding table rows demo.

Version 2.1.18 (4/23/2012)

  • When the sticky headers widget is applied to a table with multiple header rows, adding the class name sticky-false to any header row will prevent it from becoming sticky. Thanks to megatom for the suggestion in issue #52!
  • Updated filter widget css to better work with twitter's bootstrap. Fix per issue #54. Thanks thezoggy!
  • Modified the green theme arrows; see the columns style widget demo and choose the green theme to see the change. I've included the PSD files as well.

Version 2.1.17 (4/21/2012)

  • Fixed an error reported in issue #52 which occurrs when using the metadata plugin after the last update.
  • The sticky headers widget will now work properly if TD's are included in the header, but the following should be noted:
    • The selectorHeaders option needs to be changed to thead th, thead td to properly include the TD's.
    • CSS changes to the blue theme were needed and most likely any custom themes to add a background color to these cells.
    • To prevent the TD's from being sortable, add a sorter-false class name to it.
  • Updated the blue theme:
    • TD's in the sticky header should now have a background color applied.
    • Replaced the black arrow background image gifs with data uri. Included comments with white arrow data uri.
  • Updated filter widget to more accurately count the number of columns. There was an issue with multiple header rows.

Version 2.1.16 (4/20/2012)

  • Removed emptyToBottom option. It has been replaced with the emptyTo option.

  • Added emptyTo option:

    • Setting it to top will always sort all empty table cells to the top of the table.
    • bottom will always sort all empty cells to the bottom of the table.
    • none or zero will treat empty cells as if their value was zero.
    • Individual columns can be modified by adding the following, set in order of priority:
      • metadata class="{ empty: 'top' }". This requires the metadata plugin.
      • headers option headers : { 0 : { empty : 'top' } }.
      • header class name class="empty-top".
      • Overall emptyTo option.
    • Updated the sorting empty cells demo.
    • Fix for issue #48.
  • Add stringTo option in version 2.1.16. This options sets the string value for all of the numerical columns.

  • Modified the string option which is only applied to text within a numerical column; setting the value to:

    • max will treat any text in that column as a value greater than the max (more positive) value. Same as the max+ value, which was retained for backwards compatibility.
    • min will treat any text in that column as a value greater than the min (more negative) value. Same as the max- value.
    • top will always sort the text to the top of the column.
    • bottom will always sort the text to the bottom of the column.
    • none or zero will treat the text as if it has a value of zero.
    • Individual columns can be modified by adding the following, set in order of priority:
      • metadata class="{ string: 'top' }". This requires the metadata plugin.
      • headers option headers : { 0 : { string : 'top' } }.
      • header class name class="string-top".
      • Overall stringTo option.
    • Updated the text strings in numerical sort.
    • Fix for issue #50.
  • Fixed sticky header widget to now include multiple rows. Fix for issue #52.

Version 2.1.15 (4/18/2012)

  • Modified the emptyToBottom option:
    • Clarified that setting this option to null will treat empty cells as if they had a value of zero. Fix for issue #48.
    • Modified the script so that empty cells do not call their respective parser to keep the emptyAtBottom functionality working properly. Fix for issue #49.

Version 2.1.14 (4/17/2012)

  • Updated "shortDate" parser to include the time, if provided. I've also updated the Changing the date format demo with a few times.

Version 2.1.13 (4/17/2012)

Version 2.1.12 (4/16/2012)

  • Modified digit parser to assume numbers wrapped in parenthesis are negative numbers.
  • Updated "digit" parser to remove extraneous characters before parsing. This change makes the "digit" parser essentially work the same as the "currency" parser.
  • Updated some regex to increase parsing speed. See this jsperf.

Version 2.1.11 (4/12/2012)

  • Added emptyToBottom option which tells tablesorter how you want it to sort empty table cells. Enhancement from issue #46.
    • true - sort empty table cells to the bottom.
    • false - sort empty table cells to the top.
    • null - sort empty table cells as if the cell has the lowest value (less than "a" and "0").
  • Moved change log from a text file in the repository into the repository wiki pages.

Version 2.1.10 (4/2/2012)

  • Widget data should now save multiple tables on a single page properly. Fix for issue #41.

Version 2.1.9 (3/31/2012)

  • Empty cells in a numerical column should now sort properly.
  • Setting an initial sortList should now set the header sort correctly; so, clicking on the header will properly change the sort direction. Fix for issue #43.

Version 2.1.8 (3/27/2012)

  • Modified blue & green themes by lowering css specificity. The arrows weren't being applied to the header.
  • Updated Sticky Header widget demo page to include a tablesorter theme switcher.

Version 2.1.7 (3/26/2012)

  • Changed default css options to use more unique names:
    • cssHeader is now "tablesorter-header"
    • cssAsc is now "tablesorter-headerSortUp"
    • cssDesc is now "tablesorter-headerSortDown"
    • Updated blue & green styles to use the appropriate names.
    • Left the original css definitions to keep the styles backward compatible.
  • Table header cell content wrapper modification:
    • Previously the content was wrapped with a span, now wrapped with a div
    • Content wrapping div now as the class name of tablesorter-header-inner applied to it.
  • Various widget fixes:
    • The $.tablesorter.storage code now loads saved variables before updating. Fix for issue #41.
    • Reverted the "filter" widget code to work like it is supposed to. Fix for issue #40.
    • Modified the "stickHeaders" widget to now set the width of the content instead of the table cell. It seems to work better. Fix for issue #37
    • Fixed the "uitheme" widget code to update the sorting icon correctly.

Version 2.1.6 (3/22/2012)

  • Pager updates
    • Updated pager css. It wasn't targeting the pager block correctly.
    • Moved pager into the thead and/or tfoot in the pager ajax demo.
    • The pager plugin ajax method should now only target the header column text (not the pager) and first footer row when updating the header text.
  • Sticky Header widget & table css updated:
    • Modified styles to add a border instead of using the row background; border-spacing css set to zero.
    • Sticky header right edge should now align with the table.
    • Removed top margin from IE so it will stick to the top of the browser window.
  • Removed setTimeout functions. More details on why they were removed are described here.

Version 2.1.5 (3/20/2012)

  • The isoDate parser should now allow sorting of empty cells at the bottom. Fix for issue #38.

Version 2.1.4 (3/18/2012)

  • Modified widget scripts to not cause errors when older versions of jQuery are loaded.
  • Updated widget demos to include notes on minimum required jQuery verison.
  • Added $.tablesorter.version function which returns the current version number.

Version 2.1.3.1 (3/17/2012)

  • Merged in bug fixes contributed by Rozwell. Thanks!
  • Updated pager minified version, along with version numbers.

Version 2.1.3 (3/12/2012)

  • Added usNumberFormat option.

  • Set to true for U.S. number format: 1,234,567.89

  • Set to false for German 1.234.567,89 or French 1 234 567,89 formats.'

  • Fix for issue #34 and issue # 31.

  • Changed pager plugin ajax functions & demo

  • The ajaxProcessing function now must now return two or three pieces of information: [ total, rows, headers ]

  • total is the total number of rows in the database.

  • rows is an array of table rows with an array of table cells in each row.

  • headers is an array of header cell text (optional).

     ```javascript
     // process ajax so that the following information is returned:
     // [ total_rows (number), rows (array of arrays), headers (array; optional) ]
     // example:
     [
       // total # rows contained in the database
       100,
       // row data: array of arrays; each internal array has the table data
       [
         [ "row1cell1", "row1cell2", ... "row1cellN" ],
         [ "row2cell1", "row2cell2", ... "row2cellN" ],
          ...
         [ "rowNcell1", "rowNcell2", ... "rowNcellN" ]
       ],
       // header text (optional)
       [ "Header1", "Header2", ... "HeaderN" ]
     ]
     ```
    
  • Modified pager plugin ajax demo to hopefully make the data processing a bit more clear by changing data inside of the City#.json files to rows.

  • The demo json data should now render the unicode characters properly. Switched the files to the proper utf-8 encoding.

  • When no data is returned, the table will now:

    • Insert a row into the header showing the ajax error. If a row is inserted into the tbody, clicking on the header would cause a parser error.
    • Disable the pager so the pager counter won't show zero total rows.
    • Fix for issue dicussed within issue #31.

Version 2.1.2 (3/11/2012)

  • Added table and cellIndex variables to the textExtraction function to allow using a more general function for text extraction.
  • Empty cells will no longer skip the parser allowing extracting data attributes.
  • This was only an issue on table cells with no text.
  • Added a demo to the demos wiki page whichs allows dynamic sorting of checkboxes.

Version 2.1.1 (3/8/2012)

  • Renamed filter_fromStart to filter_startsWith.
  • Fixed an issue with sortRestart not working properly.
    • In turn, sortReset, lockOrder and sortInitialOrder were modified with this change and were made sure to all work properly.
    • The sortInitialOrder will work in either the main options or specifically within the headers option when a particular column needs a different initial sort order.
    • Added a sortReset/sortRestart demo.
    • Resolves issue #30.
  • Updated pager plugin to better work with the sticky header widget.

Version 2.1 (3/7/2012)

  • Added selectorRemove option

  • Any table row with this css class will be removed from the table prior to updating the table contents.

  • The reason this was added was in case a widget or some other script adds rows to the table for styling, or something else. If a table update is triggered ($(table).trigger('update');), all rows in the table will be included in the update.

  • The writing custom widgets demo has been updated to include this class name.

  • The pager plugin update also uses this to remove the row added by the new fixedHeight option.

  • It's default value is tr.remove-me, so it can be modified to remove more than just rows.

  • Fixed a bug that broke the plugin if you set sorter: true in the header options.

  • Pager plugin update

    • Ajax

      • The pager plugin will now interact with a database via JSON. See demo here.

      • Added ajaxUrl option which contains the variables {page} and {size} which will be replaced by the plugin to obtain that data.

        ajaxUrl : "http:/mydatabase.com?page={page}&size={size}"
      • Another option named ajaxProcessing was included to process the data before returning it to the pager plugin. Basically the JSON needs to contain the data to match the example below. An additional required variable is the total number of records or rows needs to be returned.

        // process ajax so that the data object is returned along with the total number of rows
        // example: { "data" : [{ "ID": 1, "Name": "Foo", "Last": "Bar" }], "total_rows" : 100 }
        ajaxProcessing: function(ajax){
          if (ajax && ajax.hasOwnProperty('data')) {
            // return [ "data", "total_rows" ];
            return [ ajax.data, ajax.total_rows ];
          }
        }
      • I tried to make the plugin interact with a database as flexible as possible, but I'm sure I haven't covered every situation. So any and all feedback is welcome!

      • Also, much thanks to kachar for the enhancement request and willingness to help test it!

    • Removed positionFixed and offset options.

    • Added fixedHeight option which replaces the positionFixed and offset options by maintaining the height of the table no matter how few rows are showing. During testing, it displayed some odd behaviour after adding or deleting rows, but it should have been fixed... just please keep an eye out ;).

    • The pager now adds all of its options to the table configuration options within an object named "pager". Basically what this means is that instead of add all of the pager options to be mixed in with the tablesorter options, the pager options have been isolated and can be found by typing this into the browser console: $('table')[0].config.pager.

  • Storage function added named $.tablesorter.storage for use in widgets

  • It is used by various widgets to save data to either local storage (if available) or cookies.

  • This function needs to use JSON.stringify() which is not supported by IE7. If you need to support IE7, then include this library: JSON-js.

  • Use the function with your own custom widgets as follows:

     ```javascript
     // *** Save data (JSON format only) ***
     // val must be valid JSON... use http://jsonlint.com/ to ensure it is valid
     var val = { "mywidget" : "data1" }; // valid JSON uses double quotes
     // $.tablesorter.storage(table, key, val);
     $.tablesorter.storage(table, 'tablesorter-mywidget', val);
    
     // *** Get data: $.tablesorter.storage(table, key); ***
     v = $.tablesorter.storage(table, 'tablesorter-mywidget');
     // val may be empty, so also check for your data
     val = (v && v.hasOwnProperty('mywidget')) ? v.mywidget : '';
     alert(val); // "data1" if saved, or "" if not
     ```
    
  • Added an option named widgetOptions:

  • This is a move to store all widget specific options in one place so as not to polute the main table options.

  • All current widgets have been modified to use this new option.

  • Only one widget option, widgetZebra will be retained for backwards compatibility with the original plugin.

  • More details for each widget are explained below.

  • Zebra widget:

  • Added zebra options to the new widgetOptions.

     ```javascript
     widgetOptions : {
         zebra : [ "even", "odd" ]
     }
     ```
    
  • This replaces widgetZebra: { css: [ "even", "odd" ] }, but if the widgetZebra option exists, it will over-ride this newer widgetOptions.zebra option in order to maintain backwards compatibility.

  • UI Theme widget:

  • Changed css class of div wrapping the contents of each header cell from "inner" to "tablesorter-inner".

  • Added "ui-state-default" to the table head columns. Thanks to Raigen for sharing the code!

  • Moved widgetUitheme option into the new widgetOptions.

     ```javascript
     widgetOptions : {
         // adding zebra striping, using content and default styles - the ui css removes the background from default
         // even and odd class names included for this demo to allow switching themes
         zebra   : ["ui-widget-content even", "ui-state-default odd"],
    
         // change default uitheme icons - find the full list of icons here: http://jqueryui.com/themeroller/ (hover over them for their name)
         // default icons: ["ui-icon-arrowthick-2-n-s", "ui-icon-arrowthick-1-s", "ui-icon-arrowthick-1-n"]
         // ["up/down arrow (cssHeaders/unsorted)", "down arrow (cssDesc/descending)", "up arrow (cssAsc/ascending)" ]
         uitheme : ["ui-icon-carat-2-n-s", "ui-icon-carat-1-s", "ui-icon-carat-1-n"]
     }
     ```
    
  • Filter widget changes:

  • Added a new filter widget specific option widgetOptions.filter_fromStart which makes the filter only work from the first letter.

  • Added a widgetOptions.filter_cssFilter option which now contains the class name added to the filter row and each input within it. Previously the class name used was "filters" for the row and "filter" for the input, now both are "tablesorter-filter". Thanks to cr125rider for sharing a code fix!

  • Added css3 box sizing to allow a better fitting filter box. Thanks to thezoggy for sharing the code!

  • The css changes were also added to the blue, green and UI style sheets.

  • Updated the filter widget demo with the available options described above; this includes the widgetOptions.filter_childRows option which was previously undocumented, recently renamed.

  • Resizable Columns Widget changes:

  • The resized column width is now saved using the $.tablesorter.storage() function (optional)

  • If the storage function doesn't exist, the widget will still function, but just not save the column width.

  • Save Sort Widget changes:

  • Modified to now use the $.tablesorter.storage() function (required)

  • The storage function is required for this widget to work properly.

  • Previous saved data is not compatible with the changes made and will be ignored.

  • Updated all docs demos to use jQuery 1.7+.

Version 2.0.31 (2012-2-27)

  • Added sortRestart option:
    • When true, this option resets the sort direction so that clicking on an unsorted column will now sort in the sortInitialOrder direction.
    • Clicking on a single column to cancel a multi-sorted table may not initially sort as expected.
    • Requested by severa in issue #30. Thanks!
  • Made some sortReset fixes:
    • Columns widget will now clear it's styling when the sort has reset.
    • Added a demo.
  • Changed the filter widget inputs to be of a search type:
  • Currently only supported by webkit.
  • Requested by cr125rider in issue #29. Thanks!
  • Updated sortLocaleCompare documentation since it was explained incorrectly.
  • Did some general code cleanup and some optimization.

Version 2.0.30.1 (2012-2-20)

  • Modified the "filter" widget to disable the input window instead of setting it with display none. Now the input is disabled and a "disabled" class is applied to allow for further styling.

Version 2.0.30 (2012-2-20)

  • Fixed the total mess I just made with the addWidget init functionality... I need a vacation :P

Version 2.0.29 (2012-2-20)

  • Fixed a problem with the addWidget init function which apparently was always being called, even if you didn't want it! Fix for issue #28. Thanks to thezoggy for helping with troubleshooting!
  • Minor cleanup of sorting class names code.

Version 2.0.28.1 (2012-2-16)

  • Modified the plugin pager to ignore child rows. Fix for issue #27.

Version 2.0.28 (2012-2-1)

  • Added a new function to widgets called "init" which is called upon initialization, before any of the widgets are applied.
    • I added it to allow the "saveSort" widget to get the saved sort data (localStorage or cookie) before the initial sort was applied.

    • The "saveSort" widget is still compatible with the original tablesorter, but the original version will call all of the widgets twice on initialization, if using the "saveSort" widget.

    • New add widget format is as follows:

      ```javascript
      $.tablesorter.addWidget({
        id: 'myWidget',
        init: function(table, allWidgets, thisWidget){
          // widget initialization code - this is only run ONCE
          // but in this example I call the format function because
          // I want to keep it backwards compatible with the original tablesorter
          thisWidget.format(table, true);
        },
        format: function(table, initFlag) {
          // widget code to apply to the table AFTER EACH SORT
          // the initFlag is true when format is called for the first time, but
          // only if it is called from the init function
        }
      });
      ```
      

Version 2.0.27 (2012-1-31)

  • Added sortReset option
    • Setting this option to true, allows you to click on the header a third time to clear the sort
    • Clearing the sort DOES NOT return the table to it's initial unsorted state.
  • Added saveSort widget
    • This widget will save the last sort to local storage, and will fallback to cookies.
    • The widget does use the JSON.stringify function which is not fully supported (IE7), so if you plan to support it and use this widget, please include this JSON library.
  • Fixed pager page size not sticking. Fix for issue #24.

Version 2.0.26 (2012-1-30)

  • Widgets should no longer be applied twice when an initial sort direction is added. Fix for issue #21.
  • Modified Green theme:
    • The Green theme sort direction icon is now applied to only the first span it encounters inside the header. The UI theme adds a second span for it's icon.
    • Essentially to fix this demo which allows switching between all of the themes.
  • Modified the UI theme to now add a div that wraps all of the header cell content to allow positioning of the sort direction icon.

Version 2.0.25.2 (2012-1-27)

  • Changed Blue theme to vertically align arrows. Fix for issue #12.
  • Fixed sticky header widget so varing width columns now update when the pager plugin changes pages. Thanks to locationRoura for reporting this issue.

Version 2.0.25.1 (2011-12-15)

  • Fixed disabled column style for the ui theme widget. Thanks to bbbco for the fix in issue #17.

Version 2.0.25 (2011-12-14)

  • The ui theme and sticky header widgets now work together and update the arrow direction. Fix for issue #15.
  • Empty cells with only a tab or space will now sort at the bottom. Thanks to pursual for the fix for issue #16.

Version 2.0.24 (2011-12-12)

  • Modified empty cell sorting to always sort at the bottom. Fix for issue #14.
  • Updated the sticky header widget to line up properly with the UI theme. Fix for issue #13.

Version 2.0.23.5 (2011-12-6)

  • Updated the sticky header widget again to not interfere with the filter widget. Fix for issue #10.

Version 2.0.23.4 (2011-12-6)

  • Updated the sticky header widget to reposition the sticky header when scrolling left. Fix for issue #9.

Version 2.0.23.3 (2011-11-7)

  • Updated the filter widget:
    • Changed filter input from visibility hidden to display none. Fix/enhancement from issue #7.
    • Modified the widget to better work with child rows. Added the widgetFilterChildRows option. Fix for issue #8.
    • When widgetFilterChildRows is true, all child row content is included in the row filtering; if false, the child row content is ignored.
  • Added tableClass to the documents. Apparently I forgot to add it before.
  • Added a note to the filter demo bringing up issue #6.
  • Miscellaneous updates to the documents.

Version 2.0.23.2 (2011-10-28)

  • Fixed pager size & total pages not being retained after destroying, then restoring the pager. Thanks to crush123 for reporting the problem!

Version 2.0.23.1 (2011-10-26)

  • Fixed the pager plugin to prevent errors when initialized on an empty table. Fix for issue #5.
  • Added a Resizable Column widget
    • At this time, this widget allows resizing the column widths from the header.
    • The column widths are not saved, but if I did consider saving the widths to local storage. I just didn't get around to doing it.
    • Demo page added.
  • Reorganized the next demo links, located at the bottom of every demo page, to match the order on the main document page.

Version 2.0.23 (2011-10-18)

  • Changed the dateFormat option:
  • The settings are now "mmddyyyy", "ddmmyyyy", and "yyyymmdd".
  • Changed the date separator to include any of the following: slash, dash, period, comma, space(s) or tab.
  • The date format parser will only work with a four digit year.
  • Added a demo page.
  • The parser format function is now passed the cell content, table, cell node and cell index: format(s, table, cell, cellIndex){}.

Version 2.0.22.1 (2011-10-15)

  • Updated the stickyHeaders widget
    • Sticky headers will now resize with the browser window

    • Updated blue and green themes to work better with sticky headers.

    • If using the uitheme widget, make sure the 'uitheme' widget is applied before (left of) the 'stickyHeaders' widget, as follows:

      ```javascript
      widgets: ['zebra', 'uitheme', 'stickyHeaders']
      ```
      

Version 2.0.22 (2011-10-13)

  • Updated the pager plugin:
    • Fixed a problem that occurred when removeRows is set to false - fix for issue #4.

    • Added "disable.pager" and "enable.pager" methods to the pager. These are useful if you want to delete a table row with the pager applied.

      ```javascript
      // Delete a row
      // this function targets a button with a "remove" class name inside a table row
      // *************
      // Use delegate or live because `removeRows` is set to `true` in the demo - hidden rows don't exist
      $('table').delegate('button.remove', 'click' ,function(){
        var t = $('table');
        // disabling the pager will restore all table rows
        t.trigger('disable.pager');
        // remove the chosen row
        $(this).closest('tr').remove();
        // restore pager
        t.trigger('enable.pager');
      });
      ```
      
    • Fixed the positionFixed option (which positions the pager below the table) to now include the offset option value.

    • Fixed the pager arrow buttons so that destroying and enabling the pager multiple times doesn't multiply the number of pages changed.

    • Updated the pager demo page to allow deleting rows.

    • General cleanup and added lots of comments in the plugin and demo page on what each pager option does.

  • Made one minor change to the tablesorter plugin to accomidate the pager plugin using the removeRows option.

Version 2.0.21.1 (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 2.0.20.1 (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 2.0.18.1 (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 tablesorter.com) 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 the cells in the table.

    • 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:

      $("table").tablesorter({
          textExtraction: {
              0: function(node) { return $(node).find(selector1).text(); },
              1: function(node) { return $(node).find(selector2).text(); },
              // etc
          }
      });
    • Updated the Dealing with markup inside cells demo.

    • Thanks to Eugene Ivakhiv for reporting this issue to my attention in my blog.

Version 2.0.11 (2011-08-04)

  • Added the ability to set a column parser using a class name
    • When setting the parser, start the class name with "sorter-" followed by the parser name, e.g. "sorter-text" or "sorter-digit"
    • The column can be disabled by setting the class name to "sorter-false"
    • Demo page included.
    • Custom parsers can also be used - see the updated writing custom parsers demo.

Version 2.0.10 (2011-07-31)

  • Modified the numeric sort with a new method to deal with non-numeric content:
    • When sorting columns with numeric values, by default any non-numeric or empty cells are treated as if they have a zero value. This puts the text between negative and positive values in a column.
    • Adding string : "max+" to the headers option will now treat any non-numeric table cells as if they have a maxiumum positive value (a value greater than the maximum positive value in the column).
    • Adding string : "max-" to the headers option will now treat any non-numeric table cells as if they have a maxiumum negative value (a value greater than the maximum negative value in the column).
    • See the "Dealing with text strings in numeric sorts" demo for a better visual example.
  • Changed UI theme widget code to use "ui-widget-header" instead of "ui-widget-default" to better match the themes.
  • Renamed changelog.markdown to changelog.txt to prevent downloading when clicking on the link

Version 2.0.9 (2011-07-27)

  • Added a jQuery UI theme and widget example. To apply the jQuery UI theme:
    • Include any jQuery UI theme on your page.
    • Add the base tablesorter ui theme (located in css/ui directory)
    • Add the jQuery UI theme widget code found on this example page. This demo page includes the UI theme switcher.
  • Added a header index to the onRenderHeader function to make it easier to target specific header cells for modification. See the render header example for an example.
  • Pager plugin updates:
    • Removed the separator option and added an output option which allows you to completely customize the output string.
    • In the output string, include any of the following variables:
      • {page} is replaced with the current page number.
      • {totalPages} is replaced with the total number of pages.
      • {startRow} is replaced with the number of the visible start row of the pager.
      • {endRow} is replaced with the number of the visible end row of the pager.
      • {totalRows} is replaced with the total number of rows.
    • The cssPageDisplay option can now target any element; in previous versions, this element was an input of type text.
    • Added a pagerArrows and cssDisabled options:
      • When pagerArrows is true, the first and previous pager arrows have the css class name contained in the cssDisabled option applied when the first row is visible.
      • The next and last pager arrows will be have the cssDisabled class applied when the last row is visible.
      • Additionally, if the number of table rows is less than the pager size, the pager will get the cssDisabled class name applied.
      • If false (the default setting), the pager arrows class names will not change.
      • Please see the updated pager demo to see this working.

Version 2.0.8 (2011-07-21)

  • Fixed parsers for currency and digits to work with number values separated by commas. Thanks to Josh Renaud for the information!
  • Fixed "lockedOrder" header option and added documentation and an example on how to use it.
  • Made the sort order "desc" only trigger off of the first letter, so any word/abbreviation starting with "d" will set the descending sort order, all other letters will set the order to ascending (shhh, because I'm a bad speller :P)
  • Modified the "sortInitialOrder" option so it can also be set in the headers option.

Version 2.0.7 (2011-07-17)

  • Added "pagerChange" and "pagerComplete" events to the pager plugin which trigger on the table. See the pager demo for an example on how to bind to them.
  • Added the "sortAppend" since the option was there, but apparently the code wasn't.
  • Added missing documentation from my blog post
  • This included a few new example pages: apply widgets, child rows, render header, sort append and zebra widget.
  • Added a methods and events table.
  • Fixed the minified version. Apparently sorting functions called by the eval were removed by the Google Closure Compiler. Resolved by using "Whitespace only" optimization.
  • Fixed syntax highlighting; updated Chili.

Version 2.0.6 (2011-06-22)

  • Forked original files and docs from tablesorter.com to GitHub.
  • Replaced alphabetical sort with an alphanumeric sort
  • This "slower" sort can be disabled by setting the sortLocaleCompare option to true
  • The sortLocaleCompare option's default was changed to false.
  • Added a very basic demo.
  • Added tableClass option
  • The value is "tablesorter" by default and should no longer be required in the default markup.
  • This class is applied to the table in the script and should match the css styling.
  • Each header cell now has its content wrapped with a span.
  • This allows applying the direction icon to the span instead of the entire cell.
  • Although, this might just be extra markup with the advent of multiple background images and gradient backgrounds available in CSS3.
  • Reformatted the code to make jSLint "happier".
  • General
  • Added "cssChildRow" option - attach a child row to its parent.
  • Added "sortLocaleCompare" to use the native String.localeCampare method during text sort.
  • Added "onRenderHeader" function that is called when classes are added to the header cells.
  • Added "selectorHeaders" option to target the the header cells.
  • Changed multisort function

Version 2.0.3 (2008-03-17)

  • Bug fixes - Missing semicolon, broke the minified version.

Version 2.0.2 (2008-03-14)

  • General

  • Added support for the new metadata plugin.

  • Added support for jQuery 1.2.3.

  • Added support for decimal numbers and negative and positive digits.

  • Updated documenation and website with new examples.

  • Removed packed version.

  • Bug fixes

  • Sort force (Thanks to David Lynch).

Version 2.0.1 (2007-09-17)

  • General

  • Removed the need for Dimensions plugin when using the pagnation plugin thanks to offset being included in the jQuery 1.2 core.

  • Added support for jQuery 1.2.

  • Added new Minified version of tablesorter.

  • Updated documenation and website with new examples.

  • Bug fixes

  • If row values are identical the original order is kept (Thanks to David hull).

  • If thead includes a table $('tbody:first', table) breaks (Thanks to David Hull).

  • Speed improvements:

  • appendToTable, setting innerHTML to "" before appending new content to table body.

  • zebra widget. (Thanks to James Dempster).

Clone this wiki locally