【问题标题】:Toggle Checkbox jQuery with onChange使用 onChange 切换复选框 jQuery
【发布时间】:2016-06-16 00:13:23
【问题描述】:

我有 2 组文本框

<div id="createPackage" style="display:block; text-align:left">
     <strong>Select Grade(s)</strong><a href="#" onclick="checkunCheckAll('grade')"><span id="selectAllgrade">Select All</span></a>
<table>
  <tbody>
     <tr>
        <td>
           <input type="checkbox" id="2" name="grade" value="2">
           <label for="2" class="label-normal">Grade 2</label>
        </td>
        <td>
           <input type="checkbox" id="3" name="grade" value="3">
           <label for="3" class="label-normal">Grade 3</label>
        </td>
        <td>
           <input type="checkbox" id="4" name="grade" value="4">
           <label for="4" class="label-normal">Grade 4</label>
        </td>
        <td>
           <input type="checkbox" id="5" name="grade" value="5">
           <label for="5" class="label-normal">Grade 5</label>
        </td>
        <td>
           <input type="checkbox" id="6" name="grade" value="6">
           <label for="6" class="label-normal">Grade 6</label>
        </td>
     </tr>
  </tbody>
</table>
<br>
<br>
  <strong>Select Subject(s)</strong><a href="#" onclick="checkunCheckAll('grade')"><span id="selectAllsubject">Select All</span></a>
<table>
  <tbody>
     <tr>
        <td class="td-left-spacing">
           <input type="checkbox" id="ela" name="subject" value="ela">
           <label for="ela" class="label-normal">ELA</label>
        </td>
        <td class="td-right-spacing">
           <input type="checkbox" id="math" name="subject" value="math">
           <label for="math" class="label-normal">Math</label>
        </td>
     </tr>
  </tbody>
</table>
<br>
<br>
<br>
<input type="submit" name="submit" id="submit" value="Create Package(s)" class="center">
</div>

我用 Javascript 编写了复选框切换

    function checkunCheckAll(name) {
    var check =  document.getElementById("selectAll" + name).innerHTML == "Select All"

    var arrMarkMail = document.getElementsByName(name);
    for (var i = 0; i < arrMarkMail.length; i++) {
        arrMarkMail[i].checked = check;
    }
    if (check)
    {
        document.getElementById("selectAll" + name).innerHTML = "Unselect All";
        document.getElementById("selectAll" + name).textContent = "Unselect All";
    }
    else
    {   
        document.getElementById("selectAll" + name).innerHTML = "Select All";
        document.getElementById("selectAll" + name).textContent = "Select All";
    }
}

但我想实现类似于此处的“全选”切换

http://jsfiddle.net/NogginBox/ScnQT/1/

但是,如果它们都被选中,我想将该范围的文本更改为“取消全选”。我还希望能够以编程方式检查每个组中是否至少有一个复选框被选中,如果是,则在底部显示提交按钮,如果不意味着该条件则隐藏。在 jQuery 中执行此操作的最简单方法是什么?如果不需要,我不想单独设置每个复选框的 onchange。

【问题讨论】:

  • 我在简单的 javascript 中切换,但是,提交框的隐藏有点涉及,我想要看起来最干净的代码。我已将我的 js 添加到问题中。
  • @IsaacLevin:这与您的问题无关,但请记住,根据 HTML 规范,以数字开头的元素 ID 在技术上是“非法的”。
  • @Cory 确定我可以在清理过程中更改它

标签: javascript jquery html


【解决方案1】:

您可以通过以下方式做到这一点:

$("input[type='checkbox'][name='grade'], input[type='checkbox'][name='subject']").on('change', function () {
     //do stuff
     var gradeCheckboxGroupChecked = $("input[type='checkbox'][name='grade']:checked"), 
         gradeCheckboxGroup = $("input[type='checkbox'][name='grade']");
     if (gradeCheckboxGroupChecked.length == gradeCheckboxGroup.length && same for the subject) {
        // or you can check for gradeCheckboxGroupChecked.not(':checked').length == 0 && subjectCheckbox.not(':checked').length == 0 instead
        //do what you need if all are selected
     } else if (gradeCheckboxGroupChecked.length > 0 || same for the subject) {
       // do actions for if atleast one is selected
     }
});

我的解决方案是部分伪代码,appologies,这是一个快速的答案。

【讨论】:

    【解决方案2】:

    试试这个

    $('[type=submit]').hide()
    $("#selectAllsubject,#selectAllgrade").click(function() {
      if (!$(this).hasClass('checked')) {
        $(this).next().find('[type=checkbox]').prop('checked', 'checked')
      } else {
        $(this).next().find('[type=checkbox]').prop('checked', '')
      }
      $(this).toggleClass('checked')
      if ($('[type=checkbox]:checked').length) {
        $('[type=submit]').show()
      } else {
        $('[type=submit]').hide()
      }
    });
    
    $('[type=checkbox]').change(function() {
      if ($('[type=checkbox]:checked').length) {
        $('[type=submit]').show()
      } else {
        $('[type=submit]').hide()
      }
    })
    

    Working Fiddle Demo

    【讨论】:

    • 这会切换,但不处理隐藏提交框
    • 我没有得到你。什么时候需要隐藏/显示提交?
    • 每组中至少有一项被选中时。它也不会将跨度的文本更改为“取消选择或选择”
    • @IsaacLevin 我已经更新了我的答案。这能满足你的需要吗? :-)
    • 有点,它仍然需要一些调整,但我可以使用它。谢谢!
    【解决方案3】:

    $("#checkAll").change(function () {
        $("input:checkbox").prop('checked', $(this).prop("checked"));
        updaeLabelText();
    });
    
    var checkboxes = $("input[type=checkbox]:not(#checkAll)")
    checkboxes.change(function () { 
    	var checked = checkboxes.filter(":checked").length;
        $("#checkAll").prop('checked', (checked >= checkboxes.length)? true: false); 
        updaeLabelText();
    });
    
    function updaeLabelText () {
    	$("#checkAll").parent().contents().last()[0].textContent = $("#checkAll").is(':checked')? ' Uncheck all' : ' Check all';
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <form action="#">
        <p><label><input type="checkbox" id="checkAll"/> Check all</label></p>
        
        <fieldset>
            <legend>Loads of checkboxes</legend>
            <p><label><input type="checkbox" /> Option 1</label></p>
            <p><label><input type="checkbox" /> Option 2</label></p>
            <p><label><input type="checkbox" /> Option 3</label></p>
            <p><label><input type="checkbox" /> Option 4</label></p>
        </fieldset>
    </form>

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 2012-12-06
      • 2012-11-17
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 2012-03-28
      • 2017-08-04
      • 2012-02-26
      相关资源
      最近更新 更多