如何使用jQuery添加(克隆)表单字段并增加id和名称

时间:2013-10-24 22:47:07

标签: jquery html forms dynamic

因为我花了几天时间才想找到一个实现我想要的好方法,所以我想我会发布这个Q& A来为他人节省一些宝贵的时间和不健康的挫折感:3。我尽可能地简化了代码(比如删除表单操作等)。

基本上,我想做的是:

<form>
    <p>
        <input type="button" value="Add phone number"> 
    </p>
</form>

成为这个(通过点击按钮):

<form>
    <div>
        <p>
            Phone number : <input type="text" name="phone_number1"> 
            <input type="button" id="remove_phone_number1" value="Remove">
        </p>
    </div>
    <p>
        <input type="button" value="Add phone number">
    </p>
</form>

并且,如果我再次点击,它将成为:

<form>
    <div>
        <p>
            Phone number : <input type="text" name="phone_number1"> 
            <input type="button" id="remove_phone_number1" value="Remove">
        </p>
    </div>
    <div>
        <p>
            Phone number : <input type="text" name="phone_number2"> 
            <input type="button" id="remove_phone_number2" value="Remove">
        </p>
    </div>
    <p>
        <input type="button" value="Add phone number">
    </p>
</form>

(当然,只有工作的删除按钮)

我认为做这样的事情非常简单易行,但我很难找到解决方案。

2 个答案:

答案 0 :(得分:17)

这就是我的所作所为! = d

由于我有许多页面使用相同的动态添加表单字段,我希望能够在每个需要它的页面中包含(php)表单的不可见模型并克隆(或许多)可见版本它根据需要。我不打算用PHP包括你,因为它不是这篇文章的内容。请记住,这是重用我的代码的可能方式。让我们潜入!

<强> HTML

<div id="phone_number_form" class="hidden">
    <p>
        Phone number : <input type="text" name="phone_number"> 
        <input type="button" id="remove_phone_number" value="Remove">
    </p>
</div>
<form>
    <p>
        <input type="button" value="Add phone number" id="add_phone_number">
    </p>
</form>

<强> CSS

.hidden {
    display: none;
}

<强>的jQuery

<script>
    $(document).ready(function(){
        //We will be using an unique index number for each new instance of the cloned form
        var phone_number_form_index=0;
        //When the button is clicked (or Enter is pressed while it's selected)
        $("#add_phone_number").click(function(){
            //Increment the unique index cause we are creating a new instance of the form
            phone_number_form_index++;
            //Clone the form and place it just before the button's <p>. Also give its id a unique index
            $(this).parent().before($("#phone_number_form").clone().attr("id","phone_number_form" + phone_number_form_index));
            //Make the clone visible by changing CSS
            $("#phone_number_form" + phone_number_form_index).css("display","inline");
            //For each input fields contained in the cloned form...
            $("#phone_number_form" + phone_number_form_index + " :input").each(function(){
                //Modify the name attribute by adding the index number at the end of it
                $(this).attr("name",$(this).attr("name") + phone_number_form_index);
                //Modify the id attribute by adding the index number at the end of it
                $(this).attr("id",$(this).attr("id") + phone_number_form_index);
            });
            //When the Remove button is clicked (or Enter is pressed while it's selected)
            $("#remove_phone_number" + phone_number_form_index).click(function(){
                //Remove the whole cloned div
                $(this).closest("div").remove();
            });
        }); 
    });
</script>

以下是一个有效的例子:http://jsfiddle.net/wc28f/3/

我希望我的帖子会帮助你们中的一些人! ^ _ ^

如果您发现任何错误或可能的优化,请发表评论,我会尽快解决它们

Fierceblood

答案 1 :(得分:3)

我无法为类似的问题找到合理,灵活的解决方案,所以我想出了这个:

我创造了一个&#39;原作&#39;元素并将其隐藏在页面上。我追加了#34; ---&#34;至需要在原始元素的任何子元素内递增的任何属性的值。

每当用户点击按钮创建原始克隆时,我创建了一个克隆,然后全局替换&#34; ---&#34;使用该克隆的HTML中的当前索引。像这样:

var $clone = $original.clone();
var cloneHTML = $clone.html().replace(/---/g, incrementedFieldNum);
$clone.html(cloneHTML);

// Insert and show the clone after the original
$original.after($clone);

我使用data属性来存储incrementedFieldNum的更新值(未在上面的代码中显示)。

希望这会有所帮助。它的代码少得多,而且我认为这是一个更通用的解决方案。我有很多嵌套元素需要增加ID和名称,所以像@Fierceblood那样的解决方案是不切实际的。