缺少针对遍历 dom 的正确元素

Posted

技术标签:

【中文标题】缺少针对遍历 dom 的正确元素【英文标题】:missing to target the correct element traversing up the dom 【发布时间】:2021-05-15 08:19:20 【问题描述】:

我的 html 结构如下(相关部分):

<div class="col-md-6">
    <div class="card card-warning">something here</div>
</div>
<div class="col-md-6">
    <div class="card">something else here</div>
</div>

我希望能够从第一张卡片中删除 card-warning 类,并将其添加到第二张单选按钮的切换按钮(每张卡片中)。

到目前为止,我的代码将类正确添加到第二张卡,但未能从第一张卡中删除。

$(this).closest('div.card').addClass('card-warning').prev('div.card').removeClass('card-warning');

$(this) 是选中的单选按钮,.closest('div.card').addClass('card-warning') 按预期正确添加了类。关键是.prev('div.card').removeClass('card-warning') 不是针对前一张卡的。

我做错了什么?

【问题讨论】:

你能贴出带有收音机的html结构来试试sn-p 【参考方案1】:

您选择的最接近的div.card 没有任何先前的兄弟姐妹,因此.prev 失败。改为导航到 parent 元素的上一个元素:

$(this)
  .closest('div.card')
  .addClass('card-warning')
  .parent()
  .prev()
  .children('div.card')
  .removeClass('card-warning');

$('#foo').on('click', function() 
  $(this)
    .closest('div.card')
    .addClass('card-warning')
    .parent()
    .prev()
    .children('div.card')
    .removeClass('card-warning');
);
.card-warning 
  background-color: yellow;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="col-md-6">
    <div class="card card-warning">something here</div>
</div>
<div class="col-md-6">
    <div class="card" id="foo">something else here</div>
</div>

如果您在任何给定时间在 DOM 中只有一个 .card-warning,而不是动态导航到父母/兄弟姐妹等,只需首先在 DOM 中选择一个带有 .card-warning 的元素:

$('.card-warning').removeClass('card-warning');
$(this)
  .closest('div.card')
  .addClass('card-warning');

【讨论】:

如果我想从第一个切换到第二个而不是返回(显然),它可以工作。既然它应该在两个内容之间切换,有没有办法让.parent().prev() 通常找到具有此类的“其他”div?【参考方案2】:

我不知道这是否是您搜索的内容,但在 sn-p 下方显示示例

首先将类添加到最近的 div 卡

然后从除当前使用的其他 div.card 中删除类

.parents('.row').find('div.card').not($(this).parents('div.card'))

$(function() 

  $(".apply").on("click", function() 
    $(this).closest('div.card').addClass('card-warning').parents('.row').find('div.card').not($(this).parents('div.card')).removeClass("card-warning");

  )

)
.apply 
  margin-left:20px;
  color: red;


.card-warning 
  background-color: yellow !important;
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
  
  <div class="row">
    <div class="col-md-6">
      <div class="card card-warning">something here <input name="apply" class="apply" type="radio"/></div>
    </div>
    <div class="col-md-6">
      <div class="card">something else here <input name="apply" class="apply" type="radio"/></div>
    </div>

  </div>
  

</div>

【讨论】:

这是我一直在寻找的通用目的。在这种情况下,由于此类只能有一个 div,因此我在另一个答案中使用了解决方法 @LelioFaieta ,好极了 :)

以上是关于缺少针对遍历 dom 的正确元素的主要内容,如果未能解决你的问题,请参考以下文章

DOM 遍历-同胞

DOM遍历 - 后代

jQuery 遍历 – 后代

jQuery遍历-后代

遍历祖先同胞后代

jQuery 遍历 – 祖先