jQuery에서 테이블에 마지막 행으로 추가 행을 추가하는 가장 좋은 방법은 무엇입니까?
이것이 허용됩니까?
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
이와 같은 테이블에 추가 할 수있는 항목 (예 : 입력, 선택, 행 수)에 제한이 있습니까?
jQuery에서 테이블에 마지막 행으로 추가 행을 추가하는 가장 좋은 방법은 무엇입니까?
이것이 허용됩니까?
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
이와 같은 테이블에 추가 할 수있는 항목 (예 : 입력, 선택, 행 수)에 제한이 있습니까?
답변:
당신이 제안하는 접근법은 당신이 찾고있는 결과를 제공한다고 보장하지는 않습니다 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 인 경우 메소드 내에 무엇이든 포함 할 수 있습니다 .
업데이트 : 이 질문에 대한 최근 활동에 따라이 답변을 다시 방문하십시오. 눈꺼풀은 tbody
DOM에 항상있을 것이라고 좋은 의견을 제시합니다 . 이것은 사실이지만 하나 이상의 행이있는 경우에만 해당됩니다. 행이 없으면 tbody
직접 지정 하지 않은 한 없습니다 .
DaRKoN_ 은tbody
마지막 이후에 내용을 추가 하는 대신에 추가하는 것이 좋습니다 tr
. 이것은 행이 없다는 문제를 해결하지만 이론적으로 여러 개를 가질 수 있으므로 방탄하지는 않습니다.tbody
요소를 있고 행이 각 요소에 추가되므로 .
모든 것을 고려할 때 가능한 모든 단일 시나리오를 설명하는 단일 한 줄 솔루션이 있는지 확실하지 않습니다. jQuery 코드가 마크 업과 일치하는지 확인해야합니다.
가장 안전한 해결책은 아마도 행이없는 경우에도 table
항상 tbody
마크 업에 하나 이상을 포함 시키는 것입니다. 이를 바탕으로 다음을 사용하면 많은 행을 사용할 수 있지만 여러 tbody
요소를 고려할 수도 있습니다 .
$('#myTable > tbody:last-child').append('<tr>...</tr><tr>...</tr>');
$('#myTable').find('tbody:last')
대신 다음을 사용 하여 속도를 향상시킬 수 있습니다 $('#myTable > tbody:last')
.
jQuery에는 DOM 요소를 즉시 조작 할 수있는 기능이 내장되어 있습니다.
다음과 같이 테이블에 무엇이든 추가 할 수 있습니다.
$("#tableID").find('tbody')
.append($('<tr>')
.append($('<td>')
.append($('<img>')
.attr('src', 'img.png')
.text('Image cell')
)
)
);
$('<some-tag>')
jQuery 의 것은 태그 객체를 attr
설정하고 가져올 수있는 몇 가지 속성과 text
태그 사이의 텍스트를 나타내는 태그 객체입니다 <tag>text</tag>
.
이것은 약간 이상한 들여 쓰기이지만이 예제에서 무슨 일이 일어나고 있는지 쉽게 알 수 있습니다.
@Luke Bennett 이후로 상황이 바뀌 었습니다. 이이 질문에 답변 . 다음은 업데이트입니다.
jQuery를 당신이 (의 어떤 사용하여 삽입하려는 요소 경우 버전 1.4 (?)를 자동으로 감지하기 때문에 append()
, prepend()
, before()
, 또는 after()
방법)가 있습니다 <tr>
첫 번째로 및 삽입을 <tbody>
테이블이나 새로 래핑 <tbody>
한하지 않는 경우 있다.
그렇습니다. 예제 코드는 수용 가능하며 jQuery 1.4 이상에서 잘 작동합니다. ;)
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
yourString.trim()
이것을 해결할 수 있다고 생각한다 .
만약에 a <tbody>
와 a 가 있다면 <tfoot>
?
같은 :
<table>
<tbody>
<tr><td>Foo</td></tr>
</tbody>
<tfoot>
<tr><td>footer information</td></tr>
</tfoot>
</table>
그런 다음 본문이 아닌 바닥 글에 새 행을 삽입합니다.
따라서 가장 좋은 해결책은 <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>
도움이 되길 바랍니다.
나는 추천한다
$('#myTable > tbody:first').append('<tr>...</tr><tr>...</tr>');
반대로
$('#myTable > tbody:last').append('<tr>...</tr><tr>...</tr>');
first
및 last
첫 번째 또는 마지막 태그에 키워드 작품은 폐쇄하지 시작합니다. 따라서 중첩 테이블을 변경하지 않고 전체 테이블에 추가하려는 경우 중첩 테이블에서 더 잘 작동합니다. 적어도 이것이 내가 찾은 것입니다.
<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] : '';
});
}
}());
내 문자열 작곡가를 사용하면 다음과 같이 할 수 있습니다
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'
}));
데모 피들입니다
tbody
여러 개의 인서트를 얻을 수 있습니다
$("SELECTOR").last()
당신의 태그 수집을 제한 하려고 할 수 있습니다
이것은 jQuery의 "last ()"함수를 사용하여 쉽게 수행 할 수 있습니다.
$("#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() );
...
여기에 게시 된 최상의 솔루션을 위해 마지막 행에 중첩 테이블이 있으면 새 테이블이 기본 테이블 대신 중첩 테이블에 추가됩니다. 빠른 솔루션 (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 사용
$('#tab').append($('<tr>')
.append($('<td>').append("text1"))
.append($('<td>').append("text2"))
.append($('<td>').append("text3"))
.append($('<td>').append("text4"))
)
$('#tab').append($('<tr>')
.append($('<td>').append("text1"))
.append($('<td>').append("text2"))
.append($('<td>').append("text3"))
.append($('<td>').append("text4"))
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="tab">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
<th>City</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>50</td>
<td>New York</td>
</tr>
</table>
클릭 한 행 뒤에 테이블 행을 삽입하려고 시도하면서 관련 문제가 발생했습니다. 마지막 행에서 .after () 호출이 작동하지 않는 한 모두 괜찮습니다.
$('#traffic tbody').find('tr.trafficBody).filter(':nth-child(' + (column + 1) + ')').after(insertedhtml);
나는 매우 어수선한 해결책을 찾았습니다.
다음과 같이 테이블을 작성하십시오 (각 행의 ID).
<tr id="row1"> ... </tr>
<tr id="row2"> ... </tr>
<tr id="row3"> ... </tr>
등 ...
그리고 :
$('#traffic tbody').find('tr.trafficBody' + idx).after(html);
이 훌륭한 jQuery 추가 테이블 행 함수를 사용할 수 있습니다 . 테이블이 <tbody>
있고 그렇지 않은 테이블에서 잘 작동합니다 . 또한 마지막 테이블 행의 colspan을 고려합니다.
다음은 사용법 예입니다.
// One table
addTableRow($('#myTable'));
// add table row to number of tables
addTableRow($('.myTables'));
내 해결책 :
//Adds a new table row
$.fn.addNewRow = function (rowId) {
$(this).find('tbody').append('<tr id="' + rowId + '"> </tr>');
};
용법:
$('#Table').addNewRow(id1);
tbody
테이블에 없으면 어떻게 합니까 .. ?? <table>
헤더가 없어도 요소 내부에 직접 행이있을 수 있음을 의미 합니다.
// 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);
닐의 대답 은 지금까지 최고입니다. 그러나 일이 정말 더러워집니다. 변수를 사용하여 요소를 저장하고 DOM 계층 구조에 추가하는 것이 좋습니다.
HTML
<table id="tableID">
<tbody>
</tbody>
</table>
자바 스크립트
// 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 플러그인 이 테이블 행 관리에 매우 유용하다는 것을 알았습니다 . 그러나 새 행을 추가 해야하는 경우 Luke의 솔루션 이 가장 적합합니다.
다음은 일부 해커 티 해킹 코드입니다. HTML 페이지 에서 행 템플릿을 유지하고 싶었습니다 . 테이블 행 0 ... n은 요청시 렌더링되며이 예제에는 하나의 하드 코드 된 행과 단순화 된 템플리트 행이 있습니다. 템플릿 테이블이 숨겨져 있고 행 태그가 유효한 테이블 내에 있어야합니다. 그렇지 않으면 브라우저가 DOM 트리 에서이를 삭제할 수 있습니다 . 행을 추가하면 카운터 +1 식별자가 사용되며 현재 값은 데이터 속성에 유지됩니다. 각 행마다 고유 한 URL을 보장합니다. 매개 변수를 .
Internet Explorer 8, Internet Explorer 9, Firefox, Chrome, Opera, Nokia Lumia 800 , Nokia C7 ( Symbian 3 포함), Android 스톡 및 Firefox 베타 브라우저에서 테스트를 실행했습니다.
<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();
}
추신 : 저는 jQuery 팀에 모든 크레딧을 제공합니다. 그들은 모든 것을받을 자격이 있습니다. jQuery가없는 JavaScript 프로그래밍-그 악몽에 대해 생각조차하고 싶지 않습니다.
나는 내 프로젝트에서 내가 한 것을 추측한다.
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');
});
});
});
다른 변수가 있다면 <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);
주제에 대한 좋은 예를 추가하려면 특정 위치에 행을 추가 해야하는 경우 효과적인 해결책이 있습니다.
여분의 행은 5 번째 행 뒤에 또는 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);
}
내용을 테이블 아래의 준비된 (숨겨진) 컨테이너에 넣었습니다 .. 따라서 (또는 디자이너) 변경 해야하는 경우 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>
바닥 글 변수를 캐시하고 DOM에 대한 액세스를 줄일 수 있습니다 (참고 : 바닥 글 대신 가짜 행을 사용하는 것이 좋을 수 있습니다).
var footer = $("#mytable tfoot")
footer.before("<tr><td></td></tr>")
$('#myTable').append('<tr><td>my data</td><td>more data</td></tr>');
또는 존재 하지 않고 테이블 의 첫 번째 TBODY
에 새 행을 추가합니다 . (나는 어떤 버전의 jQuery에서 정보를 찾지 못했습니다.THEAD
TFOOT
.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>
예시 된 a b
열은 이후에 삽입 된 1 2
후가 아니라, 3 4
두 번째 예이다. 테이블이 비어 있으면 jQuery TBODY
는 새 행을 만듭니다 .
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);
데이터 테이블 참조 fnAddData 데이터 테이블 API
간단한 방법으로 :
$('#yourTableId').append('<tr><td>your data1</td><td>your data2</td><td>your data3</td></tr>');