博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第三节 前端基础之JS

Posted on 2017-03-22 23:20  Jasonhy  阅读(132)  评论(0)    收藏  举报

    JS是一种基于对象的脚本语言,是浏览器上的程序语言,可以操作浏览器上的一切内容,在浏览器上提供用户交互,页面美化和增加页面的智能性,可以操作的对象有三个来源:

    ①浏览器环境和HTML标签语句所构成的现成对象(链接,图像,插件,HTML表单元素,浏览器细节等);

    ②通过JavaScript的内置类所创建的对象,比如Date(日期)和Number(数值);

    ③通过JavaScript编程,用户自己创建对象

   变量:属于弱类型变量,不需要声明变量类型,直接用var关键字,如果我们不用var声明的话,那这个变量就是全局变量

   常量:直接在程序中出现的数据值

   标识符:由不以数字开头的字母,数字,下划线(_),美元符号($)组成,常用于表示函数,变量名称,如果这个标识符是js中的保留字,不允许重新定义,比如if,new,break等

   数据类型

     ①数字类型(Number):包括整型和浮点型数值

     ②字符串(String):由Unicode字符,数字,标点符号组成的序列

     ③布尔型(Boolean):有两个值true和false,也代表1和0,实际运算中,true=1,false=0

     ④Null和Undefined:null表示尚未存在的对象,undefined表示已经对齐进行了声明,但是没有对其赋值

   运算符

     ①算术运算符:就是我们常说的加减乘除

     ②逻辑运算符:就是>,==,<等

      a:AND (&&)运算符:如果某个运算数,不是原始的Boolean型,逻辑AND运算并不一定返回Boolean值。如果一个运算数是对象,一个是Boolean,返回的是该对象;如果两个都是对象,则返回第二个对象;如果某个运算符是null,返回就是null;如果某个运算符是NaN,返回NaN;如果某个元素是undfined,返回undefined。

      b:OR(||)运算符:如果一个运算数是一个对象,并且该对象左边的运算数均为false,则返回该对象;如果两个运算数都是对象,则返回第一个运算数;如果最后一个运算数书null,并且其他的运算数值均为false,则返回null;如果最后一个运算数书NaN,并且其他的运算数值均为false,则返回null;如果某个运算数unddefined,并且其他的运算数值均为false,则返回unddefined。

     ③等性运算符:

       a:如果一个运算数是Boolean值,在检查相等性之前,把它转换成数字值,false转换成0,true为1

       b:如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字

       c:如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串

       d:如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字

      在进行比较的时候,要遵循下列规则:

       a:值null和undefined相等

       b:在检查相等性时,不能把null和undefined转换成其他值

       c:如果某个运算数是NaN,等号将返回false,非等号将返回true

       d:如果两个运算数都是对象,那么比较的是它们的引用值,如果两个运算数都指向同一个对象,那么等号返回true,否则两个运算数不等  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <script>
        console.log("null和undefined:" + (null == undefined));   //true
        console.log("NaN:" + ("NaN" == NaN));           //false  NaN只要参与运算,就会返回false,除非用的是不等号
        console.log("数字和NaN:" + (5 == NaN));            //false
        console.log("NaN和NaN:" + (NaN == NaN));         //false
        console.log("NaN和!NaN:" + (NaN != NaN));        //true
        console.log("false和0:" + (false == 0));         //true
        console.log("true和1:" + (true == 1));           //true
        console.log("true和非1:" + (true == 2));          //false
        console.log("undefined和0:" + (undefined == 0));  //false
        console.log("null和0:" + (null == 0));           //false
        console.log("数字和字符串:" + ("5" == 5));        //true
    </script>
</body>
</html>

 

     ④关系运算符:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <script>
        var res = "Blue" < "alpha";
        console.log("结果:" + res);       //输出是true
    </script>
</body>
</html>

