A JavaScript plugin for making HTML tables sortable, by clicking column headers, or calling a .sort() method.
- Vanilla JavaScript, no dependencies
- Supports modern browsers (see browserlist.rc)
- Pretty good accessibility (with heavy inspiration from Adrian Roselli)
- Will make a table sortable by all columns – there is no way to mark some columns as unsortable
- Sorting will break if your table has colspans or rowspans
- Table cannot be sorted by more than one column at a time
- Does not support IE11 or below
A selection of versions of SortMyTable are included in the dist directory:
- sortmytable.esm.js – ESM (ES6) module
- sortmytable.esm.min.js – minified ESM (ES6) module
- sortmytable.js – an IIFE for non-ESM workflows
- sortmytable.min.js – minified IIFE
If loading SortMyTable as an ESM (ES6) module, you need to either import it into an existing module:
import { SortMyTable } from './path/to/sortmytable.esm.js'
Or load it directly in the page, with type="module":
<script src="path/to/sortmytable.esm.min.js" type="module"></script>
You will then be able to call new SortMyTable(), passing a CSS selector, HTMLElement, or NodeList, eg:
var example1 = new SortMyTable( '.table' )
var example2 = new SortMyTable( document.querySelector('#table') )
var example3 = new SortMyTable( document.querySelectorAll('.table') )
And if loading SortMyTable as an IIFE…
<script src="path/to/sortmytable.min.js"></script>
…You’ll find the SortMyTable class inside SortMyTable.SortMyTable:
var example = new SortMyTable.SortMyTable( '.table' )
Note that SortMyTable does not include CSS styles – it’s up to you to decide how to style the elements that SortMyTable inserts into your tables. See demo/demo.css for an example of how we’ve integrated SortMyTable alongside Bootstrap.
Check the defaults object in the SortMyTable class for a list of functions you can override each time you create a SortMyTable instance. For example…
If you wanted to highlight all of the cells in the sorted column using CSS and a <colgroup>, you could provide a custom onSort callback which toggles a class on the relevant <colgroup> column:
<table class="js-sortmytable">
<colgroup>
<col>
<col>
…
</colgroup>
…
</table>
<style>
.js-sortmytable colgroup col.sorted { background: #fcc; }
</style>
<script>
new SortMyTable('.js-sortmytable', {
onSort: function(tableElement, columnIndex, direction){
tableElement.querySelector('colgroup .selected').removeClass('selected');
tableElement.querySelector('colgroup').children[columnIndex].addClass('selected');
}
});
</script>
SortMyTable adds an SVG containing up/down arrows to the header cell buttons, to act as both an indicator that the columns are sortable and a representation of the currently sort direction. Note that, to get these working, you’ll need to write your own styles (see demo/demo.css for an example).
If you want your arrows to look different, you could also supply your own custom formatHeaderButton function that inserts a different SVG—or something else entirely!—in the buttons.
Or, you could use formatHeaderButton to add an aria-describedby or aria-label attribute to the buttons, announcing the presence of the sortable column headers to non-visual users. (See Adrian Roselli’s excellent article on sortable table columns for a few different ways you could do this.)
package.json includes a static file server and test script. Install and run it with:
npm install
npm run test
Then visit http://localhost:8080 to run the Jasmine tests in your browser.
Alternatively, you can poke around in the demo, at the same URL, with:
npm install
npm run start
JavaScript in this project follows the JS Standard. You can lint your JavaScript with:
npm install
npm run lint
And you can attempt to automatically fix errors with:
npm intall
npm run lint -- --fix
You can re-build to the dist directory with:
npm install
npm run build
Remember to update the version number in package.json before you build, if you want to release a new "version" of the plugin.