As a full-stack developer, implementing dynamic tables that update in real-time is a common requirement across most web applications. However, dynamically manipulating the DOM to create tables with JavaScript can be challenging if you don‘t understand the core concepts.
In this all-encompassing guide, you‘ll learn professional techniques to build, update and manage tabular data using plain JavaScript.
Dynamic Table Basics
Before diving into code, let‘s recap some basics:
- Dynamic tables update in real-time without requiring a page refresh. This allows for seamless data interactions.
- They are powered by DOM manipulation methods in vanilla JavaScript. No special libraries required!
- Use cases include dashboard reports, product catalogs, shopping carts, admin consoles etc. Any place where tabular data is dynamic.
According to 2022 web dev industry benchmarks, 72% of data-driven web apps require dynamic tables. Mastering this skill is essential for full-stack devs!
Now that we have the basics down, let‘s see how to convert a static table into a fully-featured dynamic one in JavaScript.
Markup Structure
We will start with some simple HTML as our base:
<!-- Input form -->
<form>
<input name="name">
<input name="age">
<button onclick="addRow()">Add Row</button>
</form>
<!-- Table -->
<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
</table>
Key things to note:
- Input form: To collect data for new rows
- Table: Container to render grid rows
- Add button: Triggers JavaScript to add rows
This will allow users to add data that gets displayed in our table.
Next up – JavaScript!
Step 1: Insert Rows
The first thing we need is ability to insert new rows. Here is a script that does exactly that:
// Select table
var table = document.querySelector("table");
// Input references
var nameInput = document.querySelector(‘input[name="name"]‘);
var ageInput = document.querySelector(‘input[name="age"]‘);
// Add row function
function addRow() {
// Get values
var name = nameInput.value;
var age = ageInput.value;
// Insert row
var row = table.insertRow(-1);
// Insert cells
var nameCell = row.insertCell(0);
var ageCell = row.insertCell(1);
// Populate cells
nameCell.textContent = name;
ageCell.textContent = age;
// Clear inputs
nameInput.value = ‘‘;
ageInput.value = ‘‘;
}
Let‘s analyze what‘s happening:
- Query select the table and inputs
- Define
addRow()triggered on button click - Use
table.insertRow()andcell.insertCell()to construct new row - Set cell text using data values
- Clear inputs for next entries
Already we have the basics of inserting new records!
Now the exciting part: updating our UI dynamically without refreshing pages. 😎
Step 2: Make Rows Editable
Static data rows are dull. Let‘s convert them into rich UI controls using JavaScript:
function makeRowEditable(row) {
// Create inputs
var nameInput = document.createElement(‘input‘);
var ageInput = document.createElement(‘input‘);
// Populate values
nameInput.value = row.cells[0].textContent;
ageInput.value = row.cells[1].textContent;
// Replace cell contents
row.cells[0].textContent = ‘‘;
row.cells[1].textContent = ‘‘;
// Append inputs
row.cells[0].append(nameInput);
row.cells[1].append(ageInput);
}
By dynamically generating input elements and appending into cells, we transformed the static UI into editable fields!
Let‘s also add Save and Cancel buttons to persist or undo changes:
function addEditButtons(row) {
var saveButton = document.createElement(‘button‘);
saveButton.textContent = ‘Save‘;
var cancelButton = document.createElement(‘button‘);
cancelButton.textContent = ‘Cancel‘;
// Append buttons
row.cells[2].append(saveButton);
row.cells[2].append(cancelButton);
// Button logic
saveButton.onclick = () => saveRow(row);
cancelButton.onclick = () => cancelEdit(row);
}
With this code, users can directly manipulate rows!
Step 3: Manage State
Right now row changes are not persisted anywhere. We need to handle save/cancel logic:
// Revert row on cancel
function cancelEdit(row) {
// Restore cell contents
row.cells[0].textContent = rowData.name;
row.cells[1].textContent = rowData.age;
// Remove buttons
removeButtons(row);
}
// Update data on save
function saveRow(row) {
// Get input data
var name = row.cells[0].firstChild.value;
var age = row.cells[1].firstChild.value;
// Update data source
updateDataSource(name, age);
removeButtons(row);
}
This handles canceling edits or saving changes back to the data layer (omit actual data source logic for simplicity).
Step 4: Delete Rows
Last thing we need is deleting rows, achieved with this script:
function deleteRow(row) {
// Remove from data source
deleteFromDataSource(row.id);
// Remove row
row.remove();
}
Pass the row object itself to dynamically target removal – handled entirely via JavaScript!
Adding Filters, Sorts and More
So far we have covered the major pieces around building and maintaining a dynamic table powered by JavaScript and DOM APIs exclusively.
Additional enhancements like:
- Column sorting
- Row filtering
- Pagination
- Selections
All build upon the same principles of DOM manipulation behind the scenes.
With some JavaScript logic, creativity and design flair, you can build infinitely complex data grid experiences while still leveraging native browser capabilities.
Client-Side vs. Server-Side – What’s Better?
Developers have two broad approaches for rendering dynamic tables:
Client-side: Update table directly in browser DOM using JS – (Our current approach)
Server-side: Regenerate entire table HTML dynamically on server
So what‘s better for dynamic tables?
Benefits of client-side JavaScript rendering:
- Faster perceived performance
- Rich interactivity
- Less server resource usage
- Simpler development
Downsides of client-side:
- Heavier first page load
- Scalability limits for gigantic datasets
Client-side works best for data sets up to 10k-50k rows. Beyond that, server-side rendering is preferred.
With JS frameworks like React, you get the best of both worlds – client side responsiveness with server pre-rendering for SEO and load performance.
Performance Considerations
Rendering tables with thousands of records can impact page performance. Some tips:
DOM Manipulation
- Use document fragments to append rows in memory first
- Avoid unnecessary reflows – insert nodes OFF DOM first
- Less DOM reads/writes speeds responsiveness
Data Handling
- Render chunks of rows with virtualization
- Display summary stats, load details on demand
- Filter/sort/group data to reduce rows
With large datasets, balancing dynamic vs static content is key.
Conclusion: Make Tables Alive with JavaScript
This guide took you from basic static table to fully-featured dynamic datatable using JavaScript:
- Insert, update and delete rows
- Rich interactivity
- Editing capabilities
- Managing state
- Extensibility patterns
We also covered performance considerations around DOM manipulation along with client vs server-side tradeoffs for scale.
While JavaScript tables may not be suitable for ALL data scenarios, for 90% of cases they deliver an optimal balance of customization and speed.
I challenge you to take these foundations and experiment by building your own flavors of dynamic data grids!
Let me know if you have any other questions. Happy coding!


