【问题标题】:Unable to clone rows of table using jquery无法使用 jquery 克隆表的行
【发布时间】:2013-08-02 16:54:54
【问题描述】:

这是我在 div 中的表格:

<div class="employmentHistory">
        <table class="employmentHistoryForm">
            <tr>

                    <th>Name</th>
                    <th>Position</th>
                    <th>Action</th>

            </tr>
            <tr class = "row">
                <td>
                    <g:textField id="name" name="company" class="company"></g:textField></td>
                <td>
                    <g:textField id="position" name="position" class="pos" ></g:textField></td>
                <td><input type="button" class="deleteThisRow"  value="Delete"/></td>
            </tr>
        </table>
    <g:textField name="sumCompany" id="destination" ></g:textField>
    </div>

这是我克隆上表第二行的 jQuery 脚本:

$(document).ready(function(){
            //This line clones the row inside the '.row' class and transforms it to plain html.
            //var clonedRow = $('.row').clone().html();
            var clonedRow=$('.row').clone().html().find("input").each(function() {
                $(this).val('').attr('id', function(_, id) { return id + index });
            }).end();

            //This line wraps the clonedRow and wraps it <tr> tags since cloning ignores those tags
            var appendRow = '<tr class = "row">' + clonedRow + '</tr>';

            $('#btnAddMore').click(function(){
                //this line get's the last row and appends the appendRow when it finds the correct row.
                $('.employmentHistoryForm tr:nth-child(2)').after(appendRow);
            });

            //when you click on the button called "delete", the function inside will be triggered.
            $('.deleteThisRow').live('click',function(){
                var rowLength = $('.row').length;
                //this line makes sure that we don't ever run out of rows.
                if(rowLength > 1){
                    deleteRow(this);
                }else{
                    $('.employmentHistoryForm tr:last').after(appendRow);
                    deleteRow(this);
                }
            });

            function deleteRow(currentNode){
                $(currentNode).parent().parent().remove();
            }
            index++;
        });

当使用上述脚本中的行时:

var clonedRow = $('.row').clone().html();

代码完美地克隆了表格行并将其附加到表格的末尾。但它复制了文本字段的 id 字段,我想为克隆的行分配唯一的 id,我尝试这样做:

var clonedRow=$('.row').clone().html().find("input").each(function() {
                    $(this).val('').attr('id', function(_, id) { return id + index });
                }).end();

但是现在查询根本不起作用。那么我在哪里弄错了,解决方案是什么?

【问题讨论】:

  • 如果您想克隆具有唯一 ID 的元素,那么这些元素确实不是唯一的,因此不应具有唯一 ID。为什么不给他们上课呢?
  • @BradM 好的,即使提供类也可以,但文本字段的每一行中的类必须是唯一的。我应该如何通过对上述代码的最小更改来实现这一点?
  • 我不知道你背后的逻辑/推理,但我认为你过度分析了这一点。唯一需要唯一的是行(如果您基于索引,从技术上讲已经是唯一的),但是您可以为行提供 data-* 属性以获得更精确的唯一性。无论在一行中单击什么文本框/按钮,始终向上遍历 dom 到唯一行并读取它的索引/数据-*。一旦您知道事件发生的唯一行,您就可以以此为基础制定逻辑。

标签: jquery gsp


【解决方案1】:

我做了类似的事情,我有一个隐藏部分,其中包含我想要克隆的标记。克隆后我会通过javascript设置id。

<div id="sectionToClone">
    <input class="company" type="text" />
    <input class="pos" type="text" />
    <!-- More stuff here -->
</div>

然后在我的 JavaScript 中我会做这样的事情:

var clonedSection = $("#sectionToClone").clone();
var newMarkup = clonedSection.attr("id","section" + idCounter);
newMarkup.find(".company").attr("id","company" + idCounter);
newMarkup.find(".pos").attr("id","pos" + idCounter);
idCounter++;
$("#sectionToAppendTo").append(newMarkup);

然后,当替换发生时,每个部分都会有唯一的 id。当需要获取所有值时,我会在 0 处启动一个单独的计数器并递增到 idCounter 以将值拉出到长度为 idCounter 的数组中,并根据需要处理它们。每个查找看起来都类似于$("#sectionX .company").val()$("#sectionX .pos) 等...

在您的 CSS 中,使用 ID 选择器隐藏要克隆的部分:

#sectionToClone{
    display: none;
}

然后,当您在 JavaScript 中更改 ID 时,克隆部分变得可见,因为 CSS 规则不适用于它。

【讨论】:

  • 它对我正在做的事情很有效。如果每个部分都有唯一的 ID,则不需要在每个元素上都使用它,因为您可以使选择器足够具体以仅找到一个输入。代码可能需要稍作调整,因为我大部分都是凭记忆完成的。
  • 我对代码进行的快速编辑:在我的示例中从克隆中删除 .html() ,否则您将拥有一个 HTML 字符串并且 .attr 方法将引发错误。跨度>
  • clonedSection.attr("id","section" + idCounter);会导致将相同的 id 分配给 内的元素,并且在我的情况下不起作用,因为在我的 中有多个输入字段。
  • 如果你将它分配给 TR 就像:&lt;tr id="row1"&gt; 并且每个输入都有不同的类,你可以像$("#row1 .company")$("#row1 .pos") 那样访问它,那么下一行将是$("row2 .company")$("row2 .pos") 等等。我承认我不熟悉 gsp,所以如果它需要每个输入的唯一 ID,那么我可以看到它是如何出现的问题。您可以使用上述选择器在克隆后获取每个元素并以这种方式设置它的 id。所以克隆,设置 id,然后使用newMarkup.find(".company").attr("id","company" + idCounter); 设置每个克隆部分中输入的 id。
  • 我终于解决了这个问题。我使用了类似于你的代码,并为 中的每个输入元素分配了一个唯一的类名。因此,如果我需要访问输入元素,我可以使用跨列重复的名称属性和跨行重复的类属性来访问它。谢谢!!
猜你喜欢
相关资源
最近更新 更多
热门标签