2011-11-01 7 views
30

끝에 추가 단추가있는 테이블이 있습니다. 이 단추를 클릭하면 현재 테이블 행 아래에 새 테이블 행을 만들 수 있습니다. 이 행의 입력 필드를 비워두기를 원합니다. .clone()을 사용하여이 작업을 수행하려하지만 페이지의 모든 행을 복제합니다. 도와주세요. 감사합니다jQuery 테이블 행 복제

스크립트

$("input.tr_clone_add") 
     .live('click', function(){ 
       $(this).closest('.tr_clone') 
        .clone() 
        .insertAfter(".tr_clone") 
     }); 

HTML

<table width="100%" border="0" cellspacing="0" cellpadding="0" id="table-data"> 
<tr> 
<td>Name</td> 
<td>Location</td> 
<td>From</td> 
<td>To</td> 
<td>Add</td> 
</tr> 
<tr class="tr_clone"> 
<td><input type="text" autofocus placeholder="who" name="who" ></td> 
<td><input type="text" autofocus placeholder="location" name="location" ></td> 
<td><input type="text" placeholder="Start Date" name="datepicker_start" class="datepicker"></td> 
<td><input type="text" placeholder="End Date" name="datepicker_end" class="datepicker"></td> 
<td><input type="button" name="add" value="Add" class="tr_clone_add"></td> 
</tr> 
</table><!-- /table#table-data --> 
+0

을 followinng 같다 즉 새로운 행이 덮어 쓰기에 입력 된 값 복제 된 행의 값) ...? – Tomm

+0

안녕하세요. Tomm, 나는 이름 값이 충돌 할 것이라고 생각하지 않았습니다. 아마도 tr 클래스에 숫자를 추가 할지라도 어떤 점에서는 차별화 요소를 추가해야 할 것입니다. –

+2

나는 보통 "템플리트"를 사용하여 복제하는데, 이는 CSS를 통해 "display : none"으로 지정됩니다. – hafichuk

답변

51

당신의 문제가 당신의 insertAfter : 모든 .tr_clone

.insertAfter(".tr_clone") 

삽입 :

일치하는 요소 집합은이 매개 변수로 지정된 요소 다음에 삽입됩니다.

중복하려는 행에 after을 사용하고 싶을 것입니다. 그리고 약간 .find(':text').val('')은 복제 된 텍스트 입력을 지 웁니다. 이 같은 :

var $tr = $(this).closest('.tr_clone'); 
var $clone = $tr.clone(); 
$clone.find(':text').val(''); 
$tr.after($clone); 

데모 : http://jsfiddle.net/ambiguous/LAECx/

는 내가 혼자 떠 났어요 있도록 입력 포커스와 끝까지해야하는 확실하지 않다. 여기

+0

그 $는 못생긴 습관입니다. – mzvarik

+1

@mzvarik 왜? 주요한'$ '는 일반적인 요소가 아닌 jQuery로 요소가 싸여 있다는 공통적 인 알림입니다. PHP를 사용하여 손가락이 생각하기 때문에 어디에서나 사용할 수 있지만 나쁜 습관이 될 수 있습니다. –

13

당신은 갈 :

$(table).delegate('.tr_clone_add', 'click', function() { 
    var thisRow = $(this).closest('tr')[0]; 
    $(thisRow).clone().insertAfter(thisRow).find('input:text').val(''); 
}); 

라이브 데모 :http://jsfiddle.net/RhjxK/4/


업데이트 : jQuery를 이벤트를 위임의 새로운 방법입니다

$(table).on('click', '.tr_clone_add', function() { … }); 
+0

'.closest ('tr)'다음에'[0]이 나오고, 피들에서'table = $ ('# table-data') [0]'의 이유는 무엇입니까? 왜 그냥'var thisRow = $ (this) .closest ('tr');'? (유용한 예제, btw, +1) – gibberish

+0

@gibberish jQuery 객체에'[0]'을 적용하면 해당 jQuery 객체 안에있는 첫 번째 DOM 요소가 반환됩니다. 이 패턴은 오래된 습관입니다. DOM 객체에 대한 참조를 변수에 직접 저장하는 것을 좋아합니다. 'thisRow' 변수를 DOM 객체를 포함하는 DOM 객체 또는 jQuery 객체를 받는지 상관하지 않는 새로운'$()'에 전달할 것이기 때문에이 경우에는 그냥두면됩니다. –