说明:因为字符串“Blue”的字母B的字符代码是66,而“alpha”的a字符代码是97,所以alpha要大
比较运算符的规则:
  如果两个运算数一个数字类型,一个是其他类型,会将其转换成数字类型
  如果两个运算数都是字符串,先从最高位的ascii码进行比较,以位进行比较

    控制语句

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <p>A</p>
    <p>B</p>
    <p>C</p>
    <p>D</p>
    <p>E</p>

    <script>

        var week = 2;

        /**
         *if型控制语句
         */
        if (week == 1){
            console.log("星期:" + week);
        }else if (week == 2){
            console.log("星期:" + week);
        }else if (week == 3){
            console.log("星期:" + week);
        }else {
            console.log("星期未定义");
        }

        /**
         * switch型控制语句
         */
        week = 3;
        switch (week){
            case 1:
                console.log("星期:" + week);
                break;
            case 2:
                console.log("星期:" + week);
                break;
            case 3:
                console.log("星期:" + week);
                break;
            default:
                console.log("星期未定义");

        }

        /**
         * if和switch的区别
         *
         * switch根据一个值来进行多路分支,并且编译器可以对多路分支进行优化
         * switch只将表达式计算一次,然后将表达式的值和case的值进行比较,进而选择哪一个case的语句块
         * if每次判断都要将条件进行计算一次
         *
         * 所以在进行多路分支时,switch的效率要高于if
         */



        /**
         * for循环控制语句
         */
        for(var i = 1;i < 7; i++){
            document.write("<H" + i + ">" + i + "</H" + i + ">");
            document.write("<br/>")
        }

        /**
         * 通过for循环来寻找标签
         */

        var doms = document.getElementsByTagName("p");
        for(var i in doms){
            console.log("标签:" + i);

            //遍历出来的数据可能有别的元素,所以不建议使用这种方法 比如这个循环除了遍历出来ABCDE外,还有length,item,nameItem
        }

        /**
         * while循环控制语句
         */

        var i = 1;
        while (i < 7){
            document.write("<H" + i + ">" + i + "</H"  + i +  ">");
            i ++;
        }

    </script>
