2011-11-01 11 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

私は通常、 "template:"を使ってクローンを作成します。これは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/)がますます成功していることをお祝いします。私はあなたの洞察力のある執筆がベスト・オブ・ザ・ベストによって評価されていることを知っています。まあ値する。よくやった。 – 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で自動的に追加できます彼は、新たにHTMLクローン要素を除去するため

クローニングのための...

$(".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); 
}); 

をクローン化しました。

$(".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>