10

我有一个表单,它可以使用输入动态创建新行,每个新行上的日期输入应该有一个日期选择器。我几乎可以正常工作,但是当创建带有输入的新行时,日期选择器将不再适用于已经存在的日期字段。我玩了一整天来找出我做错了什么,但我就是不知道如何解决这个问题。

这是小提琴-> http://jsfiddle.net/HermesTrismegistus/vdFaH

我的表格如下所示:

<table id="productTable" class="table table-striped table-condensed">
     <thead>
        <tr>
         <th>Product</th>
         <th>Datum</th>
         <th>Tijd</th>
         <th>Minuten</th>
        </tr>
     </thead>
    <tbody>   
     <tr>
        <td><input id="products" class="input-medium" name="products[]" type="text" /></td>
        <td><input id="date" class="datepick input-mini" name="date[]" type="text" /></td>
        <td><input id="time" class="input-mini" name="time[]" type="text" /></td>
        <td><input id="minutes" class="input-mini" name="minutes[]" type="text" /></td>
        <td><a id="addnew" href=""><i class="icon-plus"></i></a></td>
      </tr>
    </tbody>
</table>

我拥有的 jquery 看起来像这样:

    $(function(){
        // start a counter for new row IDs
        // by setting it to the number
        // of existing rows
        $('.datepick').datepicker();

        var newRowNum = 0;

        // bind a click event to the "Add" link
        $('#addnew').click(function(){
            // increment the counter
            newRowNum = $(productTable).children('tbody').children('tr').length +1;

            // get the entire "Add" row --
            // "this" refers to the clicked element
            // and "parent" moves the selection up
            // to the parent node in the DOM
            var addRow = $(this).parent().parent();

            // copy the entire row from the DOM
            // with "clone"
            var newRow = addRow.clone();

            // set the values of the inputs
            // in the "Add" row to empty strings
            $('input', addRow).val('');

            // insert a remove link in the last cell
            $('td:last-child', newRow).html('<a href="" class="remove"><i class="icon-minus"><\/i><\/a>');

            // insert the new row into the table
            // "before" the Add row
            addRow.before(newRow);

            // add the remove function to the new row
            $('a.remove', newRow).click(function(){
                $(this).closest('tr').remove();
                return false;               
            });

            $('#date', newRow).each(function(i){
                var newID = 'date_' + i;
                $(this).attr('id',newID);
            });

            // prevent the default click
            return false;
        });
4

5 回答 5

14

试试这个,当您添加一行时,销毁所有日期选择器实例,然后在添加新行后重新绑定日期选择器。

jsFiddle 示例

于 2012-08-23T14:53:17.073 回答
2

就我而言,我clone()用来创建 datepicker 的副本。

$(".cloneDiv").clone().appendTo("#copyHolder");

然后我删除 datepicker 添加到输入元素的“类”和“id”。

$(".hasDatepicker").removeClass("hasDatepicker").removeAttr("id");

注意:由于要克隆输入元素,因此我不给它们“id”属性。所以 datepicker 会自动将“id”添加到我的 DOM 元素中。此外,如果要克隆的元素具有用户分配的“id”,这意味着至少有两个元素共享相同的“id”,那么 datepicker 将很难找到正确的一个。可以在@j08691 的答案中找到一个示例。

最后,将 datepicker 重新绑定到输入元素:

$(".inputDate").datepicker();

所有具有“inputDate”类的输入元素都将具有日期选择器。

于 2014-01-08T18:20:51.677 回答
2

添加新行后,销毁日期选择器并再次创建。它将解决问题。

这是示例

jQuery( ".datepick" ).datepicker(); //Add date picker.

$('#addnew').click(function(){
   $(".datepick").datepicker("destroy"); //Distroy the date picker.

   /* Code to add a new row */

   jQuery( ".datepick" ).datepicker(); //recreating the date picker

})
于 2018-04-26T06:17:20.453 回答
1
This is ur Answer I have done it......

 $(function(){
        // start a counter for new row IDs
        // by setting it to the number
        // of existing rows
        $('.datepick').datepicker();

        var newRowNum = 0;

        // bind a click event to the "Add" link
        $('#addnew').click(function(){
            // increment the counter
            newRowNum = $(productTable).children('tbody').children('tr').length +1;

            // get the entire "Add" row --
            // "this" refers to the clicked element
            // and "parent" moves the selection up
            // to the parent node in the DOM
            var addRow = $(this).parent().parent();

            // copy the entire row from the DOM
            // with "clone"
            var newRow = addRow.clone();

            // set the values of the inputs
            // in the "Add" row to empty strings
            $('input', addRow).val('');

            // insert a remove link in the last cell
            $('td:last-child', newRow).html('<a href="" class="remove"><i class="icon-minus"><\/i><\/a>');

            // insert the new row into the table
            // "before" the Add row
            addRow.before(newRow);

            // add the remove function to the new row
            $('a.remove', newRow).click(function(){
                $(this).closest('tr').remove();
                return false;               
            });

            $('#date', newRow).each(function(i){
              var newID = 'date_' + newRowNum;
           $(this).attr('id', newID).removeClass('hasDatepicker')
                  .removeData('datepicker')
                  .unbind()
                  .datepicker();
                 i++;
            });

            // prevent the default click
            return false;
        });
于 2015-03-25T10:47:40.703 回答
0

Chrome 控制台中显示 javascript 错误:

Uncaught TypeError: Cannot read property 'inline' of undefined 

这可能正在关闭日期选择器功能。

于 2012-08-23T14:46:45.570 回答