【问题标题】:How to delete parent element using jQuery如何使用jQuery删除父元素
【发布时间】:2011-07-11 08:48:05
【问题描述】:

我的 jsp 中有一些列表项标签。每个列表项内部都有一些元素,包括一个称为删除的链接(“a”标记)。我只想在单击链接时删除整个列表项。

这是我的代码结构:

$("a").click(function(event) {
  event.preventDefault();
  $(this).parent('.li').remove();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li id="191" class="li">
  <div class="text">Some text</div>
  <h4><a href="URL">Text</a></h4>
  <div class="details">
    <img src="URL_image.jpg">
    <span class="author">Some info</span>
    <div class="info"> Text
      <div class="msg-modification" display="inline" align="right">
        <a name="delete" id="191" href="#">Delete</a>
      </div>
    </div>
  </div>
</li>

但这不起作用。我是 jQuery 的新手,所以我尝试了一些东西,例如:

$(this).remove();

这行得通,它会在点击时删除链接。

$("#221").remove();

这可行,它会删除指示的列表项,但它不是“动态的”。

有人可以给我小费吗?

【问题讨论】:

    标签: javascript jquery parent


    【解决方案1】:

    只需使用.closest() 方法:$(this).closest('.li').remove();
    它从当前元素开始,然后沿着链向上寻找匹配元素,并在找到匹配元素后立即停止。

    .parent() 只访问元素的 direct 父元素,即与 .li 不匹配的 div.msg-modification。所以它永远不会到达您正在寻找的元素。

    除了.closest()(检查当前元素然后爬上链)之外的另一个解决方案是使用.parents() - 但是,这需要注意的是它不会在找到匹配元素后立即停止(并且它不检查当前元素,而是检查 only 父元素)。在您的情况下,这并不重要,但对于您尝试做的事情,.closest() 是最合适的方法。


    另一个重要的事情:

    切勿对多个元素使用相同的 ID。这是不允许的,并且会导致非常难以调试的问题。从链接中删除id="191",如果您需要访问点击处理程序中的ID,请使用$(this).closest('.li').attr('id')。实际上,如果您使用data-id="123" 然后使用.data('id') 而不是.attr('id') 来访问它会更干净(因此您的元素ID 不需要类似于(数据库?)行具有的任何ID)

    【讨论】:

    • @Thifmaster: .parents("li:first") 应该在第一个匹配元素处停止
    • @reporter:是的。但这不是.parents() 的功能,而仅仅是由于选择器。在他的情况下,如果父母中没有其他.li,即使.parents('.li') 也可以工作..
    • 非常好的解决方案和非常有用的评论!非常感谢:D(我会删除链接中的 id,我不需要它。谢谢!)
    • @ThifMaster:不幸的是,有时你不得不滥用一些东西;-)
    • @thief 我们如何使用最接近()删除动态添加的内容?
    【解决方案2】:

    如何使用unwrap()

    <div class="parent">
    <p class="child">
    </p>
    </div>
    

    使用后 - $(".child").unwrap() - 会的;

    <p class="child">
    </p>
    

    【讨论】:

    • 这应该是答案,然后它会删除孩子。
    • 简单实用。推荐。
    【解决方案3】:

    使用parents() 代替parent()

    $("a").click(function(event) {
      event.preventDefault();
      $(this).parents('.li').remove();
    });
    

    【讨论】:

    • 这将删除所有带有 li 的父母
    【解决方案4】:

    删除父级:

    $(document).on("click", ".remove", function() {
           $(this).parent().remove(); 
    });
    

    删除所有父母:

    $(document).on("click", ".remove", function() { 
           $(this).parents().remove();
    });
    

    【讨论】:

    • 当您创建了一些实时元素时,这非常有效。很棒
    【解决方案5】:

    你也可以这样用:

    $(this)[0].parentNode.remove();
    

    【讨论】:

      【解决方案6】:

      我偶然发现了这个问题一小时。一个小时后,我尝试调试,这有所帮助:

      $('.list').on('click', 'span', (e) => {
        $(e.target).parent().remove();
      });
      

      HTML:

      <ul class="list">
        <li class="task">some text<span>X</span></li>
        <li class="task">some text<span>X</span></li>
        <li class="task">some text<span>X</span></li>
        <li class="task">some text<span>X</span></li>
        <li class="task">some text<span>X</span></li>
      </ul>
      

      【讨论】:

        【解决方案7】:
        $('#' + catId).parent().remove('.subcatBtns');
        

        【讨论】:

        • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        猜你喜欢
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多