HTML5 Editable Table
Create and edit an HTML5 table without the use of a library. Uses HTML5's contenteditable and minimal JavaScript.
Forked from Ash Blue's Pen HTML5 Editable Table.
A Pen by Anita Owens on CodePen.
Create and edit an HTML5 table without the use of a library. Uses HTML5's contenteditable and minimal JavaScript.
Forked from Ash Blue's Pen HTML5 Editable Table.
A Pen by Anita Owens 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="http://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" /> |