I have a table which is dynamically populated from FullCalendar
. The problem is that FullCalendar
does not care about its original order.
The table looks like this:
<table id="caltbl"> <thead> <tr> <th> </th> <th> Date </th> <th> hours </th> ... </tr> </thead> <tbody> <tr> <td class="sortnr">1</td> <td></td> ... </tr> <tr> <td class="sortnr">3</td> <td></td> ... </tr> <tr> <td class="sortnr">2</td> <td></td> ... </tr> <tr> <td class="sortnr">4</td> <td></td> ... </tr> </tbody> </table>
The first of each row contains the number on which the table should be sorted.
I had this code to sort it:
var rows = $('#caltbl > tbody').children('tr').detach(); for (var counter = 1; counter<=rows.length; counter++) { $(rows).each(function(index) { if ($(this).find(".sortnr").text()==counter){ $('#caltbl > tbody:last').append($(this)); } }); }
This works fine in Firefox but causes me a major headache in Internet Explorer because there are more than 500 items and it hangs. I could add a setTimeout
but that would not fix the real problem. The sorting is slow. What is a faster way to sort this?
Instead of having to start from the <table>
html, as I said it gets populated dynamically so I have an Array
which contains the html. 1 item per <tr>
(unsorted)
Sort Table by Clicking the Headers. Click the headers to sort the table. Click "Name" to sort by names, and "Country" to sort by country. The first time you click, the sorting direction is ascending (A to Z).
Here is an example code below, all you need to do is match the ID on the table tag with the ID mentioned in the JS, add sortTable to each column TD you want sortable (make sure you use correct column depth starting at 0) and make sure you code your tables properly, ie. with a thead and tbody.
add a click event to all header ( th ) cells... for the current table , find all rows (except the first)... sort the rows, based on the value of the clicked column... insert the rows back into the table, in the new order.
Adding the "sortable" class to a <table> element provides support for sorting by column value. Clicking the column headers will sort the table rows by that column's value. Tables must use <thead> and <th> tags for sortable functionality to work. The <th> tag defines a header cell in an HTML table.
Fiddle: http://jsfiddle.net/qNwDe/
I've written an efficient, cross-browser method to sort the rows in your table. Multiple JQuery selectors in double loops are causing serious performance issues (as you've noticed), hence I've get rid of JQuery.
An additional advantage of my function is that it doesn't mind missing index numbers. I'm currently referring to the first cell of each row, rather than getting the element by class name. If you want to refer by classname, I will alter my function:
function sortTable(){ var tbl = document.getElementById("caltbl").tBodies[0]; var store = []; for(var i=0, len=tbl.rows.length; i<len; i++){ var row = tbl.rows[i]; var sortnr = parseFloat(row.cells[0].textContent || row.cells[0].innerText); if(!isNaN(sortnr)) store.push([sortnr, row]); } store.sort(function(x,y){ return x[0] - y[0]; }); for(var i=0, len=store.length; i<len; i++){ tbl.appendChild(store[i][1]); } store = null; }
Call sortTable()
whenever you want to sort the table.
Try an approach like this: http://jsfiddle.net/qh6JE/
var rows = $('#caltbl > tbody').children('tr').get(); // creates a JS array of DOM elements rows.sort(function(a, b) { // use a custom sort function var anum = parseInt($(a).find(".sortnr").text(), 10); var bnum = parseInt($(b).find(".sortnr").text(), 10); return anum-bnum; }); for (var i = 0; i < rows.length; i++) { // .append() will move them for you $('#caltbl > tbody').append(rows[i]); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With