Add table row in jQuery
What is the best method in jQuery to add an additional row to a table as the last row?
Is this acceptable?
Are there limitations to what you can add to a table like this (such as inputs, selects, number of rows)?
The approach you suggest is not guaranteed to give you the result you’re looking for – what if you had a
tbody for example:
<table id="myTable"> <tbody> <tr>...</tr> <tr>...</tr> </tbody> </table>
You would end up with the following:
<table id="myTable"> <tbody> <tr>...</tr> <tr>...</tr> </tbody> <tr>...</tr> </table>
I would therefore recommend this approach instead:
You can include anything within the
after() method as long as it’s valid HTML, including multiple rows as per the example above.
Update: Revisiting this answer following recent activity with this question. eyelidlessness makes a good comment that there will always be a
tbody in the DOM; this is true, but only if there is at least one row. If you have no rows, there will be no
tbody unless you have specified one yourself.
DaRKoN_ suggests appending to the
tbody rather than adding content after the last
tr. This gets around the issue of having no rows, but still isn’t bulletproof as you could theoretically have multiple
tbody elements and the row would get added to each of them.
Weighing everything up, I’m not sure there is a single one-line solution that accounts for every single possible scenario. You will need to make sure the jQuery code tallies with your markup.
I think the safest solution is probably to ensure your
table always includes at least one
tbody in your markup, even if it has no rows. On this basis, you can use the following which will work however many rows you have (and also account for multiple
$('#myTable > tbody:last-child').append('<tr>...</tr><tr>...</tr>');
jQuery has a built-in facility to manipulate DOM elements on the fly.
You can add anything to your table like this:
$("#tableID").find('tbody') .append($('<tr>') .append($('<td>') .append($('<img>') .attr('src', 'img.png') .text('Image cell') ) ) );
$('<some-tag>') thing in jQuery is a tag object that can have several
attr attributes that can be set and get, as well as
text, which represents the text between the tag here:
This is some pretty weird indenting, but it’s easier for you to see what’s going on in this example.
So things have changed ever since @Luke Bennett answered this question. Here is an update.
jQuery since version 1.4(?) automatically detects if the element you are trying to insert (using any of the
after() methods) is a
<tr> and inserts it into the first
<tbody> in your table or wraps it into a new
<tbody> if one doesn’t exist.
So yes your example code is acceptable and will work fine with jQuery 1.4+. 😉
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
What if you had a
<tbody> and a
<table> <tbody> <tr><td>Foo</td></tr> </tbody> <tfoot> <tr><td>footer information</td></tr> </tfoot> </table>
Then it would insert your new row in the footer – not to the body.
Hence the best solution is to include a
<tbody> tag and use
.append, rather than
$("#myTable > tbody").append("<tr><td>row content</td></tr>");
index is an integer that specifies the position of the row to insert (starts at 0). The value of -1 can also be used; which result in that the new row will be inserted at the last position.
If this parameter is omitted,
insertRow() inserts a new row at the last position in Internet Explorer and at the first position in Chrome and Safari.
It will work for every acceptable structure of HTML table.
The following example will insert a row in last (-1 is used as index):
I hope it helps.
$('#myTable > tbody:first').append('<tr>...</tr><tr>...</tr>');
as opposed to
$('#myTable > tbody:last').append('<tr>...</tr><tr>...</tr>');
last keywords work on the first or last tag to be started, not closed. Therefore, this plays nicer with nested tables, if you don’t want the nested table to be changed, but instead add to the overall table. At least, this is what I found.
<table id=myTable> <tbody id=first> <tr><td> <table id=myNestedTable> <tbody id=last> </tbody> </table> </td></tr> </tbody> </table>