在jQuery中添加表格行
jQuery中最好的方法是将最后一行添加到表中作为最后一行?
这可以接受吗?
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
是否有限制,你可以添加到这样的表(如input,select,行数)?
你build议的方法不能保证给你你要找的结果 – 例如,如果你有一个tbody
,例如:
<table id="myTable"> <tbody> <tr>...</tr> <tr>...</tr> </tbody> </table>
你会最终得到以下结果:
<table id="myTable"> <tbody> <tr>...</tr> <tr>...</tr> </tbody> <tr>...</tr> </table>
因此,我会推荐这种方法:
$('#myTable tr:last').after('<tr>...</tr><tr>...</tr>');
你可以在after()
方法中包含任何东西,只要它是有效的HTML,包括上面例子中的多行。
更新:在这个问题最近的活动后重温这个答案。 无暇的眼神使得一个很好的评论,DOM中总是会有一个人; 这是真的,但只有至less有一行。 如果你没有行,除非你自己指定了行,否则没有行。
DaRKoN_ build议附加到tbody
而不是在最后一个tr
之后添加内容。 这样可以解决没有行的问题,但是仍然不是无懈可击的,因为理论上你可以有多个tbody
元素,行会被添加到每个元素中。
把所有东西称重,我不确定是否有单一的解决scheme来解决每一种可能的情况。 您将需要确保jQuery代码符合您的标记。
我认为最安全的解决scheme可能是确保你的table
总是在你的标记中包含至less一个tbody
,即使它没有行。 在这个基础上,你可以使用下面的方法,但是你可以使用很多行(并且也包含多个tbody
元素):
$('#myTable > tbody:last-child').append('<tr>...</tr><tr>...</tr>');
jQuery有一个内置的工具来即时操作DOM元素。
你可以添加任何东西到你的表中,像这样:
$("#tableID").find('tbody') .append($('<tr>') .append($('<td>') .append($('<img>') .attr('src', 'img.png') .text('Image cell') ) ) );
jQuery中的$('<some-tag>')
是一个标签对象,它可以包含几个可以设置和获取的attr
属性,以及表示标签之间text
的文本: <tag>text</tag>
。
这是一些非常奇怪的缩进,但是在这个例子中,更容易看到发生了什么。
所以@Luke Bennett回答了这个问题,事情就发生了改变。 这是一个更新。
从版本1.4(?)jQuery自动检测你试图插入的元素(使用任何append()
, prepend()
, before()
或after()
方法)是否是一个<tr>
并将其插入到第一个<tbody>
放在你的表中,如果不存在的话,将它包装成一个新的<tbody>
。
所以是的,你的示例代码是可以接受的,并且可以和jQuery 1.4+一起使用。 ;)
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
如果你有一个<tbody>
和一个<tfoot>
?
如:
<table> <tbody> <tr><td>Foo</td></tr> </tbody> <tfoot> <tr><td>footer information</td></tr> </tfoot> </table>
然后它会插入你的新行在页脚 – 而不是身体。
因此,最好的解决scheme是包含一个<tbody>
标签并使用.append
,而不是.after
。
$("#myTable > tbody").append("<tr><td>row content</td></tr>");
我知道你已经要求一个jQuery方法。 我看了很多,发现我们可以用比以下函数直接使用JavaScript更好的方式来做到这一点。
tableObject.insertRow(index)
index
是一个整数,指定要插入的行的位置(从0开始)。 -1的值也可以使用; 这导致新行将被插入到最后的位置。
此参数在Firefox和Opera中是必需的,但在Internet Explorer, Chrome和Safari中是可选的。
如果省略此参数,则insertRow()
在Internet Explorer的最后一个位置插入新行,并在Chrome和Safari的第一个位置插入新行。
它将适用于HTML表格的每个可接受的结构。
以下示例将在最后插入一行(-1用作索引):
<html> <head> <script type="text/javascript"> function displayResult() { document.getElementById("myTable").insertRow(-1).innerHTML = '<td>1</td><td>2</td>'; } </script> </head> <body> <table id="myTable" border="1"> <tr> <td>cell 1</td> <td>cell 2</td> </tr> <tr> <td>cell 3</td> <td>cell 4</td> </tr> </table> <br /> <button type="button" onclick="displayResult()">Insert new row</button> </body> </html>
我希望它有帮助。
我build议
$('#myTable > tbody:first').append('<tr>...</tr><tr>...</tr>');
而不是
$('#myTable > tbody:last').append('<tr>...</tr><tr>...</tr>');
第first
和last
关键字在第一个或最后一个标签last
起作用,而不是closures。 因此,如果不希望嵌套表被更改,而是添加到整个表中,则这对嵌套表起到更好的作用。 至less,这是我发现的。
<table id=myTable> <tbody id=first> <tr><td> <table id=myNestedTable> <tbody id=last> </tbody> </table> </td></tr> </tbody> </table>
在我看来,最快和最清晰的方式是
//Try to get tbody first with jquery children. works faster! var tbody = $('#myTable').children('tbody'); //Then if no tbody just select your table var table = tbody.length ? tbody : $('#myTable'); //Add row table.append('<tr><td>hello></td></tr>');
这里是演示小提琴
另外我可以推荐一个小函数来做更多的html更改
//Compose template string String.prototype.compose = (function (){ var re = /\{{(.+?)\}}/g; return function (o){ return this.replace(re, function (_, k){ return typeof o[k] != 'undefined' ? o[k] : ''; }); } }());
如果你使用我的弦乐composer php,你可以这样做
var tbody = $('#myTable').children('tbody'); var table = tbody.length ? tbody : $('#myTable'); var row = '<tr>'+ '<td>{{id}}</td>'+ '<td>{{name}}</td>'+ '<td>{{phone}}</td>'+ '</tr>'; //Add row table.append(row.compose({ 'id': 3, 'name': 'Lee', 'phone': '123 456 789' }));
这里是演示小提琴
这可以使用jQuery的“last()”function轻松完成。
$("#tableId").last().append("<tr><td>New row</td></tr>");
当表中没有任何行时,我使用这种方式,每一行都很复杂。
style.css中:
... #templateRow { display:none; } ...
xxx.html
... <tr id="templateRow"> ... </tr> ... $("#templateRow").clone().removeAttr("id").appendTo( $("#templateRow").parent() ); ...
我遇到了一些相关的问题,试图在点击行之后插入一个表格行。 除了.after()调用不适用于最后一行外,一切正常。
$('#traffic tbody').find('tr.trafficBody).filter(':nth-child(' + (column + 1) + ')').after(insertedhtml);
我遇到了一个非常不整洁的解决scheme:
按如下所示创build表(每行的id):
<tr id="row1"> ... </tr> <tr id="row2"> ... </tr> <tr id="row3"> ... </tr>
等等
接着 :
$('#traffic tbody').find('tr.trafficBody' + idx).after(html);
为了在这里发布最好的解决scheme,如果最后一行有一个嵌套表,新行将被添加到嵌套表而不是主表。 一个快速的解决scheme(考虑带/不带tbody的表格和嵌套表格的表格):
function add_new_row(table, rowcontent) { if ($(table).length > 0) { if ($(table + ' > tbody').length == 0) $(table).append('<tbody />'); ($(table + ' > tr').length > 0) ? $(table).children('tbody:last').children('tr:last').append(rowcontent): $(table).children('tbody:last').append(rowcontent); } }
用法示例:
add_new_row('#myTable','<tr><td>my new row</td></tr>');
你可以使用这个很棒的jQuery添加表格行函数。 它适用于拥有<tbody>
而没有的表。 另外它也考虑到你最后一个表格列的colspan。
以下是一个示例用法:
// One table addTableRow($('#myTable')); // add table row to number of tables addTableRow($('.myTables'));
我的解决scheme
//Adds a new table row $.fn.addNewRow = function (rowId) { $(this).find('tbody').append('<tr id="' + rowId + '"> </tr>'); };
用法:
$('#Table').addNewRow(id1);
// Create a row and append to table var row = $('<tr />', {}) .appendTo("#table_id"); // Add columns to the row. <td> properties can be given in the JSON $('<td />', { 'text': 'column1' }).appendTo(row); $('<td />', { 'text': 'column2', 'style': 'min-width:100px;' }).appendTo(row);
尼尔的答案是迄今为止最好的答案 。 然而事情变得非常麻烦。 我的build议是使用variables来存储元素并将它们追加到DOM层次结构中。
HTML
<table id="tableID"> <tbody> </tbody> </table>
JAVASCRIPT
// Reference to the table body var body = $("#tableID").find('tbody'); // Create a new row element var row = $('<tr>'); // Create a new column element var column = $('<td>'); // Create a new image element var image = $('<img>'); image.attr('src', 'img.png'); image.text('Image cell'); // Append the image to the column element column.append(image); // Append the column to the row element row.append(column); // Append the row to the table body body.append(row);
我发现这个AddRow插件对于pipe理表格行非常有用。 虽然如果你只需要添加一个新的行,卢克的解决scheme将是最合适的。
这是一些hacketi破解代码。 我想在HTML页面中保留一个行模板。 表行0 … n在请求时被渲染,这个例子有一个硬编码的行和一个简化的模板行。 模板表是隐藏的,行标记必须位于有效表内,否则浏览器可能会将其从DOM树中删除。 添加一行使用计数器+1标识符,并且当前值在数据属性中维护。 它保证每一行获得唯一的URL参数。
我已经在Internet Explorer 8,Internet Explorer 9,Firefox,Chrome,Opera, Nokia Lumia 800 , Nokia C7 (与Symbian 3),Android股票以及Firefox beta版浏览器上运行testing。
<table id="properties"> <tbody> <tr> <th>Name</th> <th>Value</th> <th> </th> </tr> <tr> <td nowrap>key1</td> <td><input type="text" name="property_key1" value="value1" size="70"/></td> <td class="data_item_options"> <a class="buttonicon" href="javascript:deleteRow()" title="Delete row" onClick="deleteRow(this); return false;"></a> </td> </tr> </tbody> </table> <table id="properties_rowtemplate" style="display:none" data-counter="0"> <tr> <td><input type="text" name="newproperty_name_\${counter}" value="" size="35"/></td> <td><input type="text" name="newproperty_value_\${counter}" value="" size="70"/></td> <td><a class="buttonicon" href="javascript:deleteRow()" title="Delete row" onClick="deleteRow(this); return false;"></a></td> </tr> </table> <a class="action" href="javascript:addRow()" onclick="addRow('properties'); return false" title="Add new row">Add row</a><br/> <br/> - - - - // add row to html table, read html from row template function addRow(sTableId) { // find destination and template tables, find first <tr> // in template. Wrap inner html around <tr> tags. // Keep track of counter to give unique field names. var table = $("#"+sTableId); var template = $("#"+sTableId+"_rowtemplate"); var htmlCode = "<tr>"+template.find("tr:first").html()+"</tr>"; var id = parseInt(template.data("counter"),10)+1; template.data("counter", id); htmlCode = htmlCode.replace(/\${counter}/g, id); table.find("tbody:last").append(htmlCode); } // delete <TR> row, childElem is any element inside row function deleteRow(childElem) { var row = $(childElem).closest("tr"); // find <tr> parent row.remove(); }
PS:我把所有的功劳都交给了jQuery团队。 他们应得的一切。 没有jQuery的JavaScript编程 – 我甚至不想去想那个噩梦。
<tr id="tablerow"></tr> $('#tablerow').append('<tr>...</tr><tr>...</tr>');
我猜我已经完成了我的项目,这里是:
HTML
<div class="container"> <div class = "row"> <div class = "span9"> <div class = "well"> <%= form_for (@replication) do |f| %> <table> <tr> <td> <%= f.label :SR_NO %> </td> <td> <%= f.text_field :sr_no , :id => "txt_RegionName" %> </td> </tr> <tr> <td> <%= f.label :Particular %> </td> <td> <%= f.text_area :particular , :id => "txt_Region" %> </td> </tr> <tr> <td> <%= f.label :Unit %> </td> <td> <%= f.text_field :unit ,:id => "txt_Regio" %> </td> </tr> <tr> <td> <%= f.label :Required_Quantity %> </td> <td> <%= f.text_field :quantity ,:id => "txt_Regi" %> </td> </tr> <tr> <td></td> <td> <table> <tr><td> <input type="button" name="add" id="btn_AddToList" value="add" class="btn btn-primary" /> </td><td><input type="button" name="Done" id="btn_AddToList1" value="Done" class="btn btn-success" /> </td></tr> </table> </td> </tr> </table> <% end %> <table id="lst_Regions" style="width: 500px;" border= "2" class="table table-striped table-bordered table-condensed"> <tr> <td>SR_NO</td> <td>Item Name</td> <td>Particular</td> <td>Cost</td> </tr> </table> <input type="button" id= "submit" value="Submit Repication" class="btn btn-success" /> </div> </div> </div> </div>
JS
$(document).ready(function() { $('#submit').prop('disabled', true); $('#btn_AddToList').click(function () { $('#submit').prop('disabled', true); var val = $('#txt_RegionName').val(); var val2 = $('#txt_Region').val(); var val3 = $('#txt_Regio').val(); var val4 = $('#txt_Regi').val(); $('#lst_Regions').append('<tr><td>' + val + '</td>' + '<td>' + val2 + '</td>' + '<td>' + val3 + '</td>' + '<td>' + val4 + '</td></tr>'); $('#txt_RegionName').val('').focus(); $('#txt_Region').val(''); $('#txt_Regio').val(''); $('#txt_Regi').val(''); $('#btn_AddToList1').click(function () { $('#submit').prop('disabled', false).addclass('btn btn-warning'); }); }); });
<table id="myTable"> <tbody> <tr>...</tr> <tr>...</tr> </tbody> <tr>...</tr> </table>
用javascript函数写
document.getElementById("myTable").insertRow(-1).innerHTML = '<tr>...</tr><tr>...</tr>';
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
将添加一个新的行到表的第一个 TBODY
,而不依赖于任何THEAD
或TFOOT
目前。 (我没有find从哪个版本的jQuery .append()
这个行为存在的信息。)
你可以在这些例子中尝试:
<table class="t"> <!-- table with THEAD, TBODY and TFOOT --> <thead> <tr><th>h1</th><th>h2</th></tr> </thead> <tbody> <tr><td>1</td><td>2</td></tr> </tbody> <tfoot> <tr><th>f1</th><th>f2</th></tr> </tfoot> </table><br> <table class="t"> <!-- table with two TBODYs --> <thead> <tr><th>h1</th><th>h2</th></tr> </thead> <tbody> <tr><td>1</td><td>2</td></tr> </tbody> <tbody> <tr><td>3</td><td>4</td></tr> </tbody> <tfoot> <tr><th>f1</th><th>f2</th></tr> </tfoot> </table><br> <table class="t"> <!-- table without TBODY --> <thead> <tr><th>h1</th><th>h2</th></tr> </thead> </table><br> <table class="t"> <!-- table with TR not in TBODY --> <tr><td>1</td><td>2</td></tr> </table> <br> <table class="t"> </table> <script> $('.t').append('<tr><td>a</td><td>a</td></tr>'); </script>
其中ab
行在1 2
之后插入,而第二个例子中不在3 4
之后。 如果表是空的,jQuery为新行创buildTBODY
。
因为我也有办法在最后或任何特定的地方添加行,所以我想我也应该分享一下:
首先找出长度或行数:
var r=$("#content_table").length;
然后使用下面的代码来添加你的行:
$("#table_id").eq(r-1).after(row_html);
要在主题上添加一个很好的例子,如果您需要在特定的位置添加一行,这里是工作的解决scheme。
额外的行被添加到第5行之后,或者如果less于5行,则添加到表的末尾。
var ninja_row = $('#banner_holder').find('tr'); if( $('#my_table tbody tr').length > 5){ $('#my_table tbody tr').filter(':nth-child(5)').after(ninja_row); }else{ $('#my_table tr:last').after(ninja_row); }
我把内容放在桌子下面的一个准备好的(隐藏的)容器中。如果你(或者devise者)必须改变它,不需要编辑JS。
<table id="banner_holder" style="display:none;"> <tr> <td colspan="3"> <div class="wide-banner"></div> </td> </tr> </table>
<table id=myTable> <tr><td></td></tr> <style="height=0px;" tfoot></tfoot> </table>
您可以caching页脚variables并减less对DOM的访问(注意:可能是使用假行而不是页脚)。
var footer = $("#mytable tfoot") footer.before("<tr><td></td></tr>")
如果你正在使用Datatable JQuery插件,你可以尝试。
oTable = $('#tblStateFeesSetup').dataTable({ "bScrollCollapse": true, "bJQueryUI": true, ... ... //Custom Initializations. }); //Data Row Template of the table. var dataRowTemplate = {}; dataRowTemplate.InvoiceID = ''; dataRowTemplate.InvoiceDate = ''; dataRowTemplate.IsOverRide = false; dataRowTemplate.AmountOfInvoice = ''; dataRowTemplate.DateReceived = ''; dataRowTemplate.AmountReceived = ''; dataRowTemplate.CheckNumber = ''; //Add dataRow to the table. oTable.fnAddData(dataRowTemplate);
请参阅Datatables fnAddData Datatables API
以一种简单的方式:
$('#yourTableId').append('<tr><td>your data1</td><td>your data2</td><td>your data3</td></tr>');
如果你有另一个variables,你可以像<td>
标签那样尝试访问。
这样我希望这会有所帮助
var table = $('#yourTableId'); var text = 'My Data in td'; var image = 'your/image.jpg'; var tr = ( '<tr>' + '<td>'+ text +'</td>'+ '<td>'+ text +'</td>'+ '<td>'+ '<img src="' + image + '" alt="yourImage">'+ '</td>'+ '</tr>' ); $('#yourTableId').append(tr);
这是我的解决scheme
$('#myTable').append('<tr><td>'+data+'</td><td>'+other data+'</td>...</tr>');
如果要在<tr>
第一个孩子之前添加row
。
$("#myTable > tbody").prepend("<tr><td>my data</td><td>more data</td></tr>");
如果你想在<tr>
最后一个孩子之后添加row
。
$("#myTable > tbody").append("<tr><td>my data</td><td>more data</td></tr>");
这也可以这样做:
$("#myTable > tbody").html($("#myTable > tbody").html()+"<tr><td>my data</td><td>more data</td></tr>")