使用jQuery复制元素

时间:2013-11-26 14:56:19

标签: javascript jquery

我正在为我的组织创建一个可重用的表单脚本。一个功能是复制表单元素。对于这个例子,我要求提供活动日期,但可以选择在活动中添加一天。

HTML

<ul>
    <li>
        <label>Date of event<sup>*</sup></label>
        <input class="field-required" type="text" name="event_date" readonly="readonly" />
    </li>           
    <li>
        <ul class="float-fields">
            <li>
                <label>Start time<sup>*</sup></label>
                <input class="field-required" type="text" name="event_start_time" data-validation="time" />
            </li>
            <li>
                <label>End time<sup>*</sup></label>
                <input class="field-required" type="text" name="event_end_time" data-validation="time" />
            </li>
        </ul>
    </li>

    <a class="duplicate-fields" data-fields="all">&plus; Add date</a>
</ul>

JavaScript(jQuery)

    //duplicate fields
    $('.duplicate-fields').each(function() {

        //put fields in a variable
        if($(this).attr('data-fields') == 'all') {
            var html = $(this).parent('ul').html();
        }

        $(this).click(function() {
            $($(this).parent('ul')).append(html);
        })

    });

现在这样做是复制ul的html(所有的li)并附加它,如你所料。我需要做的是排除'.duplicate-fields'链接,以便不重复链接,并将li插入现有链接之上。

我喜欢.clone()可以做的事情,但我需要将它放在一个变量中,以便我可以复制不确定数字的字段。有了克隆,我可以说:

var html = $(this).parent('ul').clone();
$(html).find('.duplicate-fields').remove();

但据我所知,如果我使用clone(),我只能复制一次。 关于我应该怎么做的任何建议?这是可重用的,因为只需要编辑HTML以备将来使用(没有特殊的类或id)。

3 个答案:

答案 0 :(得分:1)

尝试使用for循环迭代克隆。

更新代码:

 $('.duplicate-fields').each(function () {
     if ($(this).attr('data-fields') == 'all') {
         var noOfClones = 5;
         var el = $(this).parent();
         for (var i = 0; i < noOfClones; i++) {
             var html = el.clone();
             html.appendTo('body');            
         }
     }
 });

最后,点击a标记时

$(document).on('click', '.duplicate-fields', function () {
    var noOfClones = 5;  //you can change it to repeatitve times
    var el = $(this).parent();
    for (var i = 0; i < noOfClones; i++) {
        var html = el.clone();
        html.find('a.duplicate-fields').remove(); //remove the a tag in cloned objects
        html.appendTo('body'); //append back
    }
});

JSFiddle

答案 1 :(得分:0)

这个怎么样?

//duplicate fields
$('.duplicate-fields').each(function() {
    //put fields in a variable
    if($(this).attr('data-fields') == 'all') {
        var html = $(this).parent('ul').find('li:not(:has(ul.float-fields))').html(); 
        html += $(this).parent('ul').find('li:has(ul.float-fields)').html();
    }

    $(this).click(function() {
        $(this).before(html);
    })

});

答案 2 :(得分:0)

根据User3013738的回答,这对我有用。

    //duplicate fields
    var html = '';
    $('.duplicate-fields').each(function() {
        //put fields in a variable
        if($(this).attr('data-fields') == 'all') {
            $(this).parent('ul').find('li:not(li li)').each(function() {
                html += '<li>' + $(this).html() + '</li>';
            });
        }

        $(this).click(function() {
            $(this).before(html);
        })

    });