【问题标题】:Jquery - Unable to delete dynamically created elementsJquery - 无法删除动态创建的元素
【发布时间】:2015-10-29 20:54:21
【问题描述】:

我使用BootStarp3 作为骨架。我正在动态创建几个元素(在单击按钮时),可以选择使用另一个按钮删除每个创建的元素。问题是我只能删除第一个元素,其他创建的动态按钮似乎没有反应,不知道出了什么问题。

JSfiddle 代码在这里。

HTML:

<div id="reward-container">
    <div class="center-block col-lg-10 col-md-10 col-sm-12 text-left" id="">
           <div class="center-block col-centered bg-white review text-left"> 
            <div class="row">
                <div class="col-lg-6 col-md-5 col-sm-5">
                  <div class="form-group form-group-default">
                    <label>label</label>
                    <input type="text" class="form-control" placeholder="e.g">
                  </div>
                </div>
              </div>
        </div>

   <button class="btn btn-sm pull-right remove"><b>Remove</b></button>
    </div> 
</div>

<button class="btn btn-lg btn-info m-t-70 marg" id="add">add more</button>

JS:

$("#add").click(function(){
    var count = $("#reward-container").children();
    existingRewards = $("#reward-container").children();
       var newGift = $('<div class="center-block col-lg-10 col-md-10 col-sm-12 text-left marg" id='+count+'> \
                   <div class="center-block col-centered bg-white review text-left"> \
                    <div class="row"> \
                        <div class="col-lg-6 col-md-5 col-sm-5"> \
                          <div class="form-group form-group-default"> \
                            <label class="to-uppercase">label</label> \
                            <input type="text" class="form-control" placeholder="e.g"> \
                          </div> \
                        </div> \
                      </div> \
                </div> \
                <button class="btn btn-sm pull-right remove"><b>Remove</b></button> \
            </div>');
    $(newGift).appendTo("#reward-container");

});

//remove field

$(".remove").click(function(e){
    console.log("remove clicked");
    var father=e.target.parentElement.parentElement;
    existingRewards = $("#reward-container").children();
    if(existingRewards.length==1){
        console.log("one field remains");
    }else{
        $(father).remove();
    }
});

【问题讨论】:

    标签: javascript jquery html twitter-bootstrap-3


    【解决方案1】:

    那是因为您需要事件委托。当前,您将单击处理程序附加到 .remove 元素,但它们不存在(您动态生成它们)。要捕获对新元素的点击,请将点击处理程序更改为如下内容:

    $("#reward-container").on("click", ".remove", function (e) { ... });
    

    您还可以改进您的功能以使用closest 方法而不是使用父母导航:

    $("#reward-container").on("click", ".remove", function(e){
        console.log("remove clicked");
        var $div = $(this).closest("div.center-block");
        existingRewards = $("#reward-container").children();
        if(existingRewards.length==1){
             console.log("one field remains");
        }else{
             $div.remove();
        }
    });
    

    JSFiddle

    有关更多信息,请参阅我的其他类似答案:

    【讨论】:

    • 感谢您的回答。你,只是为了理解这一点,对于动态创建的元素,我需要捕获点击事件,因为创建的元素在页面创建时在 DOM 中“未注册”?
    • @undroid 没错!你说对了。通过使用$(".remove"),您可以选择页面上的现有元素。使用我的解决方案,您选择容器并说:当有人单击此容器时,如果单击是在 .remove 元素上,抓住它! 它发生了.
    • 太棒了。再次感谢!
    • 另一个快速的问题。单击按钮后,有时单击是在父容器上而不是在按钮本身上注册的,到底发生了什么?在此示例中,我仅在单击按钮上的文本时才捕获按钮单击。
    • @undroid 是的,我修好了。使用closest(见编辑)。 :) 很高兴我能帮上忙。
    【解决方案2】:

    this post ,你必须使用

    $('body').on('click', '.remove', function() {
        // do something
    });
    

    代替

    $(".remove").click( function() {
        // do something
    });
    

    【讨论】:

      【解决方案3】:

      当您绑定点击删除时,只有一个类为remove 的元素。当您添加另一个元素时,您应该再次绑定该点击。

      $("#add").click(function(){
      var count = $("#reward-container").children();
      existingRewards = $("#reward-container").children();
         var newGift = $('<div class="center-block col-lg-10 col-md-10 col-sm-12 text-left marg" id='+count+'> \
                     <div class="center-block col-centered bg-white review text-left"> \
                      <div class="row"> \
                          <div class="col-lg-6 col-md-5 col-sm-5"> \
                            <div class="form-group form-group-default"> \
                              <label class="to-uppercase">label</label> \
                              <input type="text" class="form-control" placeholder="e.g"> \
                            </div> \
                          </div> \
                        </div> \
                  </div> \
                  <button class="btn btn-sm pull-right remove"><b>Remove</b></button> \
              </div>');
      $(newGift).appendTo("#reward-container");
      $(".remove").click(function(e){
          console.log("remove clicked");
          var father=e.target.parentElement.parentElement;
          existingRewards = $("#reward-container").children();
          if(existingRewards.length==1){
              console.log("one field remains");
          }else{
              $(father).remove();
          }
      });
      
      //remove field
      
      $(".remove").click(function(e){
         console.log("remove clicked");
         var father=e.target.parentElement.parentElement;
         existingRewards = $("#reward-container").children();
         if(existingRewards.length==1){
            console.log("one field remains");
         }else{
            $(father).remove();
         }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        相关资源
        最近更新 更多