【问题标题】:Jquery select all checkboxes in tableJquery选择表中的所有复选框
【发布时间】:2013-10-10 11:36:09
【问题描述】:

我有一个脚本应该检查表中的所有复选框。它第一次检查它们,之后取消选中它们。但是,当我尝试重新检查它们时,没有任何反应。

jquery:

$('#selectAll').click(function(e){
    var table= $(e.target).closest('table');
    $('td input:checkbox',table).attr('checked',e.target.checked);
});

HTML:

<table>
    <tr>
        <th>
            <input type="checkbox" id="selectAll" />
        </th>
        <th>
            hi!
        </th>
    </tr>
    <tr>
        <td>
            <input type="checkbox" id="1"/>
        </td>
        <td>
            hi!
        </td>
    </tr>
    <tr>
        <td>
            <input type="checkbox" id="2"/>
        </td>
        <td>
            hi!
        </td>
    </tr>
</table>

这是行为的一个小提琴:

http://jsfiddle.net/EEJrU/

为什么点击一次就不行了?

【问题讨论】:

  • 如果您使用 JQuery 1.7.2 而不是 1.10.1,它可以与您的代码一起使用

标签: jquery checkbox


【解决方案1】:

您需要使用.prop() 而不是.attr()

$('#selectAll').click(function(e){
    var table= $(e.target).closest('table');
    $('td input:checkbox',table).prop('checked',this.checked);
});

演示:Fiddle

Attributes vs. Properties

【讨论】:

  • 漂亮、简洁、可移植的代码。 +1 请注意,在单击事件后,我无法保持选中“全选”复选框,因此我必须在函数中添加以下行:e.stopPropagation();
  • 为了在所有其他复选框上触发更改事件,您应该将 .change() 添加到行尾。如:$('td input:checkbox',table).prop('checked',this.checked).change();
【解决方案2】:

简单的 jQuery 解决方案,检测表格内的选中输入,以及主(全选)复选框的状态更改:

$(document).ready(function() {
  var $selectAll = $('#selectAll'); // main checkbox inside table thead
  var $table = $('.table'); // table selector 
  var $tdCheckbox = $table.find('tbody input:checkbox'); // checboxes inside table body
  var tdCheckboxChecked = 0; // checked checboxes

  // Select or deselect all checkboxes depending on main checkbox change
  $selectAll.on('click', function () {
    $tdCheckbox.prop('checked', this.checked);
  });

  // Toggle main checkbox state to checked when all checkboxes inside tbody tag is checked
  $tdCheckbox.on('change', function(e){
    tdCheckboxChecked = $table.find('tbody input:checkbox:checked').length; // Get count of checkboxes that is checked
    // if all checkboxes are checked, then set property of main checkbox to "true", else set to "false"
    $selectAll.prop('checked', (tdCheckboxChecked === $tdCheckbox.length));
  })
});
table {
  width: 100%;
  border-collapse: collapse;
  border: 2px solid #222;
}

table tr th {
  background: #333;
  color: #eee;
}

table tr:nth-child(odd) td {
  background: #ececec;
}

td, th {
  padding: 10px 14px;
  text-align: center;
  border: none;
}

.checkbox {
  position: relative;
}

.checkbox [type="checkbox"] {
  position: absolute;
  visibility: hidden;
  pointer-events: none;
}

.checkbox [type="checkbox"] + label {
  position: relative;
  display: block;
  width: 20px;
  height: 20px;
  border: 2px solid;
  cursor: pointer;
  border-radius: 2px;
  will-change: color;
  transition: .2s color ease-in-out;
}

table thead .checkbox [type="checkbox"] + label:hover,
table thead .checkbox [type="checkbox"] + label:hover:after {
  color: #d80;
}

table tbody .checkbox [type="checkbox"] + label:hover,
table tbody .checkbox [type="checkbox"] + label:hover:after {
  color: #8d0;
}

.checkbox [type="checkbox"] + label:after {
  content: '';
  position: absolute;
  width: 5px;
  height: 12px;
  top: 50%;
  left: 50%;
  border-bottom: 2px solid;
  border-right: 2px solid;
  margin-top: -2px;
  opacity: 0;
  transform: translate(-50%, 0%) rotate(45deg) scale(.75);
  will-change: opacity, transform, color;
  transition: .17s opacity ease-in-out, .2s transform ease-in-out, .2s color ease-in-out;
}

