【问题标题】:How to make sure only a single checkbox remains checked out of many?如何确保只有一个复选框保持选中状态?
【发布时间】:2017-03-31 23:24:58
【问题描述】:

我有一些带有复选框的 HTML(由于生成 HTML 的库,使用单选按钮不方便 - 要添加详细信息,我需要自己在库之外破解一个,或者找到一种非常规的方法来制作图书馆为我工作)。

我需要模拟单选按钮功能,特别是 - 在选中许多其他框时,所有其他盒子都应不选中。

我正在尝试取消选中所有框,然后选中我单击的那个。我的 jQuery/JS 失败了。你能帮忙吗?

$(function() {
  //check first box
  $("input.duty:first").attr("checked", "true");

  //clicking unchecked box should check that box
  //unchecks all others
  $(".duty").on('click', function(event) {
    $("input.duty").attr("checked", "false");
    $(this).prop("checked", true);
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div id="casePointsFieldset">
  <fieldset class="casePointFieldset">
    <div>
      <label><span>Duty:</span>
                        <input type="checkbox" name="casePoints[0][isDutyPoint]" class="duty" value="0"></label>
    </div>
  </fieldset>
  <fieldset class="casePointFieldset">

    <div>
      <label><span>Duty:</span>
                        <input type="checkbox" name="casePoints[1][isDutyPoint]" class="duty" value="0"></label>
    </div>
  </fieldset>
  <fieldset class="casePointFieldset">
    <div>
      <label><span>Duty:</span>
                        <input type="checkbox" name="casePoints[2][isDutyPoint]" class="duty" value="0"></label>
    </div>
  </fieldset>
</div>

【问题讨论】:

    标签: javascript jquery html jquery-selectors


    【解决方案1】:
    • 在所有情况下都使用.prop,而不是混合使用.prop/.attr
    • 使用truefalse 而不是字符串。

    更新了sn-p:

    $(function() {
      //check first box
      $("input.duty:first").prop("checked", true);
    
      //clicking unchecked box should check that box
      //unchecks all others
      $(".duty").on('click', function(event) {
        $("input.duty").prop("checked", false);
        $(this).prop("checked", true);
      });
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    
    <div id="casePointsFieldset">
      <fieldset class="casePointFieldset">
        <div>
          <label><span>Duty:</span>
                            <input type="checkbox" name="casePoints[0][isDutyPoint]" class="duty" value="0"></label>
        </div>
      </fieldset>
      <fieldset class="casePointFieldset">
    
        <div>
          <label><span>Duty:</span>
                            <input type="checkbox" name="casePoints[1][isDutyPoint]" class="duty" value="0"></label>
        </div>
      </fieldset>
      <fieldset class="casePointFieldset">
        <div>
          <label><span>Duty:</span>
                            <input type="checkbox" name="casePoints[2][isDutyPoint]" class="duty" value="0"></label>
        </div>
      </fieldset>
    </div>

    【讨论】:

    • 仅供参考,您无法使用此逻辑取消选中复选框。如果他们想模仿单选按钮的行为,那可能适合 OP thgouh
    • 这确实适合我无法取消选择的地方。
    【解决方案2】:

    实现此目的的最简单方法是在单击所有其他复选框时调用prop('checked', false),如下所示:

    $(".duty").first().prop('checked', true).end().on('click', function(event) {
      $('.duty').not(this).prop('checked', false);
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <div id="casePointsFieldset">
      <fieldset class="casePointFieldset">
        <div>
          <label>
            <span>Duty:</span>
            <input type="checkbox" name="casePoints[0][isDutyPoint]" class="duty" value="0">
          </label>
        </div>
      </fieldset>
      <fieldset class="casePointFieldset">
        <div>
          <label>
            <span>Duty:</span>
            <input type="checkbox" name="casePoints[1][isDutyPoint]" class="duty" value="0">
          </label>
        </div>
      </fieldset>
      <fieldset class="casePointFieldset">
        <div>
          <label>
            <span>Duty:</span>
            <input type="checkbox" name="casePoints[2][isDutyPoint]" class="duty" value="0">
          </label>
        </div>
      </fieldset>
    </div>

    【讨论】:

    • 我只是想问.. 有没有一种简单的方法可以确保您不能取消选中(单个)复选框?又名让它被选中?我正在尝试$('.duty').is(this).prop('checked', true);,但它没有这样做
    • 有 - 使用@freedomn-m 在他的回答中发布的逻辑
    【解决方案3】:

    尝试将检查属性设置为布尔值false,而不是字符串"false"

    使用字符串会被解释为true

    $("input.duty").attr("checked", false);
    

    【讨论】:

      【解决方案4】:

      如果您只需要一个复选框,则应考虑单选按钮。

      https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/radio

      这应该更适合用例。如果您在实施方面需要任何帮助,请告诉我。

      我知道您说单选很难是因为您的用例,但您应该认真考虑使用单选按钮功能扩展您的库。从 HTML 的角度来看,它更正确,从 UI/UX 的角度来看也是如此。

      【讨论】:

      • 虽然我同意,但 OP 确实声明:using radio buttons is not convenient due to the library that generates the HTML
      • 从 UI 和标准的角度来看,使用复选框是没有意义的。如果这是一个问题,他们应该扩展他们的图书馆。感谢您的反对。
      • 好吧,他们是同时进来的,所以看起来确实是这样,我很抱歉。
      • 我同意这个答案;这是我会发布的。程序员的便利永远不应该超过用户界面的一致性、奥卡姆剃刀、KISS、最小惊讶原则和一般用户友好性。
      • 谢谢。在我的情况下.. 3-4 行 JS/jQuery 完成这项工作比弄清楚如何根据我的需要扭曲库的项目要好。我可能可以研究一下图书馆的做法,但是 JS 方式现在对我来说要好得多,因为它可以工作。如果我找到一种方法来破解Zend\Form 以跨越不同字段集的Radio 按钮,我会使用单选按钮。否则,它会创建一个不跨越的Fieldset...也就是说,我必须自己通过 HTML 破解一个,或者认真考虑如何破解库,以便它满足我的需要。
      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      相关资源
      最近更新 更多