Create and edit an HTML5 table without the use of a library. Uses HTML5's contenteditable and minimal JavaScript.
A Pen by MinChanSike on CodePen.
Create and edit an HTML5 table without the use of a library. Uses HTML5's contenteditable and minimal JavaScript.
A Pen by MinChanSike on CodePen.
| <div class="container"> | |
| <h1>HTML5 Editable Table</h1> | |
| <p>Through the powers of <strong>contenteditable</strong> and some simple jQuery you can easily create a custom editable table. No need for a robust JavaScript library anymore these days.</p> | |
| <ul> | |
| <li>An editable table that exports a hash array. Dynamically compiles rows from headers</li> | |
| <li>Simple / powerful features such as add row, remove row, move row up/down.</li> | |
| </ul> | |
| <div id="table" class="table-editable"> | |
| <span class="table-add glyphicon glyphicon-plus"></span> | |
| <table class="table"> | |
| <tr> | |
| <th>Name</th> | |
| <th>Value</th> | |
| <th></th> | |
| <th></th> | |
| </tr> | |
| <tr> | |
| <td contenteditable="true">Stir Fry</td> | |
| <td contenteditable="true">stir-fry</td> | |
| <td> | |
| <span class="table-remove glyphicon glyphicon-remove"></span> | |
| </td> | |
| <td> | |
| <span class="table-up glyphicon glyphicon-arrow-up"></span> | |
| <span class="table-down glyphicon glyphicon-arrow-down"></span> | |
| </td> | |
| </tr> | |
| <!-- This is our clonable table line --> | |
| <tr class="hide"> | |
| <td contenteditable="true">Untitled</td> | |
| <td contenteditable="true">undefined</td> | |
| <td> | |
| <span class="table-remove glyphicon glyphicon-remove"></span> | |
| </td> | |
| <td> | |
| <span class="table-up glyphicon glyphicon-arrow-up"></span> | |
| <span class="table-down glyphicon glyphicon-arrow-down"></span> | |
| </td> | |
| </tr> | |
| </table> | |
| </div> | |
| <button id="export-btn" class="btn btn-primary">Export Data</button> | |
| <p id="export"></p> | |
| </div> |
| var $TABLE = $('#table'); | |
| var $BTN = $('#export-btn'); | |
| var $EXPORT = $('#export'); | |
| $('.table-add').click(function () { | |
| var $clone = $TABLE.find('tr.hide').clone(true).removeClass('hide table-line'); | |
| $TABLE.find('table').append($clone); | |
| }); | |
| $('.table-remove').click(function () { | |
| $(this).parents('tr').detach(); | |
| }); | |
| $('.table-up').click(function () { | |
| var $row = $(this).parents('tr'); | |
| if ($row.index() === 1) return; // Don't go above the header | |
| $row.prev().before($row.get(0)); | |
| }); | |
| $('.table-down').click(function () { | |
| var $row = $(this).parents('tr'); | |
| $row.next().after($row.get(0)); | |
| }); | |
| // A few jQuery helpers for exporting only | |
| jQuery.fn.pop = [].pop; | |
| jQuery.fn.shift = [].shift; | |
| $BTN.click(function () { | |
| var $rows = $TABLE.find('tr:not(:hidden)'); | |
| var headers = []; | |
| var data = []; | |
| // Get the headers (add special header logic here) | |
| $($rows.shift()).find('th:not(:empty)').each(function () { | |
| headers.push($(this).text().toLowerCase()); | |
| }); | |
| // Turn all existing rows into a loopable array | |
| $rows.each(function () { | |
| var $td = $(this).find('td'); | |
| var h = {}; | |
| // Use the headers from earlier to name our hash keys | |
| headers.forEach(function (header, i) { | |
| h[header] = $td.eq(i).text(); | |
| }); | |
| data.push(h); | |
| }); | |
| // Output the result | |
| $EXPORT.text(JSON.stringify(data)); | |
| }); |
| <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> | |
| <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script> | |
| <script src="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> | |
| <script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore.js"></script> |
| @import "compass/css3"; | |
| .table-editable { | |
| position: relative; | |
| .glyphicon { | |
| font-size: 20px; | |
| } | |
| } | |
| .table-remove { | |
| color: #700; | |
| cursor: pointer; | |
| &:hover { | |
| color: #f00; | |
| } | |
| } | |
| .table-up, .table-down { | |
| color: #007; | |
| cursor: pointer; | |
| &:hover { | |
| color: #00f; | |
| } | |
| } | |
| .table-add { | |
| color: #070; | |
| cursor: pointer; | |
| position: absolute; | |
| top: 8px; | |
| right: 0; | |
| &:hover { | |
| color: #0b0; | |
| } | |
| } |
| <link href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/themes/smoothness/jquery-ui.css" rel="stylesheet" /> | |
| <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" /> |