.checkbox [type="checkbox"]:checked + label:after {
  opacity: 1;
  transform: translate(-50%, -50%) rotate(45deg) scale(1);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="table">
  <thead>
    <tr>
      <th>
        <div class="checkbox">
          <input type="checkbox" id="selectAll">
          <label for="selectAll"></label>
        </div>
      </th>
      <th>Email</th>
      <th>Join date <i class="arrow bottom"></i></th>
    </tr>
  </thead>
  
  <tbody>
    <tr class="active">
      <td>
        <div class="checkbox">
          <input type="checkbox" id="tr-checkbox1">
          <label for="tr-checkbox1"></label>
        </div>
      </td>
      <td>example@gmail.com</td>
      <td>21 Oct, 2016 at 11:29 pm</td>
    </tr>

    <tr>
      <td>
        <div class="checkbox">
          <input type="checkbox" id="tr-checkbox2">
          <label for="tr-checkbox2"></label>
        </div>
      </td>
      <td>some_one@aol.com</td>
      <td>03 Mar, 2018 at 08:36 am</td>
    </tr>

    <tr>
      <td>
        <div class="checkbox">
          <input type="checkbox" id="tr-checkbox3">
          <label for="tr-checkbox3"></label>
        </div>
      </td>
      <td>another@mail.net</td>
      <td>11 Jan, 2020 at 01:47 am</td>
    </tr>
  </tbody>
</table>

【讨论】:

    【解决方案3】:
        <HTML>
        <HEAD>
            <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    
        </HEAD>
        <BODY>
    
        <table border="1">
        <tr>
            <th><input type="checkbox" id="selectall"/></th>
            <th>Cell phone</th>
            <th>Rating</th>
        </tr>
        <tr>
            <td align="center"><input type="checkbox" class="case" name="case" value="1"/></td>
            <td>BlackBerry Bold 9650</td>
            <td>2/5</td>
        </tr>
        <tr>
            <td align="center"><input type="checkbox" class="case" name="case" value="2"/></td>
            <td>Samsung Galaxy</td>
            <td>3.5/5</td>
        </tr>
        <tr>
            <td align="center"><input type="checkbox" class="case" name="case" value="3"/></td>
            <td>Droid X</td>
            <td>4.5/5</td>
        </tr>
        <tr>
            <td align="center"><input type="checkbox" class="case" name="case" value="4"/></td>
            <td>HTC Desire</td>
            <td>3/5</td>
        </tr>
        <tr>
            <td align="center"><input type="checkbox" class="case" name="case" value="5"/></td>
            <td>Apple iPhone 4</td>
            <td>5/5</td>
        </tr>
        </table>
    
        </BODY>
        </HTML>
    
    
    
    
    <script type="text/javascript" charset="utf-8">
            $(document).ready(function() {
                oTable = $('#datatable').dataTable({
                    "bJQueryUI": true,
                    "sPaginationType": "full_numbers"
                });
    
                $("#selectall").click(function () {
                    var checkAll = $("#selectall").prop('checked');
                        if (checkAll) {
                            $(".case").prop("checked", true);
                        } else {
                            $(".case").prop("checked", false);
                        }
                    });
    
                $(".case").click(function(){
                    if($(".case").length == $(".case:checked").length) {
                        $("#selectall").prop("checked", true);
                    } else {
                        $("#selectall").prop("checked", false);
                    }
    
                });
            } );
    
    
    
    
        </script>
    

    【讨论】:

    • 看起来会起作用,但太过分了。您不需要放置 if 语句来确定是否要选中所有框,您只需要所有框都与 selectAll 匹配。如果有人自己全选,我确实喜欢检查以修改全选的选中状态。
    【解决方案4】:

    这可能有助于区分 prop() 和 attr()。请注意本文中的这一行.prop() vs .attr()

    “该属性值反映的是默认值而不是当前可见状态(某些旧版本的 IE 除外,因此使事情变得更加困难)。该属性不会告诉您页面上的复选框是否被选中。”

    所以一般来说,使用 prop() 而不是 attr()。

    【讨论】:

      【解决方案5】:

      万一&lt;table&gt; 中有&lt;tbody&gt;,在壁橱表中查找&lt;td&gt; 是行不通的。

      它对我来说是这样的:

      $(document).ready(function() {
          $('#selectAll').click(function(e){        
              $(this).closest('tbody').find('td input:checkbox').prop('checked', this.checked);
          });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 2013-01-24
        相关资源
        最近更新 更多