</body>
</html>

 

     对象:常用的内置对象有:Array String Date Math Number Function Global Error RegExp Object

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <script language="JavaScript">

        var num = Number.MAX_VALUE;
        console.log("数字对象:" + num + " 类型:" + (typeof num));

        //创建字符串对象
        var strObj = new String("Hello JS");
        console.log("字符串对象:" + strObj + " 类型:" + (typeof strObj));
        /**
         * 字符串对象常用方法
         *
         */
        //大小写转换
         console.log("转换成大写:" + strObj.toUpperCase());
         console.log("转换成小写:" + strObj.toLowerCase());

         //获取指定字符串 根据索引获取
        console.log("获取索引等于2的字符:" + strObj.charAt(2));
        //查询字符串
        console.log("查询l的索引:" + strObj.indexOf("l"));
        console.log("通过match来匹配:" + strObj.match("JS"));
        console.log("通过search来寻找,返回的是索引位置:" + strObj.search("JS"));
        //字符串截取
        console.log("截取字符串,右边可取:" + strObj.substr(1,3));
        console.log("截取字符串,右边不可取:" + strObj.substring(1,3));
        console.log("截取字符串,通过切片,右边也是不可取:" + strObj.slice(1,3));
        //字符串替换
        console.log("替换字符串:" + strObj.replace("JS","js"));
        //字符串分割
        console.log("字符串分割,返回的是一个数组:" + strObj.split(""));
        //字符串连接
        console.log("字符串连接:" + strObj.concat(" or world"));

        //创建日期对象
        var date = new Date();
        console.log("日期对象:" + date.getDate() + " 类型:" + (typeof date));

        //创建数组对象
        var arr = new Array("星期一","星期二","星期三");
        console.log("数组对象:" + arr + " 类型:" + (typeof arr));
        /**
         * 数组常用的方法
         */
        //数据连接,返回的是连接的字符串
        console.log("通过join来连接:" + arr.join([1,2,3]));     //结果 星期一1,2,3星期二1,2,3星期三
        console.log("通过concat连接:" + arr.concat([1,2,3]));   //结果 星期一,星期二,星期三,1,2,3
        var arr1 = [23,45,37,25,100];
        //反转
        console.log("反转:" + arr1.reverse());
        //排序 正序
        console.log("正序:" + arr1.sort());       //输出结果是:100,23,25,37,45
        //反序
        function f(a, b) {
            return a-b;
        }
        console.log("降序:" + arr1.sort(f));      //输出结果是:23,25,37,45,100

        //切片 和字符串差不多

        //栈操作 push 进栈 pop出栈  整体进栈
        var arr2 = [1,2,3];
        arr2.push([4,5,6,7]);
        console.log("进栈:" + arr2 + " 数组长度:" + arr2.length);   //结果 进栈:1,2,3,4,5,6,7 数组长度:4
        console.log("出栈:" + arr2.pop() + " 数组长度:" + arr2.length);   //结果 出栈:4,5,6,7 数组长度:3

        //栈操作 shift unshift  unshift是往前插
        var arr3 = [1,2,3];
        arr3.unshift([4,5,6,7]);
        console.log("unshift进栈:" + arr3 + " 数组长度:" + arr3.length);          //结果 unshift进栈:4,5,6,7,1,2,3 数组长度:4
        console.log("shift出栈:" + arr3.shift() + " 数组长度:" + arr3.length);        //结果 shift出栈:4,5,6,7 数组长度:3


        //函数对象
        /**
         * 功能说明:
         * 可以使用变量,常量或表达式作为函数调用的参数
         * 函数由关键字function定义
         * 函数名的定义规则与标识符一样,大小写是敏感的
         * 返回值必须用return
         */

        var obj = new Function("name","console.log(\"通过Function来创建函数:\" + name)");
        obj("Jasonhy");


        //我们在向函数传递参数的时候,所有的参数都放在arguments对象中
        function add() {
            var sum = 0;
            for (var i = 0 ; i < arguments.length ; i ++){
                sum += arguments[i];
            }

            return sum;
        }
        console.log("不限参数传递:" + add(1,2,3,4,5));

        //匿名函数一
        var func = function () {
            console.log("匿名函数一");
        };
        func();

        //匿名函数二
        (function (args) {
            console.log(args);
        })("匿名函数二");
    </script>
</body>
</html>

      作用域链:在js中,函数也就是对象,实际上js里一切都是对象,函数对象和其他对象一样,拥有可以通过代码访问属性和一系列供js引擎访问的内部属性,其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。

     BOM对象:也就是浏览器对象模型,可以对浏览器窗口进行访问和操作,使用BOM,开发者可以移动窗口,改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。

    a:window对象,所有的浏览器都支持window对象,从概念上来讲,一个html文档对应一个window对象,功能上来讲,是控制浏览器窗口的,使用上来讲,window对象不需要创建对象,直接使用即可

    window猜数字案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <button onclick="acceptInput()">开始游戏</button>
    <script>
        
        //alert方法
//        alert("hello alert");
        
        //confirm方法,弹出框有确认和取消按钮,可以通过res来接着用户的选择
//        var res = confirm("是否需要记住用户名");
//        console.log("选的结果:" + res);

        //prompt方法,可输入文本, 有确定和取消 可获取结果
//        res = prompt("请输入内容");
//        console.log("输入的内容:" + res);

        //猜数字案例
        var num = Math.round(Math.random() * 100);
        function acceptInput() {
            //让用户输入数字
            var userNum = prompt("请输入一个0-100之间的数字");
            //将用户输入的数字与随机数进行比较
            if (isNaN(userNum)){
                //用户输入的是无效数字
                alert("请输入有效的数字");
                acceptInput();
            }else if (userNum > num){
                alert("您输入的数字大了,请重新输入");
                acceptInput();
            }else if(userNum < num) {
                alert("您输入的数字小了,请重新输入");
                acceptInput();
            }else if (userNum == num){
                var res = confirm("恭喜您,答对了,是否继续游戏");
                if (res){
                    num = Math.round(Math.random() * 100);
                    acceptInput();
                }else {
                    close();
                }
            }else {
                close();
            }
        }
    </script>
