【问题标题】:jQuery: cannot conditionally add class to children elementsjQuery:不能有条件地将类添加到子元素
【发布时间】:2020-12-14 06:06:37
【问题描述】:

我正在尝试有条件地将“close-3”类添加到祖先的所有子“输入”元素中。祖先应该包含类“.summon-next-element.on-sub-sub-level”。但是,我没有任何效果 - 没有添加类,控制台中没有错误,什么都没有。这是 jQuery:

$('.summon-next-element.on-sub-sub-level').each(function() {
  if ($(this).find("input").is(":checked")) {
    $(this).nextAll(".summoned-element").first().find("input").addClass("opened-3").removeClass("closed-3");
  } else {
    $(this).nextAll(".summoned-element").first().find("input").addClass("closed-3").removeClass("opened-3");
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="summon-next-element on-sub-sub-level">
  <input type="radio" name="frais_renovation" id="frais_renovation_oui" class="oui">
  <label for="frais_renovation_oui">oui</label>
</div>
<div class="checkbox">
  <input type="radio" name="frais_renovation" id="frais_renovation_non" class="non">
  <label for="frais_renovation_non">non</label>
</div>

<div class="summoned-element">

  <div class="checkbox info-circle right">
    <input type="radio" name="frais_renovation_justificatifs" id="frais_renovation_fichier">
    <label for="frais_renovation_fichier">
                Mes justificatifs 1
            </label>
  </div>

  <div class="checkbox info-circle right">
    <input type="radio" name="frais_renovation_justificatifs" id="frais_renovation_tickets" checked>
    <label for="frais_renovation_tickets">
                Mes justificatifs 2
            </label>
  </div>

</div>
<!-- end of summoned element -->

非常感谢您的帮助!

【问题讨论】:

  • .summon-next-element.on-sub-level 中的任何输入均未检查。所以它将删除类,而不是添加它。
  • 如果没有检查输入,它应该删除类“opened-3”,但应该添加类“close-3”。也不行....
  • 您需要另外将代码包装在单选按钮的选中事件中
  • @sergeykuznetsov,是的,问题似乎出在单选按钮上,因为它在复选框上运行良好。如何将代码包装在选中的事件中?对不起...
  • @BenViatte,我给了你一个解决方案。请检查。

标签: html jquery children


【解决方案1】:

还需要将您的逻辑包装在单选按钮选择事件中,根据该事件减少类的分配/删除:

$(this).on('click', function() { ... }

在您的代码中,还有一个不正确的类引用。

$('div').find('input[type=radio]').each(function() {
  $(this).on('click', function() {
    $('input[type=radio]').addClass("closed-3").removeClass("opened-3");
      if ($(this).is(":checked")) {
        $(this).addClass("opened-3").removeClass("closed-3");
      } 
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="summon-next-element on-sub-sub-level">
  <input type="radio" name="frais_renovation" id="frais_renovation_oui" class="oui">
  <label for="frais_renovation_oui">oui</label>
</div>
<div class="checkbox">
  <input type="radio" name="frais_renovation" id="frais_renovation_non" class="non">
  <label for="frais_renovation_non">non</label>
</div>

<div class="summoned-element">

  <div class="checkbox info-circle right">
    <input type="radio" name="frais_renovation_justificatifs" id="frais_renovation_fichier">
    <label for="frais_renovation_fichier">
                Mes justificatifs 1
            </label>
  </div>

  <div class="checkbox info-circle right">
    <input type="radio" name="frais_renovation_justificatifs" id="frais_renovation_tickets" checked>
    <label for="frais_renovation_tickets">
                Mes justificatifs 2
            </label>
  </div>

</div>
<!-- end of summoned element -->

【讨论】:

    【解决方案2】:

    问题是你没有循环遍历每个输入,所以当你检查输入是否被检查时,它总是会选择.on-sub-sub-level里面的第一个。

    尝试:

    $('.summon-next-element.on-sub-sub-level ~ .summoned-element input').each(function() {
      if ($(this).is(":checked")) {
        $(this).addClass("opened-3").removeClass("closed-3");
      } else {
        $(this).addClass("closed-3").removeClass("opened-3");
      }
    });
    

    演示

    $('.summon-next-element.on-sub-sub-level ~ .summoned-element input').each(function() {
      if ($(this).is(":checked")) {
        $(this).addClass("opened-3").removeClass("closed-3");
      } else {
        $(this).addClass("closed-3").removeClass("opened-3");
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="summon-next-element on-sub-sub-level">
      <input type="radio" name="frais_renovation" id="frais_renovation_oui" class="oui">
      <label for="frais_renovation_oui">oui</label>
    </div>
    <div class="checkbox">
      <input type="radio" name="frais_renovation" id="frais_renovation_non" class="non">
      <label for="frais_renovation_non">non</label>
    </div>
    
    <div class="summoned-element">
    
      <div class="checkbox info-circle right">
        <input type="radio" name="frais_renovation_justificatifs" id="frais_renovation_fichier">
        <label for="frais_renovation_fichier">
                    Mes justificatifs 1
                </label>
      </div>
    
      <div class="checkbox info-circle right">
        <input type="radio" name="frais_renovation_justificatifs" id="frais_renovation_tickets" checked>
        <label for="frais_renovation_tickets">
                    Mes justificatifs 2
                </label>
      </div>
    
    </div>
    <!-- end of summoned element -->

    【讨论】:

    • 谢谢。它似乎更进一步,但仍然没有添加开放或封闭的课程....
    • 如果selector1 选择的任何元素满足selector2,而不仅仅是第一个,$("selector1").is("selector2") 为真。
    • @BenViatte 我不关注你,如果你运行演示并检查输入,那么你可以看到已添加关闭或打开的输入
    • 你说得对,它似乎可以处理被剪断的代码,但由于某种原因,在我的网站上它并没有......只是为了让事情变得更难......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2014-04-10
    相关资源
    最近更新 更多