000. 开始

  学习JS有一段时间了,最近看了一些JS练手的小demo实例,自己也尝试着用JS进行实现。

  全选功能是在很多注册页面、获取用户兴趣爱好、让用户勾选一些选项等页面中常见的一种效果,主要有全选/全不选,反选,重置,提交等几个功能。

  现在我们就开一步一步的开始解析代码。另外注意一下,这里面运用到了一些外部的CSS文件和JS文件,单纯的只复制下面的代码可能不会出现你想要的结果,请移步github地址获取完整源代码:

https://github.com/JinganGuo/JavascriptDemos

001. HTML部分

 <!--
@authors Guo Jingan (gja1026@163.com)
@date 2018-02-15
@intro 全选功能
!-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>全选功能练习(CheckAll)</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" type="text/css" href="../commonCSS.css">
<script src="checkAll.js"></script>
</head>
<body>
<header>
<p>全选功能</p>
</header>
<form id="myForm" action="#" method="post">
请选择您的兴趣爱好:
<input type="checkbox" id="checkOrCancelAll"><label for="checkOrCancelAll">全选/取消全选</label> <br><br> <input type="checkbox" name="item" id="football" value="足球"><label for="football">足球</label>
<input type="checkbox" name="item" id="running" value="跑步"><label for="running">跑步</label>
<input type="checkbox" name="item" id="swimming" value="游泳"><label for="swimming">游泳</label>
<input type="checkbox" name="item" id="reading" value="阅读"><label for="reading">阅读</label>
<input type="checkbox" name="item" id="coding" value="写代码"><label for="coding">写代码</label> <br><br> <input type="button" class="button" name="choice" id="checkAll" value="全选">
<input type="button" class="button" name="choice" id="invert" value="反选">
<input type="button" class="button" name="choice" id="reset" value="复位">
<input type="button" class="button" id="submit" value="提交"> </form>
</body>
</html>

   在这个小demo中,第一次学习并运用了<label>标签,将该标签的for属性设置为对应的id属性值,可以在页面中点击文字也能选中对应的checkbox,若不设置便只能点击那个小小的方框才能选中checkbox。

  HTML部分不做介绍,CSS代码也不贴出来了,基本没有什么样。

002. JS部分

  首先,先自定义一个单击响应函数,方便以后我们对指定元素进行单击响应事件绑定。

 /**
*设置单击响应函数
* @param {[String]} objStr [ 要设置单击响应事件的元素的id ]
* @param {[function]} fun [ 单击后响应的行为 ]
* @return {[none]}
*/
function myClick(objStr, fun) {
var obj = document.getElementById(objStr);
obj.onclick = fun;
}

  

  获取所有可以选择的checkbox可选项:

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

 

  全选/全不选功能,当用户勾选这个checkbox时,所有选项全选;否则,全不选。

  Checkbox对象有一个属性:checked, 可以用来设置或返回 checkbox 是否应被选中。

  为此checkbox添加一个单击响应函数,函数内部对其进行判定,如果它的状态被勾选(即this.checked == true),则将所有的可选项的checked属性设置为false,反之设置为true。

 // 获取全选/全不选选项
var checkOrCancelAll = document.getElementById("checkOrCancelAll"); // 全选/全不选
myClick("checkOrCancelAll", function() {
if(this.checked){
for (var i = 0; i < hobbies.length; i++) {
hobbies[i].checked = true;
}
}else{
for (var i = 0; i < hobbies.length; i++) {
hobbies[i].checked = false;
}
}
});

  全选:将可选项的checked属性设置为ture;

  复位:将可选项的checked属性设置为false;

 // 全选
myClick("checkAll", function() {
for (var i = 0; i < hobbies.length; i++) {
hobbies[i].checked = true;
}
checkOrCancelAll.checked = true;
}); // 复位
myClick("reset", function() {
for (var i = 0; i < hobbies.length; i++) {
hobbies[i].checked = false;
}
checkOrCancelAll.checked = false;
});  

  

  反选:将已经选择的取消,为选择的选中,特别注意那个“全选/全不选”的处理。

 // 反选
myClick("invert", function() {
checkOrCancelAll.checked = true;
for (var i = 0; i < hobbies.length; i++) { if (hobbies[i].checked) {
hobbies[i].checked = false;
checkOrCancelAll.checked = false;
} else {
hobbies[i].checked = true;
}
}
});

  基本功能到目前为止差不多实现了,但是还存在一个问题,当用户依次勾选每一个选项时,当全部勾选完,则“全选/全不选”应当被勾选上,再当用户取消了一个选项,则“全选/全不选”应当被取消。

  这个如何实现呢?

  我们可以为每一个可选项的checkbox添加一个单击响应事件,在响应函数内部,将“全选/全不选”默认勾选上,然后进行判断,若存在没有被勾选上的选项,则“全选/全不选”的checked属性赋值为false。

 // 给每一个checkbox添加一个单击事件
