JS實現全選功能

来源:https://www.cnblogs.com/gja1026/archive/2018/03/12/8547971.html
-Advertisement-
Play Games

通過JS實現對一系列checkbox的全選功能,實現全選/全不選、複位,反選等。 ...


000. 開始

  學習JS有一段時間了,最近看了一些JS練手的小demo實例,自己也嘗試著用JS進行實現。

  全選功能是在很多註冊頁面、獲取用戶興趣愛好、讓用戶勾選一些選項等頁面中常見的一種效果,主要有全選/全不選,反選,重置,提交等幾個功能。

  現在我們就開一步一步的開始解析代碼。另外註意一下,這裡面運用到了一些外部的CSS文件和JS文件,單純的只複製下麵的代碼可能不會出現你想要的結果,請移步github地址獲取完整源代碼:

https://github.com/JinganGuo/JavascriptDemos

001. HTML部分

 1 <!--
 2     @authors Guo Jingan ([email protected])
 3     @date    2018-02-15
 4     @intro      全選功能
 5 !-->
 6 <!DOCTYPE html>
 7 <html lang="en">
 8 <head>
 9     <meta charset="UTF-8">
10     <title>全選功能練習(CheckAll)</title>
11     <link rel="stylesheet" href="style.css">
12     <link rel="stylesheet" type="text/css" href="../commonCSS.css">
13     <script src="checkAll.js"></script>
14 </head>
15 <body>
16     <header>
17         <p>全選功能</p>
18     </header>
19     <form id="myForm" action="#" method="post">
20         請選擇您的興趣愛好:
21         <input type="checkbox" id="checkOrCancelAll"><label for="checkOrCancelAll">全選/取消全選</label>
22 
23         <br><br>
24 
25         <input type="checkbox" name="item" id="football" value="足球"><label for="football">足球</label>
26         <input type="checkbox" name="item" id="running" value="跑步"><label for="running">跑步</label>
27         <input type="checkbox" name="item" id="swimming" value="游泳"><label for="swimming">游泳</label>
28         <input type="checkbox" name="item" id="reading" value="閱讀"><label for="reading">閱讀</label>
29         <input type="checkbox" name="item" id="coding" value="寫代碼"><label for="coding">寫代碼</label>
30 
31         <br><br>
32         
33         <input type="button" class="button" name="choice" id="checkAll" value="全選">
34         <input type="button" class="button" name="choice" id="invert" value="反選">
35         <input type="button" class="button" name="choice" id="reset" value="複位">
36         <input type="button" class="button" id="submit" value="提交">
37 
38     </form>
39 </body>
40 </html>
View Code

   在這個小demo中,第一次學習並運用了<label>標簽,將該標簽的for屬性設置為對應的id屬性值,可以在頁面中點擊文字也能選中對應的checkbox,若不設置便只能點擊那個小小的方框才能選中checkbox。

  HTML部分不做介紹,CSS代碼也不貼出來了,基本沒有什麼樣。

002. JS部分

  首先,先自定義一個單擊響應函數,方便以後我們對指定元素進行單擊響應事件綁定。

 1 /**
 2  *設置單擊響應函數
 3  * @param  {[String]} objStr [ 要設置單擊響應事件的元素的id ]
 4  * @param  {[function]} fun  [ 單擊後響應的行為 ]
 5  * @return {[none]}       
 6  */
 7 function myClick(objStr, fun) {
 8     var obj = document.getElementById(objStr);
 9     obj.onclick = fun;
10 }

  

  獲取所有可以選擇的checkbox可選項:

var hobbies = document.getElementsByName("item");

    

  全選/全不選功能,當用戶勾選這個checkbox時,所有選項全選;否則,全不選。

  Checkbox對象有一個屬性:checked, 可以用來設置或返回 checkbox 是否應被選中。

  為此checkbox添加一個單擊響應函數,函數內部對其進行判定,如果它的狀態被勾選(即this.checked == true),則將所有的可選項的checked屬性設置為false,反之設置為true。

 1 // 獲取全選/全不選選項
 2 var checkOrCancelAll = document.getElementById("checkOrCancelAll");
 3 
 4 // 全選/全不選
 5 myClick("checkOrCancelAll", function() {
 6         if(this.checked){
 7         for (var i = 0; i < hobbies.length; i++) {
 8             hobbies[i].checked = true;
 9         }
10         }else{
11         for (var i = 0; i < hobbies.length; i++) {
12             hobbies[i].checked = false;
13         }
14         }
15 });

 

  全選:將可選項的checked屬性設置為ture;

  複位:將可選項的checked屬性設置為false;

 1 // 全選
 2 myClick("checkAll", function() {
 3     for (var i = 0; i < hobbies.length; i++) {
 4         hobbies[i].checked = true;
 5     }
 6     checkOrCancelAll.checked = true;
 7 });
 8 
 9 // 複位