</body>
</html>

      window时间显示案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <input id="ID1" type="text" onclick="begin()">
    <button onclick="end()">停止</button>
    <script>

        /**
         * 对应方法
         *
         * setInterval 按照指定的周期(以毫秒计)来调用函数或计算表达式
         * clearInterval 取消由setInterval设置的timeout
         * setTimeout 在指定毫秒数后调用函数或计算表达式
         * clearTimeout 取消由setTimeout方法设置的timeout
         * scrollTo 把内容滚动到指定的坐标
         */

        function showTime() {
            var nowd2 = new Date().toLocaleString();
            var temp = document.getElementById("ID1");
            temp.value = nowd2;
        }

        var clock;
        function begin() {
            if (clock == undefined){
                showTime();
                clock = setInterval(showTime,1000);
            }else if (clock != undefined){
                showTime();
                clock = setInterval(showTime,1000);
            }
        }

        function end() {
            clearInterval(clock);
        }
    </script>
</body>
</html>

     History对象:包含用户(在浏览器中)访问过的URL,包含的方法有:

      a:length返回浏览器历史列表中的URL数量

      b:back()加载history列表中的前一个URL

      c:forward()加载history列表中的下一个URL

      d:go()加载history列表中的某个具体页面

    Location对象:包含有关当前的URL信息,包含的方法有:

      a:assign()类似一个链接

      b:reload()刷新

      c:replace()页面替换

      注:assign可以后退,replace不可以后退

    DOM(下面如果没有特殊的指定,我们说的DOM就是HTML DOM)对象:DOM是W3C的标准,定义了访问HTML和XML文档的标准,分为三个不同的部分:

      a:核心DOM--针对任何结构化文档的保准模型

      b:XML DOM --针对XML文档的标准模型,定义了所有XML元素的对象和属性,以及访问它们的方法。

      c:HTML DOM --针对HTML文档的标准模型,定义了所有HTML元素的对象和属性,以及访问它们的方法。

    DOM节点:HTML文档中的所有内容都是节点

      a:整个文档是一个文档节点(document对象)

      b:每个HTML元素是元素节点(element对象)

      c:HTML元素内的文本是文本节点(text对象)

      d:每个HTML属性是属性节点(attribute对象)

      e:注释是注释节点(comment对象)

    节点自身的属性:

      a:attribute--节点(元素)的属性节点

      b:nodeType--节点类型

      c:nodeType--节点值

      d:nodeName--节点名称

      e:innerHTML--节点(元素)的文本值

    导航属性:

      a:parentNode--节点(元素)的父节点

      b:firstChild--节点下第一个子元素

      c:lastChild--节点下最后一个子元素

      d:childNodes--节点(元素)的子节点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <div class="div1">
        <p name="littleP" class="p1">hello p</p>

        <div class="div2">hello div
            <div>div3</div>
            <a href="#">click</a>
        </div>
    </div>

    <script>

        //拿到多个标签
        var eles = document.getElementsByClassName("p1");
        for(var i = 0 ; i < eles.length; i ++){
            console.log("拿到的标签:" + eles[i]);
            console.log("标签长度:" + eles.length);
        }

        //拿出第一个,就是我们想要的p标签
        var ele = eles[0];

        /**
         * 导航属性
         */
        //
        console.log("父节点:" + ele.parentNode);

        //兄弟节点
        var b_ele = ele.nextSibling;
        console.log("兄弟:" + b_ele.nodeName); //直接获取后面的元素,换行也会当成是一个元素

        var b_ele2 = ele.nextElementSibling;
        console.log("兄弟标签:" + b_ele2.nodeName);  //获取的是兄弟标签,不管是否含有换行或空行

        //获取所有子标签
        var ele3 = document.getElementsByClassName("div1")[0];
        console.log("长度:" + ele3.children.length);

        //用p标签取出标签 取文本内容
        var ele4 = document.getElementsByName("littleP")[0];
        var p_ele4 = ele4.nextElementSibling;
        console.log("innerHTML:" + p_ele4.innerHTML);
        console.log("innerText:" + p_ele4.innerText);

        //innerHTML和innerText的区别:innerHTML取出的是文本加里面的标签名,innerText取出的仅仅是文本
    </script>

