【问题标题】:jQuery cloning an element and changing attributes of child elements to keep them uniquejQuery克隆元素并更改子元素的属性以保持它们的唯一性
【发布时间】:2012-05-09 01:45:42
【问题描述】:

我查看了一些类似问题的答案,但我并不完全理解这些答案。

我有一个表格,其中包含一些输入,如下所示...

<table class="form right 40 rewardclone_1">
<tr>        
<td><label for="financial_goal_1">Amount</label></td>
<td>Pledge <span class="dollar">&#36;</span><input id="financial_goal_1" class="text dollars" type="text" name="financial_goal_1" /> or more</td>
</tr>
<tr>
    <td><label for="maximum_1">Maximum</label></td>
<td><input id="maximum_1" class="text dollars" type="text" name="maximum_1" /> available (blank for unlimited)</td>
</tr>
<tr>
<td><label for="reward_1">Reward:</label></td>
<td><textarea id="reward_1" name="reward_1"></textarea></td>
</tr>
</table>

我设法创建了一个按钮,当单击该按钮时,它会克隆整个表格。

$('#add_reward').click(function() {         
  $('.rewardclone').clone().appendTo('#rewards_container');     
});

问题是我需要属性上的所有数字(reward_1、maximum_1 等)在每次克隆表时递增。

任何帮助将不胜感激!

jQuery 级别:初学者。

谢谢。

【问题讨论】:

标签: javascript jquery attributes clone unique


【解决方案1】:

由于它是一个小表格,我更喜欢将其用作模板,而不是克隆和查找匹配的元素。

注意:根据服务器技术,您也可以第一次从服务器加载rewardTableTmpl,然后使用模板进一步使用。

DEMO

$(function() {
    var rewardTableTmpl = '<table class="form right 40 rewardclone">' +
        '<tr><td><label for="financial_goal_{NUM}">Amount</label></td>' +
        '<td>Pledge <span class="dollar">&#36;</span><input id="financial_goal_{NUM}" class="text dollars" type="text" name="financial_goal_{NUM}" /> or more</td>' +
        '</tr><tr>' +
        '<td><label for="maximum_{NUM}">Maximum</label></td>' +
        '<td><input id="maximum_{NUM}" class="text dollars" type="text" name="maximum_{NUM}" /> available (blank for unlimited)</td>' +
        '</tr><tr>' +
        '<td><label for="reward_{NUM}">Reward:</label></td>' +
        '<td><textarea id="reward_{NUM}" name="reward_{NUM}"></textarea></td>' +
         '</tr></table>';

    $('#add_reward').click(function() {
        $('#rewards_container').append(rewardTableTmpl.replace(/{NUM}/g, $('rewardclone').length + 1));
    });
});

【讨论】:

  • 在你的函数中,你应该使用一个计数器。当我打印出 {NUM} 时,class.lenth 似乎不起作用。它没有改变。所以我添加了 'var count =0; $('#add_reward').click(function() { count++; $('#rewards_container').append(rewardTableTmpl.replace(/{NUM}/g, count)); });'
【解决方案2】:

对于您的情况,这将是一个简单的解决方案:

$('#add_reward').click(function() {         
    var $x = $('.rewardclone').clone();
    $x.appendTo('#rewards_container');
    $x.find('input[id], textarea[id], label[for]').each(function() {
        if($(this).is('label')) {
            var new_id = parseInt($(this).attr('for').split('_').pop(), 10) + 1;
            $(this).attr('for', new_id);
        } else {
            var new_id = parseInt(this.id.split('_').pop(), 10) + 1;
            this.id = new_id;
        }
    });     
});

【讨论】:

  • +1 但如果这是简单的解决方案,我不想想象复杂的解决方案......
【解决方案3】:

我对 Selvakumar Arumugam 的回答做了一个小的调整,因为当我打印出 {NUM} 时,它并没有改变。

$(function() {
    var rewardTableTmpl = '<table class="form right 40 rewardclone">' +
        '<tr><td><label for="financial_goal_{NUM}">Amount</label></td>' +
        '<td>Pledge <span class="dollar">&#36;</span><input id="financial_goal_{NUM}" class="text dollars" type="text" name="financial_goal_{NUM}" /> or more</td>' +
        '</tr><tr>' +
        '<td><label for="maximum_{NUM}">Maximum</label></td>' +
        '<td><input id="maximum_{NUM}" class="text dollars" type="text" name="maximum_{NUM}" /> available (blank for unlimited)</td>' +
        '</tr><tr>' +
        '<td><label for="reward_{NUM}">Reward:</label></td>' +
        '<td><textarea id="reward_{NUM}" name="reward_{NUM}"></textarea></td>' +
         '</tr></table>';

var count =0;
     $('#add_reward').click(function() {
         count++;
        $('#rewards_container').append(rewardTableTmpl.replace(/{NUM}/g, count));
    });

});

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多