我有一个脚本应该检查表中的所有复选框.它会在第一次检查它们,然后在它之后取消选中它们.但是,当我试图重新检查它们时,没有任何反应.
jquery:
$('#selectAll').click(function(e){
var table= $(e.target).closest('table');
$('td input:checkbox',table).attr('checked',e.target.checked);
});
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
这是行为的小提琴:
单击一次后为什么不起作用?
简单的 jQuery 解决方案,检测表内已检查的输入,并更改主(selectAll)复选框的状态:
$(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));
})
});Run Code Online (Sandbox Code Playgroud)
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);
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
或普通解决方案:
let table = document.querySelector('.table'); // table selector
let selectAll = table.querySelector('#selectAll'); // main checkbox inside table thead
let tdCheckbox = table.querySelectorAll('tbody input[type="checkbox"]'); // checboxes inside table body
let tdCheckboxChecked = 0; // checked checboxes
// Select or deselect all checkboxes depending on main checkbox change
selectAll.addEventListener('click', () => {
Array.from(tdCheckbox).forEach(el => {
el.checked = selectAll.checked;
})
});
// Toggle main checkbox state to checked when all checkboxes inside tbody tag is checked
Array.from(tdCheckbox).forEach(el => {
el.addEventListener('change', function(e){
tdCheckboxChecked = Array.from(tdCheckbox).filter(el => el.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.checked = tdCheckboxChecked === tdCheckbox.length;
});
});Run Code Online (Sandbox Code Playgroud)
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);
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
79041 次 |
| 最近记录: |