</body>
</html>

     DOM Event(事件):

    a:onclick--当用户点击某个对象时调用的事件句柄

    b:ondblclick--当用户双击某个对象时调用的事件句柄

    c:onfocus--元素获得焦点

    d:onblur--元素失去焦点,应用场景:用于表单验证,用户离开某个输入框时,代表以及输入完,我们可以对它进行验证

    e:onchange--域的内容被改变,应用场景:通常用于表单元素,当元素内容被改变时触发(比如联动效果)

    f:onkeydown--某个键盘按键被按下,应用场景:当用户在最后一个输入框按下回车按键时,表单提交

    g:onkeypress--某个键盘按键被按下并松开

    h:onkeyup--某个键盘按键被松开

    i:onload--一张页面或一幅图像完成加载,这个属性被触发,就标志着页面内容被加载完成,应用场景:当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性

    j:onmousedown--鼠标按钮被按下

    k:onmousemove--鼠标被移动

    l:onmouseout--鼠标从某元素移开

    m:onmouseover--鼠标在某元素之上

    n:onmouseleave--鼠标从元素离开

    o:onselect--文本被选中

    p:onsubmit--确认按钮被点击

   案例:onload事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <!--如果我们要将script放在这里,可以用onload事件,表示页面加载完成,这里再执行-->
    <script>
        window.onload = function () {
            console.log("被执行的22:" + new Date().toLocaleString());
            var ele = document.getElementsByClassName("div1")[0];
            console.log("文本内容:" + ele);
        };

        function ff() {
            console.log("被执行的33:" + new Date().toLocaleString());
        }
    </script>
</head>
<!--在body里绑定,表示内容加载完成,可以执行函数了-->
<body onload="ff()">
    <div class="div1">hello onload</div>
    <script>
        console.log("被执行的11:" + new Date().toLocaleString());
    </script>
</body>
</html>

     案例:onsubmit事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <form action="" id="form1">
        <input type="text" name="username">
        <input type="submit" value="提交">
    </form>

    <script>
        var ele = document.getElementById("form1");

        //当点击提交的时候,会触发这个函数,然后再触发提交那个事件
        //可以用来做一些检测,比如用户名注册检测是否符合格式
        ele.onsubmit = function (e) {
            //如果检测数据格式不正确,我们可以返回false,这样就不会提交事件了
//            return false;

            //第二种方法就是,如果匹配失败了,可以通过event事件来阻止
            e.preventDefault();
        }
    </script>
</body>
</html>

    Event对象: 代表事件的状态,比如事件在其中发生的元素,键盘按键的状态,鼠标的位置,鼠标按钮的状态。事件通常域函数结合使用,函数不会在事件发生前执行,event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数,我们获得仅仅需要接收一下即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        .outer{
            width: 300px;
            height: 300px;
            background-color: #783d0c;
        }
        
        .inner{
            width: 100px;
            height: 100px;
            background-color: #84a42b;
        }
    </style>
</head>
<body>

    <div class="outer" onclick="func2()">
        <div class="inner"></div>
    </div>

    <script>
        var ele = document.getElementsByClassName("inner")[0];

        ele.onclick = function (e) {
            //通过e来阻止事件传播
            alert("i am inner");
            e.stopPropagation();
        };

        function func2() {
            alert("i am outer");
        }
    </script>
