JavaScript實現(xiàn)全選與反選功能
簡介
在JavaScript中,實現(xiàn)全選和反選通常是通過操作DOM元素和事件監(jiān)聽來實現(xiàn);
全選功能:當(dāng)用戶點擊一個“全選”復(fù)選框時,頁面中所有具有相同類名的復(fù)選框都將被選中;
反選功能:用戶點擊一個“反選”復(fù)選框時,已選中的將變?yōu)槲催x中,未選中的將變?yōu)檫x中。
這里分別用原生JS和Vuejs實現(xiàn)一下
一、JavaScript實現(xiàn)
1、先看效果

2、html部分
<div class="test_checks">
<h2>JavaScript原生全選、反選功能</h2>
<input type="checkbox" id="selectAll" /> Select All
<br />
<br />
<input type="checkbox" class="checkbox" /> Item 1
<br />
<input type="checkbox" class="checkbox" /> Item 2
<br />
<input type="checkbox" class="checkbox" /> Item 3
<br />
</div>
3、這里首先為selectAll復(fù)選框添加了一個change事件監(jiān)聽器,當(dāng)用戶點擊該復(fù)選框時,將觸發(fā)該事件;然后在事件處理函數(shù)中,通過遍歷所有復(fù)選框,將它們的選中狀態(tài)設(shè)置為與selectAll復(fù)選框相同的狀態(tài)
document.getElementById("selectAll").addEventListener("change", function () {
var checkboxes = document.getElementsByClassName("checkbox");
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].checked = this.checked;
}
});
4、這里在事件處理函數(shù)中,為每個復(fù)選框添加了一個change事件監(jiān)聽器。當(dāng)用戶點擊某個復(fù)選框時,觸發(fā)該事件。在事件處理函數(shù)中,首先設(shè)置allChecked變量為true,然后遍歷所有復(fù)選框,如果發(fā)現(xiàn)有復(fù)選框沒有被選中,將allChecked變量設(shè)置為false并跳出循環(huán)。最后,將selectAll復(fù)選框的選中狀態(tài)設(shè)置為allChecked
var checkboxes = document.getElementsByClassName("checkbox");
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].addEventListener("change", function () {
var allChecked = true;
for (var j = 0; j < checkboxes.length; j++) {
if (!checkboxes[j].checked) {
allChecked = false;
break;
}
}
document.getElementById("selectAll").checked = allChecked;
});
}
5、完整代碼
<div class="test_checks">
<h2>JavaScript原生全選、反選功能</h2>
<input type="checkbox" id="selectAll" /> Select All
<br />
<br />
<input type="checkbox" class="checkbox" /> Item 1
<br />
<input type="checkbox" class="checkbox" /> Item 2
<br />
<input type="checkbox" class="checkbox" /> Item 3
<br />
</div>
<script>
document
.getElementById("selectAll")
.addEventListener("change", function () {
var checkboxes = document.getElementsByClassName("checkbox");
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].checked = this.checked;
}
});
var checkboxes = document.getElementsByClassName("checkbox");
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].addEventListener("change", function () {
var allChecked = true;
for (var j = 0; j < checkboxes.length; j++) {
if (!checkboxes[j].checked) {
allChecked = false;
break;
}
}
document.getElementById("selectAll").checked = allChecked;
});
}
</script>
二、Vue.Js實現(xiàn)
1、先看效果