10 myClick("reset", function() {
11     for (var i = 0; i < hobbies.length; i++) {
12         hobbies[i].checked = false;
13     }
14     checkOrCancelAll.checked = false;
15 });  

   

  反選:將已經選擇的取消,為選擇的選中,特別註意那個“全選/全不選”的處理。

 1 // 反選
 2 myClick("invert", function() {
 3     checkOrCancelAll.checked = true;
 4     for (var i = 0; i < hobbies.length; i++) {
 5         
 6         if (hobbies[i].checked) {
 7             hobbies[i].checked = false;
 8             checkOrCancelAll.checked = false;
 9         } else {
10             hobbies[i].checked = true;
11         }
12     }
13 });

 

  基本功能到目前為止差不多實現了,但是還存在一個問題,當用戶依次勾選每一個選項時,當全部勾選完,則“全選/全不選”應當被勾選上,再當用戶取消了一個選項,則“全選/全不選”應當被取消。

  這個如何實現呢?

  我們可以為每一個可選項的checkbox添加一個單擊響應事件,在響應函數內部,將“全選/全不選”預設勾選上,然後進行判斷,若存在沒有被勾選上的選項,則“全選/全不選”的checked屬性賦值為false。

 1 // 給每一個checkbox添加一個單擊事件
 2 for (var i = 0; i < hobbies.length; i++) {
 3     hobbies[i].onclick = function() {
 4         checkOrCancelAll.checked = true;
 5         for (var i = 0; i < hobbies.length; i++) {
 6             if (!hobbies[i].checked) {
 7                 checkOrCancelAll.checked = false;
 8                 break;
 9             }
10         }
11     };
12 }

   

  提交

 1 // 提交
 2 myClick("submit", function(){
 3     var result = new Array();
 4     for (var i = 0; i < hobbies.length; i++) {
 5         if(hobbies[i].checked){
 6             result.push(hobbies[i].value);
 7         }
 8     }
 9     if(result.length){
10         alert("您的選擇是: \n\n" + result);
11     }else{
12         alert("您暫時沒有勾選任何選項!");
13     }
14 
15 });

003. 結束

  以上就是全選功能的代碼實現,還是很容易實現的,大家也可以自己嘗試一下,同時若文章有表述問題或著有該功能更好的實現方式,歡迎討論。

 

  一個正努力邁向前端行業的大三狗,記住要不斷學習!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天用node寫後臺,登錄認證使用了token,然後就使用了簡單的jwt simple,但是發現設置的過期時間不對,一直沒有提示過期,但是明明是已經過期了的時間,於是檢查了下jwt simple的源代碼。 我的路徑,根目錄下\node_modules\jwt simple\lib\jwt.js jw ...
  • 很久沒寫過筆記一類的東西了,從剛開始的996持續半年,直到最近,剛好這幾天有空,順便總結一下開發小程式的一些心路歷程。 在這裡呢順便打個廣告,小程式名字叫“一拍即傳”。 最近半年多呢一直在開發小程式,其實小程式跟傳統的web開發是極其相似的,當然也有不少不同的點,接下來 進入正題: 一開始學習小程式 ...
  • 結論:設置溢出文字,不要直接在li標簽上設置,因為會有list-style-type的問題,還是包裹在span中,設置span省略號。 ...
  • 老師要求用web製作一個拼圖游戲。 發現的問題:點擊隨機生成拼圖的按鈕後,打亂的圖片會出現無法還原的情況。 發現過程:每次生成一個拼圖後會測試它怎麼拼回去,結果發現有時候拼不回去。 數學原理:如果兩個矩陣的逆序數的奇偶性相同,則其中一個矩陣通過若幹次變換以後必定能夠得到另一個矩陣。 問題原因:隨機生 ...
  • 記錄生活,每天一點點 原因: 博主工作上一需求,是檢查表單是否被修改。如果確定被修改了 才做某些操作。項目呢是一個有些年曆史的老項目了,基本上JQ在操作DOM,考慮到如果更換react或者angularjs 想想還是算了吧 換了事情更多了。就自己寫了一勉強能滿足當前業務需要的一小段JS。沒有什麼技術 ...
  • 1.JSON 與 JS 對象的關係 JSON 是 JS 對象的字元串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字元串。 如var obj = {a: 'Hello', b: 'World'}; //這是一個對象,註意鍵名也是可以使用引號包裹的 var json = '{"a": "He ...
  • 本篇文章將介頁面佈局中的自適應佈局,常見的自適應佈局有以下2種:左列固定右列自適應、左右兩列固定中間自適應。 ...
  • 本教程案例github:https://github.com/axel10/dva_demo-Counter-and-list/tree/master 這次主要通過線上獲取用戶數據並且渲染成列表這個案例來演示dva.js。 整個開發流程概括下來應該是: 編寫用戶列表model(數據模型)-> 編寫修 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...