因为我花了几天时间才想找到一个实现我想要的好方法,所以我想我会发布这个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>
(当然,只有工作的删除按钮)
我认为做这样的事情非常简单易行,但我很难找到解决方案。
答案 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那样的解决方案是不切实际的。