for (var i = 0; i < hobbies.length; i++) {
hobbies[i].onclick = function() {
checkOrCancelAll.checked = true;
for (var i = 0; i < hobbies.length; i++) {
if (!hobbies[i].checked) {
checkOrCancelAll.checked = false;
break;
}
}
};
}

  

  提交

 // 提交
myClick("submit", function(){
var result = new Array();
for (var i = 0; i < hobbies.length; i++) {
if(hobbies[i].checked){
result.push(hobbies[i].value);
}
}
if(result.length){
alert("您的选择是: \n\n" + result);
}else{
alert("您暂时没有勾选任何选项!");
} });

003. 结束

  以上就是全选功能的代码实现,还是很容易实现的,大家也可以自己尝试一下,同时若文章有表述问题或着有该功能更好的实现方式,欢迎讨论。

  一个正努力迈向前端行业的大三狗,记住要不断学习!

JS实现全选功能的更多相关文章

  1. jquery与js实现全选功能的区别---2017-05-12

    一.jquery常用的事件 click(),dbclick() focus(),blur() change() keydown(),keypress(),keyup() mousedown(),mou ...

  2. 使用js实现全选功能。(全选,全不选,反选)

    作业210721 提交代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  3. JS全选功能代码优化

    原文:JS全选功能代码优化 JS全选功能代码优化 最近在看javascript MVC那本书,也感觉到自己写的代码也并不优雅,所以一直在想 用另一种模式来编写JS代码,所以针对之前的简单的JS全选功能 ...

  4. js初学—实现checkbox全选功能

    布局如下: <p ><input type="checkbox" id="che1"/>全选</p><div id=& ...

  5. S全选功能代码

    JS全选功能代码优化 2014-06-26 00:00 by 龙恩0707, 470 阅读, 3 评论, 收藏, 编辑 JS全选功能代码优化 最近在看javascript MVC那本书,也感觉到自己写 ...

  6. EasyUI datagrid 复选框可以多选但不能全选功能实现

    1.功能需求:  实现多选,但是不能够全选功能 2.js代码 //帮卖列表页面,可以多选但是不能够全选实现 $(".datagrid-header-check").children ...

  7. elementUI+JS实现全选与反选

    在实际项目开发过程中,遇到的需求,需要实现全选以及取消全选等功能,主要使用ElementUI + JS来实现,具体代码如下: <!DOCTYPE html> <html lang=& ...

  8. JS checkbox 全选 全不选

    /* JS checkbox 全选 全不选 Html中checkbox: <input type="checkbox" name="cbx" value= ...

  9. C# winform中的datagridview控件标头加入checkbox,实现全选功能。

    /// <summary> /// 给DataGridView添加全选 /// </summary> public class AddCheckBoxToDataGridVie ...

随机推荐

  1. 给Ocelot做一个Docker 镜像

    写在前面 在微服务架构中,ApiGateway起到了承前启后,不仅可以根据客户端进行分类,也可以根据功能业务进行分类,而且对于服务调用服务也起到了很好的接口作用.目前在各个云端中,基本上都提供了Api ...

  2. python学习:Dmidecode系统信息(一)

    #!/usr/bin/env python   from subprocess import Popen, PIPE   p = Popen(['dmidecode'], stdout=PIPE) d ...

  3. 【收藏】8段JQuery处理表单的代码片段,很实用

    1 只接受数字输入 $("#uAge").keydown(function(event) { // 允许退格和删除键 if ( event.keyCode == 46 || eve ...

  4. Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  5. css渲染(一) 字体和文本

    一.字体属性 1.默认字体系列 chrome/opera:"宋体" firefox:"微软雅黑" safari/IE:Times,"宋体" ...

  6. springboot2.0(一):【重磅】Spring Boot 2.0权威发布

    就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...

  7. 麻省理工18年春软件构造课程阅读02“Java基础”

    本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...

  8. python开发concurent.furtrue模块:concurent.furtrue的多进程与多线程&协程

    一,concurent.furtrue进程池和线程池 1.1 concurent.furtrue 开启进程,多进程&线程,多线程 # concurrent.futures创建并行的任务 # 进 ...

  9. hdu1995 汉诺塔V

    可以直接把前K-1个罗盘全部忽略了,因为移动前K-1个罗盘不会影响第K个. 也就是相当于只移动剩下的n-k-1个罗盘,当只移动第k个罗盘时,f(k)=1;当要哟东第k个和第k+1个时,就必须先把第k个 ...

  10. 一个简单的Springmvc应用开发例子

            SpringMVC应用的配置步骤:         1,将所有的jar包导入到lib文件夹下:             jar在spring框架包-->libs-->所有的 ...