+0

매우 감사합니다, Sime에게 감사드립니다. 나는 항상 당신의 대답을 기다리고 있습니다. 그들은 잘 쓰여지고 영리하며 교육적입니다. 또한 [webPlatformDaily] (http://webplatformdaily.org/)의 성공을 축하합니다. 나는 당신의 통찰력있는 글쓰기가 베스트 오브 더 베스트 (Best of the Best)에 의해 평가되는 것을 본다. 잘받을 만하다. 잘 했어. – gibberish

4

이 시도 V ariation :

$(".tr_clone_add").live('click', CloneRow); 

function CloneRow() 
{ 
    $(this).closest('.tr_clone').clone().insertAfter(".tr_clone:last"); 
} 
4

아래 코드는 마지막 행을 복제하고 테이블의 마지막 행 다음에 추가합니다 :

var $tableBody = $('#tbl').find("tbody"), 
$trLast = $tableBody.find("tr:last"), 
$trNew = $trLast.clone(); 

$trLast.after($trNew); 

근무 예 : http://jsfiddle.net/kQpfE/2/

1

이 시도합니다.

HTML

<!-- Your table --> 
<table width="100%" border="0" cellspacing="0" cellpadding="0" id="table-data"> 
    <thead> 
     <tr> 
      <th>Name</th> 
      <th>Location</th> 
      <th>From</th> 
      <th>To</th> 
      <th>Add</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td><input type="text" autofocus placeholder="who" name="who" ></td> 
      <td><input type="text" autofocus placeholder="location" name="location" ></td> 
      <td><input type="text" placeholder="Start Date" name="datepicker_start" class="datepicker"></td> 
      <td><input type="text" placeholder="End Date" name="datepicker_end" class="datepicker"></td> 
      <td><input type="button" name="add" value="Add" class="tr_clone_add"></td> 
     </tr> 
    <tbody> 
</table> 

<!-- Model of new row --> 
<table id="new-row-model" style="display: none"> 
    <tbody> 
     <tr> 
      <td><input type="text" autofocus placeholder="who" name="who" ></td> 
      <td><input type="text" autofocus placeholder="location" name="location" ></td> 
      <td><input type="text" placeholder="Start Date" name="datepicker_start" class="datepicker"></td> 
      <td><input type="text" placeholder="End Date" name="datepicker_end" class="datepicker"></td> 
      <td><input type="button" name="add" value="Add" class="tr_clone_add"></td> 
     </tr> 
    <tbody> 
</table> 

스크립트

$("input.tr_clone_add").live('click', function(){ 
    var new_row = $("#new-row-model tbody").clone(); 
    $("#table-data tbody").append(new_row.html()); 
}); 
0

이 코드를 사용해보십시오이 내가 복제와 복제 된 요소를 제거하기 위해 다음 코드를 사용, 나 또한 새로운 클래스를 사용했다 (newClass) 이것은 t와 함께 자동으로 추가 될 수 있습니다. 그는 새로 복제 요소를 제거하기 위해 ..

$(".tr_clone_add").live('click', function() { 
    var $tr = $(this).closest('.tr_clone'); 
    var newClass='newClass'; 
    var $clone = $tr.clone().addClass(newClass); 
    $clone.find(':text').val(''); 
    $tr.after($clone); 
}); 

HTML 복제에 대한

복제.

$(".tr_clone_remove").live('click', function() { //Once remove button is clicked 
    $(".newClass:last").remove(); //Remove field html 
    x--; //Decrement field counter 
}); 

HTML 난 당신이 또한 'name` 매개 변수 (데이터 충돌을 방지하기 위해 업데이트 할 생각

<tr class="tr_clone"> 
         <!-- <td>1</td>--> 
         <td><input type="text" class="span12"></td> 
         <td><input type="text" class="span12"></td> 
         <td><input type="text" class="span12"></td> 
         <td><input type="text" class="span12"></td> 
         <td><input type="text" class="span10" readonly> 
         <span><a href="javascript:void(0);" class="tr_clone_add" title="Add field"><span><i class="icon-plus-sign"></i></span></a> <a href="javascript:void(0);" class="tr_clone_remove" title="Remove field"><span style="color: #D63939;"><i class="icon-remove-sign"></i></span></a> </span> </td> </tr>