2、html部分
<div>
<!-- 全選按鈕 -->
<input
type="checkbox"
v-model="checkAllFlag"
@change="choseCheckAll"
/>
<!-- 可選項目列表 -->
<ul>
<li v-for="(item, index) in items" :key="index">
<input
type="checkbox"
v-model="checkedS"
:value="item.id"
@change="ChoseChecks"
/>
{{ item.name }}
</li>
</ul>
</div>
這里為全選按鈕綁定一個v-model的checkAllFlag狀態(tài),用于存儲全選狀態(tài);然后為每個可選項目綁定一個v-model的 checkedS屬性,它是一個數(shù)組,用于存儲被選中的項目的ID。
3、然后定義相關(guān)的數(shù)據(jù)類型
data() {
return {
checkAllFlag: false,
checkedS: [],
items: [
{ id: 1, name: "Item 1" },
{ id: 2, name: "Item 2" },
{ id: 3, name: "Item 3" },
{ id: 4, name: "Item 4" },
],
};
},
4、函數(shù)部分
methods: {
choseCheckAll() {
this.checkedS = this.checkAllFlag
? this.items.map((item) => item.id)
: [];
},
ChoseChecks(value) {
if (this.checkAllFlag && value) {
this.checkAllFlag = false;
} else if (
!this.checkAllFlag &&
this.checkedS.length === this.items.length &&
value
) {
this.checkAllFlag = true;
}
},
},
這里為全選按鈕的@change事件choseCheckAll,該方法根據(jù)全選狀態(tài)更新所有項目的選中狀態(tài)。
每個可選項目的@change事件觸發(fā)一個方法(如 ChoseChecks),用于更新全選狀態(tài),當(dāng)所有項目都被選中或取消選中時,全選按鈕的狀態(tài)應(yīng)相應(yīng)改變。
5、注意事項
choseCheckAll 方法:
- 當(dāng)全選按鈕被選中時,將所有項目的ID(this.items.map(item => item.id))賦值給 checkedS,實現(xiàn)全選。
- 當(dāng)全選按鈕被取消選中時,將 checkedS 設(shè)置為空數(shù)組,取消所有項目的選中狀態(tài)。
ChoseChecks 方法:
- 當(dāng)全選按鈕已選中且某個項目被取消選中時,將 checkAllFlag 設(shè)置為 false,表示不再全選。
- 當(dāng)全選按鈕未選中,且當(dāng)前選中的項目數(shù)量等于總項目數(shù)減一,且有新的項目被選中時,將 checkAllFlag 設(shè)置為 true,表示所有項目已被選中。這里的條件判斷是為了避免在勾選最后一個未選中項時觸發(fā)兩次ChoseChecks,導(dǎo)致checkAllFlag被錯誤地重置。
6、完整代碼
<div class="test_checks">
<input
type="checkbox"
v-model="checkAllFlag"
@change="choseCheckAll"
/><span class="checkll_dom">全選</span>
<ul>
<li v-for="(item, index) in items" :key="index">
<input
type="checkbox"
v-model="checkedS"
:value="item.id"
@change="ChoseChecks"
/>
{{ item.name }}
</li>
</ul>
</div>
data() {
return {
checkAllFlag: false,
checkedS: [],
items: [
{ id: 1, name: "Item 1" },
{ id: 2, name: "Item 2" },
{ id: 3, name: "Item 3" },
{ id: 4, name: "Item 4" },
],
};
},
methods: {
choseCheckAll() {
this.checkedS = this.checkAllFlag
? this.items.map((item) => item.id)
: [];
},
ChoseChecks(value) {
if (this.checkAllFlag && value) {
this.checkAllFlag = false;
} else if (
!this.checkAllFlag &&
this.checkedS.length === this.items.length &&
value
) {
this.checkAllFlag = true;
}
},
}以上就是JavaScript實現(xiàn)全選與反選功能的詳細(xì)內(nèi)容,更多關(guān)于JavaScript全選反選的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
promise結(jié)合requestAnimationFrame用法示例
這篇文章主要為大家介紹了promise結(jié)合requestAnimationFrame用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
解析John Resig Simple JavaScript Inheritance代碼
上網(wǎng)也查了一下對些的理解說的都不是很清楚. 在翻閱的同時找到了一篇 分析這篇文章的文章 哈哈 分析的很詳細(xì). (Join Resig 大師的 "Simple Inheritance" 使用了很多有意思的技巧) 如果你有時間, 并對此感興趣不訪好好看看. 我相信多少會有所收益的.2012-12-12
javascript suggest效果 自動完成實現(xiàn)代碼分享
像百度與google,當(dāng)我們往搜索框輸入東西時就會出現(xiàn)一排列表提示用戶有什么熱門或適合的候選詞,這種效果就叫suggest。本文將一步步教你如何設(shè)計它2012-02-02
js模擬淘寶網(wǎng)的多級選擇菜單實現(xiàn)方法
這篇文章主要介紹了js模擬淘寶網(wǎng)的多級選擇菜單實現(xiàn)方法,涉及javascript針對頁面元素結(jié)點的遍歷與設(shè)置等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
JS+CSS實現(xiàn)鼠標(biāo)滑過時動態(tài)翻滾的導(dǎo)航條效果
這篇文章主要介紹了JS+CSS實現(xiàn)鼠標(biāo)滑過時動態(tài)翻滾的導(dǎo)航條效果,涉及JavaScript動態(tài)設(shè)置css樣式動畫過度效果的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
基于JavaScript構(gòu)建一個動態(tài)博客應(yīng)用
這篇文章主要為大家詳細(xì)介紹了如何基于JavaScript構(gòu)建一個動態(tài)博客應(yīng)用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02

