You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态添加class后执行removeClass无效问题排查

解决幼儿来宾选择时婴儿床选项的显示/隐藏问题

问题背景

我有一个div,希望在选中特定radio选项时显示。该div位于form中,当幼儿来宾(在radio选项中选择"yes")将出席时,隐藏的.guest__cot div应该显示,仅在有幼儿出席时展示婴儿床选项。

目前div能成功显示,但再次选择radio选项中的"no"时,该div仍保持可见($(".guest__cot").removeClass("guest__cot--visible");未执行)。

复现步骤:

  • 为"Name 1 (Toddler)"选择"yes"
  • .guest__cot div出现
  • 现在为"Name 1 (Toddler)"选择"no",div仍保持可见

实际需求:若有任意幼儿选择"yes"则展示.guest__cot,否则隐藏它。

问题原因

你维护show-cot-field类的逻辑存在漏洞:当选中同组的"no" radio时,仅移除了当前"no" radio的类,但之前选中的"yes" radio仍保留着该类,导致$('.member__attendance-input').hasClass(showCotField)始终返回true,无法触发隐藏操作。

解决方案

直接检查所有选中的幼儿radio中是否存在value为"yes"的选项,无需额外维护类,逻辑更可靠:

修改后的JavaScript代码

(function($) {
  $(".member__attendance-input.is_toddler").on('change', function() {
    // 筛选出所有选中的、幼儿身份且选择出席的radio
    var hasToddlerAttending = $(".member__attendance-input.is_toddler:checked[value='yes']").length > 0;
    
    // 根据结果切换显示状态
    if (hasToddlerAttending) {
      $(".guest__cot").addClass("guest__cot--visible");
    } else {
      $(".guest__cot").removeClass("guest__cot--visible");
    }
  });
})(jQuery);

完整可运行代码

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<div class="rsvp">
  <div class="container">
    <div class="row">
      <div class="col-12">
        <form>
          <!-- member 1 -->
          <div class="member d-flex flex-column">
            <span class="member__name">Name 1 (Toddler)</span>
            <div class="member__attendance member__options d-flex">
              <div class="member__attendance-option">
                <input class="member__attendance-input is_toddler" id="attending-yes-0" type="radio" name="attending-0" value="yes" required />
                <label class="input-label" for="attending-yes-0">Yes</label>
              </div>
              <div class="member__attendance-option">
                <input class="member__attendance-input is_toddler" id="attending-no-0" type="radio" name="attending-0" value="no" required />
                <label class="input-label" for="attending-no-0">No</label>
              </div>
            </div>
          </div>

          <!-- member 2 -->
          <div class="member d-flex flex-column">
            <span class="member__name">Name 2 (Toddler)</span>
            <div class="member__attendance member__options d-flex">
              <div class="member__attendance-option">
                <input class="member__attendance-input is_toddler" id="attending-yes-1" type="radio" name="attending-1" value="yes" required />
                <label class="input-label" for="attending-yes-1">Yes</label>
              </div>
              <div class="member__attendance-option">
                <input class="member__attendance-input is_toddler" id="attending-no-1" type="radio" name="attending-1" value="no" required />
                <label class="input-label" for="attending-no-1">No</label>
              </div>
            </div>
          </div>

          <!-- member 3 -->
          <div class="member d-flex flex-column">
            <span class="member__name">Name 3 (Adult)</span>
            <div class="member__attendance member__options d-flex">
              <div class="member__attendance-option">
                <input class="member__attendance-input" id="attending-yes-2" type="radio" name="attending-2" value="yes" required />
                <label class="input-label" for="attending-yes-2">Yes</label>
              </div>
              <div class="member__attendance-option">
                <input class="member__attendance-input" id="attending-no-2" type="radio" name="attending-2" value="no" required />
                <label class="input-label" for="attending-no-2">No</label>
              </div>
            </div>
          </div>
          
          <div class="guest__cot">
            Show this div if either toddler options are "yes"
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
.rsvp {
  padding: 60px 0;
}

form {
  padding: 40px;
  border: 1px solid #000000;
}

.input-label {
  margin: 0 20px 0 0;
}

.member {
  margin-bottom: 30px;
}

.member__name {
  display: block;
  margin-bottom: 15px;
}

.member__options {
  margin-bottom: 20px;
}

.guest__cot{
  opacity: 0;
  height: 0;
  margin: 0;
  pointer-events: none;
}

.guest__cot--visible {
  opacity: 1;
  height: auto;
  margin-top: 20px;
  pointer-events: auto;
}

说明

  • 直接通过选择器$(".member__attendance-input.is_toddler:checked[value='yes']")精准筛选目标元素,避免类维护带来的残留问题
  • 通过判断匹配元素的数量,准确掌握是否有幼儿出席,从而控制婴儿床选项的显示状态
  • 代码逻辑简洁直观,减少出错概率

内容的提问来源于stack exchange,提问作者Freddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:20:47