2011-12-06 20 views
1

jQueryとJSの両方に関する私の非常に限られた知識で、ボタンをクリックするとtablerowを複製する小さなスクリプト(Nicola Peluchettiの助けを借りて)を作った。これは魅力のように動作しますが、私はそれにdatepickerを追加したいと思います。これもうまくいきますが、コピーされたフィールドやその逆では一度だけです。おそらく、日付ピッカーがただ1つのフィールドしかないと「考える」ためです。jQueryクローンtablerowとdatepickerを追加

私はこの問題を解決するためにいくつかの情報源を見つけましたが、やはり初心者の知識では難しいことです。私はこれで約2日間遊んでおり、解決することはできません。私は得ることはありません

<script type='text/javascript'>//<![CDATA[ 
$(window).load(function(){ 
$("input[type='button'].AddRow").click(

function() { 
var index = $(this).closest('tr').index(); 
if (index > 0) { 
$(this).closest('tr').remove(); 
} else { 
$(this).closest('tr').clone(true).prependTo($(this).closest('table')); 
$(this).val(i++); 
/* $('.startdatum').removeClass('hasDatepicker').datepicker({dateFormat: 'mm-dd-yy'}); */ 
} 

}); 
});//]]> 
</script> 

HTML

<table width="960" border="0" align="center" cellpadding="10" cellspacing="0"  class="contentblock"> 
<tr> 
<td width="140"><strong>Startdatum</strong></td> 
<td><input name="startdatum[]" type="text" class="startdatum" value="dd/mm/jjjj" /> 
<script> 
$(function() { 
    $('.startdatum').removeClass('hasDatepicker').datepicker({ 
dateFormat: 'mm-dd-yy' 
}); 
}); 
</script> 
    <select name="locatie[]" id="locatie[]"> 
    <option value="" selected></option> 
    </select></td> 
    <td width="143"><strong>Dekking</strong></td> 
    <td width="133"><select name="dekking[]" id="dekking[]"> 
    <option value="" selected></option> 
    </select></td> 
    <td width="145"><input type="Button" value="Add Row" class="AddRow"></td> 
    </tr> 
    </table> 

可能な解決策:

Datepickerplugin:

は、誰も私を助けてくださいもらえますか?

答えて

2

解決策の1つは、日付ピッカーを破棄し、別のIDを追加した後に再作成することです。私は少しあなたのコードを変更:ここ

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css" type="text/css" media="all"> 
<table width="960" border="0" align="center" cellpadding="10" cellspacing="0"  class="contentblock"> 
<tr> 
<td width="140"><strong>Startdatum</strong></td> 
<td><input id='datePicker' name="startdatum[]" type="text" class="startdatum" value="dd/mm/jjjj" /> 
    <select name="locatie[]" id="locatie[]"> 
    <option value="" selected></option> 
    </select></td> 
    <td width="143"><strong>Dekking</strong></td> 
    <td width="133"><select name="dekking[]" id="dekking[]"> 
    <option value="" selected></option> 
    </select></td> 
    <td width="145"><input type="Button" value="Add Row" class="AddRow"></td> 
    </tr> 
    </table> 

<input type="hidden" value="0" id="counter"> 

$('.startdatum').removeClass('hasDatepicker').datepicker({ 
    dateFormat: 'mm-dd-yy' 
}); 


$("input[type='button'].AddRow").live('click', 
function() { 
    var index = $(this).closest('tr').index(); 
    if (index > 0) { 
     $(this).closest('tr').remove(); 
    } else { 


     var $tr = $(this).closest('tr').clone(true); 
     var $input = $tr.find('input.startdatum'); 
     var index = $('input#counter').val(); 
     var id = 'datepicker' + index; 
     index++; 
     $('input#counter').val(index); 
     $input.attr('id', id).data('index', index); 
     console.log(index); 
     $tr.prependTo($(this).closest('table')); 
     $('.startdatum').each(function() { 
      $(this).datepicker('destroy'); 
      $(this).datepicker({ 
       dateFormat: 'mm-dd-yy' 
      }); 
     }); 

    } 

}); 

フィドルhttp://jsfiddle.net/nicolapeluchetti/87QCx/1/

編集 - あなたが他のすべての後に行を添付する必要がある場合:あなたは

 $(this).closest('table').append($tr); 

 $tr.prependTo($(this).closest('table')); 

を変更する必要があります

+0

おかげニコラ起こります!もう1つの質問と私はあなたを盗むのを止めることを約束します;)新しい行が最初の行の下に追加されました。これをテーブルの最下部に追加することも可能ですか? – mat

+0

@mat私は私の答えを編集 –

+0

非常にうまく、すべての仕事のために多くのおかげで動作します!私が自分自身を把握しようとしていることの1つは、最初の行に[追加]ボタンの代わりに削除ボタンを追加する方法です。これはあなたの元のスクリプトにあった:$(this).val( "DelRow"); – mat

0

これは少し遅れているかもしれませんが、上記の提案はすべて私のためにはうまくいきませんでした。このための簡単な解決策です。

まず、問題の原因: JQueryがdatepickerを要素idに割り当てます。もしあなたが要素をクローンしていれば、同じIDも同様にクローン化されるかもしれません。どのjQueryは好きではありません。ヌル参照エラーまたは最初の入力フィールドに割り当てられている日付を受け取ると、クリックした入力フィールドに関係なく終了することがあります。

ソリューション:

1)日付ピッカー 2を破壊する)すべての入力フィールド 3に新しい固有のIDを割り当てる)あなたの入力は、この

<input type="text" name="ndate[]" id="date1" class="n1datepicker"> 
のようなものであることを確認し、各入力

のための日付ピッカーを割り当てます

クローンする前に、日付ピッカーを破棄する

$('.n1datepicker').datepicker('destroy'); 

クローンを作成した後、同様

var i = 0; 
$('.n1datepicker').each(function() { 
    $(this).attr("id",'date' + i).datepicker(); 
    i++; 
}); 

をこれらの行を追加し、魔法が

関連する問題