</body>
</html>

     案例:二级联动

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <select id="provinces">
        <option value="">请选择省份</option>
    </select>

    <select id="citys">
        <option value="">请选择城市</option>
    </select>

    <script>

        data = {
            "广东省":["广州市","深圳市","佛山市"],
            "江苏省":["南京市","苏州市"],
            "贵州省":["贵阳市","凯里市","遵义市"]
        };

        var pro_ele = document.getElementById("provinces");
        var city_ele = document.getElementById("citys");

        //动态添加数据
        for(var i in data){
            var opt = document.createElement("option");
            opt.innerHTML = i;
            pro_ele.appendChild(opt);
        }


        //绑定事件
        pro_ele.onchange= function () {
            //获取索引值
            var citys = data[this.options[this.selectedIndex].innerHTML];
            //将数据清空再加入
            city_ele.options.length = 1;
            for(var i = 0 ; i < citys.length; i++){
                var opt = document.createElement("option");
                opt.innerHTML = citys[i];
                city_ele.appendChild(opt);
            }
        }
    </script>
</body>
</html>

 

     案例:模块对话框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>

        .content{
            height: 1800px;
            background-color: white;
        }

        .shade{
            position: fixed;
            /*占满屏*/
            top: 0;
            left: 0;
            right: 0;
            bottom:0;

            background-color: grey;
            opacity: 0.5;
        }

        .model{
            position: absolute;
            top: 50%;
            left: 50%;
            margin-top: -100px;
            margin-left: -100px;
            width: 200px;
            height: 200px;
            background-color: white;
        }

        .hide{
            display: none;
        }
    </style>
</head>
<body>

    <div class="content">
        <button onclick="show()">显示</button>
    </div>

    <!--遮罩-->
    <div class="shade hide"></div>
    <!--弹出框-->
    <div class="model hide">
        <button onclick="cancel()">关闭</button>
    </div>

    <script>
        function show() {
            var ele_shade = document.getElementsByClassName("shade")[0];
            var ele_model = document.getElementsByClassName("model")[0];

            ele_shade.classList.remove("hide");
            ele_model.classList.remove("hide");
        }

        function cancel() {
            var ele_shade = document.getElementsByClassName("shade")[0];
            var ele_model = document.getElementsByClassName("model")[0];

            ele_shade.classList.add("hide");
            ele_model.classList.add("hide");
        }
    </script>
</body>
</html>

 

    案例:正反选

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!--通过js实现正反选功能-->
    <button onclick="selectAll()">全选</button>
    <button onclick="cancel()">取消</button>
    <button onclick="reverse()">反选</button>
    <table border="1px">
        <tr>
            <td>
                <input type="checkbox">
            </td>
            <td>111</td>
            <td>111</td>
            <td>111</td>
        </tr>

        <tr>
            <td>
                <input type="checkbox">
            </td>
            <td>222</td>
            <td>222</td>
            <td>222</td>
        </tr>

        <tr>
            <td>
                <input type="checkbox">
            </td>
            <td>333</td>
            <td>333</td>
            <td>333</td>
        </tr>
    </table>


    <script>

        function selectAll() {
            var inputs = document.getElementsByTagName("input");
            for (var i = 0; i < inputs.length; i++){
                var input = inputs[i];
                input.checked = true;
            }
        }

        function cancel() {
            var inputs = document.getElementsByTagName("input");
            for (var i = 0; i < inputs.length; i++){
                var input = inputs[i];
                input.checked = false;
            }
        }

        function reverse() {
             var inputs = document.getElementsByTagName("input");
            for (var i = 0; i < inputs.length; i++){
                var input = inputs[i];
                if (input.checked){
                    input.checked =false;
                }else {
                    input.checked = true;
                }
            }
        }
    </script>
</body>
</html>