<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us"> <head> <title>jQuery plugin: Tablesorter 2.0 - Writing custom widgets</title> <link rel="stylesheet" href="css/jq.css" type="text/css" media="print, projection, screen" /> <link rel="stylesheet" href="../themes/blue/style.css" type="text/css" media="print, projection, screen" /> <script type="text/javascript" src="../jquery-latest.js"></script> <script type="text/javascript" src="../jquery.tablesorter.js"></script> <script type="text/javascript" src="../addons/pager/jquery.tablesorter.pager.js"></script> <script type="text/javascript" src="js/chili/chili-1.8b.js"></script> <script type="text/javascript" src="js/docs.js"></script> <script type="text/javascript"> $(function() { // add new widget called repeatHeaders $.tablesorter.addWidget({ // give the widget a id id: "repeatHeaders", // format is called when the on init and when a sorting has finished format: function(table) { // cache and collect all TH headers if(!this.headers) { var h = this.headers = []; $("thead th",table).each(function() { h.push( "<th>" + $(this).text() + "</th>" ); }); } // remove appended headers by classname. $("tr.repated-header",table).remove(); // loop all tr elements and insert a copy of the "headers" for(var i=0; i < table.tBodies[0].rows.length; i++) { // insert a copy of the table head every 10th row if((i%5) == 4) { $("tbody tr:eq(" + i + ")",table).before( $("<tr></tr>").addClass("repated-header").html(this.headers.join("")) ); } } } }); // call the tablesorter plugin and assign widgets with id "zebra" (Default widget in the core) and the newly created "repeatHeaders" $("table").tablesorter({ widgets: ['zebra','repeatHeaders'] }); }); </script> </head> <body> <div id="banner"> <h1>table<em>sorter</em></h1> <h2>Writing custom widgets</h2> <h3>Flexible client-side table sorting</h3> <a href="index.html">Back to documentation</a> </div> <div id="main"> <h1>Javascript</h1> <pre class="javascript"> // add new widget called repeatHeaders $.tablesorter.addWidget({ // give the widget a id id: "repeatHeaders", // format is called when the on init and when a sorting has finished format: function(table) { // cache and collect all TH headers if(!this.headers) { var h = this.headers = []; $("thead th",table).each(function() { h.push( "<th>" + $(this).text() + "</th>" ); }); } // remove appended headers by classname. $("tr.repated-header",table).remove(); // loop all tr elements and insert a copy of the "headers" for(var i=0; i < table.tBodies[0].rows.length; i++) { // insert a copy of the table head every 10th row if((i%5) == 4) { $("tbody tr:eq(" + i + ")",table).before( $("<tr></tr>").html(this.headers.join("")) ); } } } }); // call the tablesorter plugin and assign widgets with id "zebra" (Default widget in the core) and the newly created "repeatHeaders" $("table").tablesorter({ widgets: ['zebra','repeatHeaders'] }); </pre> <h1>Demo</h1> <table cellspacing="1" class="tablesorter"> <thead> <tr> <th>Name</th> <th>Major</th> <th>Sex</th> <th>English</th> <th>Japanese</th> <th>Calculus</th> <th>Geometry</th> </tr> </thead> <tfoot> <tr> <th>Name</th> <th>Major</th> <th>Sex</th> <th>English</th> <th>Japanese</th> <th>Calculus</th> <th>Geometry</th> </tr> </tfoot> <tbody> <tr> <td>Student01</td> <td>Languages</td> <td>male</td> <td>80</td> <td>70</td> <td>75</td> <td>80</td> </tr> <tr> <td>Student02</td> <td>Mathematics</td> <td>male</td> <td>90</td> <td>88</td> <td>100</td> <td>90</td> </tr> <tr> <td>Student03</td> <td>Languages</td> <td>female</td> <td>85</td> <td>95</td> <td>80</td> <td>85</td> </tr> <tr> <td>Student04</td> <td>Languages</td> <td>male</td> <td>60</td> <td>55</td> <td>100</td> <td>100</td> </tr> <tr> <td>Student05</td> <td>Languages</td> <td>female</td> <td>68</td> <td>80</td> <td>95</td> <td>80</td> </tr> <tr> <td>Student06</td> <td>Mathematics</td> <td>male</td> <td>100</td> <td>99</td> <td>100</td> <td>90</td> </tr> <tr> <td>Student07</td> <td>Mathematics</td> <td>male</td> <td>85</td> <td>68</td> <td>90</td> <td>90</td> </tr> <tr> <td>Student08</td> <td>Languages</td> <td>male</td> <td>100</td> <td>90</td> <td>90</td> <td>85</td> </tr> <tr> <td>Student09</td> <td>Mathematics</td> <td>male</td> <td>80</td> <td>50</td> <td>65</td> <td>75</td> </tr> <tr> <td>Student10</td> <td>Languages</td> <td>male</td> <td>85</td> <td>100</td> <td>100</td> <td>90</td> </tr> <tr> <td>Student11</td> <td>Languages</td> <td>male</td> <td>86</td> <td>85</td> <td>100</td> <td>100</td> </tr> <tr> <td>Student12</td> <td>Mathematics</td> <td>female</td> <td>100</td> <td>75</td> <td>70</td> <td>85</td> </tr> <tr> <td>Student13</td> <td>Languages</td> <td>female</td> <td>100</td> <td>80</td> <td>100</td> <td>90</td> </tr> <tr> <td>Student14</td> <td>Languages</td> <td>female</td> <td>50</td> <td>45</td> <td>55</td> <td>90</td> </tr> <tr> <td>Student15</td> <td>Languages</td> <td>male</td> <td>95</td> <td>35</td> <td>100</td> <td>90</td> </tr> <tr> <td>Student16</td> <td>Languages</td> <td>female</td> <td>100</td> <td>50</td> <td>30</td> <td>70</td> </tr> <tr> <td>Student17</td> <td>Languages</td> <td>female</td> <td>80</td> <td>100</td> <td>55</td> <td>65</td> </tr> <tr> <td>Student18</td> <td>Mathematics</td> <td>male</td> <td>30</td> <td>49</td> <td>55</td> <td>75</td> </tr> <tr> <td>Student19</td> <td>Languages</td> <td>male</td> <td>68</td> <td>90</td> <td>88</td> <td>70</td> </tr> <tr> <td>Student20</td> <td>Mathematics</td> <td>male</td> <td>40</td> <td>45</td> <td>40</td> <td>80</td> </tr> <tr> <td>Student21</td> <td>Languages</td> <td>male</td> <td>50</td> <td>45</td> <td>100</td> <td>100</td> </tr> <tr> <td>Student22</td> <td>Mathematics</td> <td>male</td> <td>100</td> <td>99</td> <td>100</td> <td>90</td> </tr> <tr> <td>Student23</td> <td>Languages</td> <td>female</td> <td>85</td> <td>80</td> <td>80</td> <td>80</td> </tr> </tbody> </table> </div> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript"> _uacct = "UA-2189649-2"; urchinTracker(); </script> </body> </html>