【问题标题】:Repeat / Add div after clicking the button单击按钮后重复/添加 div
【发布时间】:2017-04-12 00:59:36
【问题描述】:

我连续有 3 个字段,我没有使用表格。所以我想知道点击+按钮时是否可以添加使用div标签的新“行”?

代码如下。

<div id="order-details-booking">
        <blockquote>Self-order Menu</blockquote>
        <div class="row">
            <div class="input-field col s4">
                <input type="text" class="item-code" placeholder="Item Code"/>
            </div>
            <div class="input-field col s2">
                <input type="text" class="qty" placeholder="Qty" />
            </div>
            <div class="input-field col s5">
                <input type="text" class="order-remarks" placeholder="Remarks" />
            </div>
            <div class="col s1">
                <i class="material-icons">add</i>
            </div>
        </div>
    </div>

最初只有 1 行。


我想要的是,点击+按钮后,它会像这样添加一个新行。

【问题讨论】:

  • 是的,很有可能。
  • 是的,但是使用您显示的 html 有点毫无意义 - 它会创建重复的 id 属性(无效的 html)并且您在提交时将无法绑定到模型跨度>
  • 添加新行是可能的,但主要问题是您打算如何将其发布到服务器?您是依赖 MVC 默认模型绑定器还是使用 jquery 并在发送到服务器之前格式化您的数据..
  • @Reddy,我想使用 MVC 绑定到数组。我正在使用 RavenDB,我打算像在一个预订中有一个数组模型 FoodOrder [] 一样传递数据。但我发现我很难绑定到数组。或者你还有什么比这更好的主意吗?
  • @jenna_3108,RavenDB 与您的问题无关。如果要在视图中动态添加集合项,请参考this answer

标签: javascript jquery html css asp.net-mvc


【解决方案1】:

您可以使用 jQuery 添加和删除带有id increment 的表单字段。请看下面的sn-p:

// Cloning Form
  var id_count = 1;
  $('.add').on('click', function() {
    var source = $('.form-holder:first'), clone = source.clone();
    clone.find(':input').attr('id', function(i, val) {
      return val + id_count;
    });
    clone.appendTo('.form-holder-append');
    id_count++;
  });

// Removing Form Field
$('body').on('click', '.remove', function() {
    var closest = $(this).closest('.form-holder').remove();
  });
.form-holder {
  display: flex;
  margin-bottom: 10px;
}

.input-field input {
  width: 100px;
}

.add, .remove {
  display: block;
  border: 1px solid #ccc;
  padding: 2px 10px;
  margin-left: 10px;
  cursor: pointer;
}

.add:hover {
  background: #eee;
}

.remove {
  display: none;
}

.form-holder-append .remove {
  display: block;
}

body {
  margin: 20px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<div id="order-details-booking">
        <blockquote>Self-order Menu</blockquote>
        <div class="row">
          <div class="form-holder col-xs-12">
            <div class="input-field col s4">
                <input type="text" id="item-code" placeholder="Item Code"/>
            </div>
            <div class="input-field col s2">
                <input type="text" id="item-code" placeholder="Qty" />
            </div>
            <div class="input-field col s5">
                <input type="text" id="item-code" placeholder="Remarks" />
            </div>
            <div class="col s1">
                <i class="material-icons remove">- remove</i>
            </div>
        </div>

          <div class="form-holder-append"></div>
          <div class="row">
                    <div class="col-xs-4">
                          <i class="material-icons add">+ add</i>
            </div></div>
    </div>
</div>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>

希望这会有所帮助!

【讨论】:

  • 如何使用 Angular 4 实现这一目标
【解决方案2】:

使用clone() 方法。它将创建您要附加的行的重复对象。使用此对象向您的父 div 添加新行。

find("input[type='text']").val("") 将清除在原始元素中输入的任何值。

另外,正如其他人所指出的,您的 HTML 已将 ids 附加到元素上,这些元素在复制时会创建具有相同 ID 的多个元素。您应该避免在这种情况下使用ids,并使用类作为选择器。

$('#order-details-booking').on('click','.material-icons',function(){
   $(this).closest('.row').clone().appendTo('#order-details-booking').find("input[type='text']").val("");//use closest to avoid multiple selection and clear input text elements
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<div id="order-details-booking">
        <blockquote>Self-order Menu</blockquote>
        <div class="row">
            <div class="input-field col s4">
                <input type="text" id="item-code" placeholder="Item Code"/>
            </div>
            <div class="input-field col s2">
                <input type="text" id="item-code" placeholder="Qty" />
            </div>
            <div class="input-field col s5">
                <input type="text" id="item-code" placeholder="Remarks" />
            </div>
            <div class="col s1">
                <i class="material-icons">add</i>
            </div>
        </div>
    </div>

【讨论】:

  • parents() 将选择与选择器匹配的所有祖先(这可能会在以后重新设计页面后导致问题);这种方法会主动创建具有重复 id 属性的元素,从而呈现无效的 HTML。顺便说一句,你完全没有解释代码的作用以及它在你的答案中是如何工作的(为了让 OP 有用地理解它)。
  • @DavidThomas tnx 指出了这一点。我已经编辑了代码以使用closest() 而不是parents()。为了更清楚,我还在下一次编辑中添加了 cmets 和参考
  • 这最终会触发多个点击事件
  • @TechBreak 对不起,我没有找到你的朋友。请帮助我了解这将如何发生?
  • 对于所有具有类 .material-icons 的“+”将在每次点击时触发?您的克隆方法也将克隆值。我想 OP 想要干净的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 2019-01-01
相关资源
最近更新 更多