在前端開發的過程中,特別是數據表格的處理,我們經常碰到checkbox全選與取消以及動態的根據子類的選中狀態確定全選checkbox是否“checked”
全選與取消全選
<html>
<body>
<table border="1">
<tr>
<th><input type="checkbox" onclick="swapCheck()" /></th>
<th>Month</th>
<th>Savings</th>
</tr>
<tr>
<td><input type="checkbox" /></td>
<td>January</td>
<td>$100</td>
</tr>
<tr>
<td><input type="checkbox" /></td>
<td>February</td>
<td>$150</td>
</tr>
</table>
<script type="text/javascript"
src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
//checkbox 全選/取消全選
var isCheckAll = false;
function swapCheck() {
if (isCheckAll) {
$("input[type='checkbox']").each(function() {
this.checked = false;
});
isCheckAll = false;
} else {
$("input[type='checkbox']").each(function() {
this.checked = true;
});
isCheckAll = true;
}
}
</script>
//優化版本
<script type="text/javascript">
var isCheckAll = false;
function swapCheck() {
$("input[type='checkbox']").each(function() {
this.checked = !isCheckAll;
});
isCheckAll = !isCheckAll;
}
</script>
</body>
</html>
還要滿足兩個常用場景:
當然我們實現這個功能還是不夠的,考慮以下2個常用場景,
場景1:如果用戶在全選完之后,把部分行數據“取消”了選中;
場景2:用戶通過手動點擊行內的checkbox最終實現了“全選”的狀態
通過前端實現
js代碼:
<script type="text/javascript">
function listenCheckbox(){
$("tr td input[type='checkbox']").on('change',function(){
//總量
var total=$("tr td input[type='checkbox']").length;
////實際被選中的
var exact=$("tr td input[type='checkbox']:checked").length;
////檢測所有的check選項的有多少與總量進行對比
$("tr th input[type='checkbox']")[0].checked=(total==exact); //true or false
})
}
listenCheckbox()
</script>