jQuery clone tablerow并添加datepicker

时间:2011-12-06 12:08:08

标签: jquery datepicker duplicates clone

由于我对jQuery和JS的知识非常有限,我制作了一个小脚本(在Nicola Peluchetti的帮助下),当点击一个按钮时,它复制了一个桌面。这就像一个魅力,但是,我想添加一个datepicker。这也很有效,但只有一次而不是复制的字段,反之亦然。这可能是因为日期选择器“认为”只有一个字段。

我找到了几个解决问题的来源,但再次,凭借我的新手知识,这很难。我玩这个差不多两天了,无法解决它。

<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 个答案:

答案 0 :(得分:2)

一种解决方案是销毁日期选择器并在向它们添加不同的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/

编辑 - 如果您需要在所有其他行之后附加行:您必须更改

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

in

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

答案 1 :(得分:0)

这可能有点晚了,但上面的所有建议对我都不起作用,我想出了一个简单的解决方案。

首先,导致问题的原因是: JQuery将datepicker分配给元素id。如果你是克隆元素,那么也可以克隆相同的id。哪个jQuery不喜欢。您最终可能会收到空引用错误或分配给第一个输入字段的日期,无论您单击哪个输入字段。

解决方案:

1)销毁datepicker 2)为所有输入字段分配新的唯一ID 3)为每个输入分配datepicker

确保您的输入是这样的

<input type="text" name="ndate[]" id="date1" class="n1datepicker">

在克隆之前,销毁datepicker

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

克隆后,也可以添加这些行

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

并且魔术发生了