JS

JS引入方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--第二种引入方式-->
    <script src="js.js"></script>
</head>
<body>
    <!-- 第一种引入方式,建议放在body最后一行,位置影响不大-->
    <script>
        alert(123)
    </script>
</body>
</html>

JS基础语法

var x   /* 声明变量,此时变量x已经存在了 */
        x = 12
        y = 20
        x = 15
        alert(x) /* 15,会顶掉上一个同变量名的值 */
        console.log(x)  //将x的值打印在控制台中

        var name = 'harvey',age = '18'
        MyFirstName = 'h'   //一般组合型变量名我们首字母都大写,美观

        function f() {      //定义一个f函数,函数内容是打印123
            console.log(123)
        }

        if (2>1) {          //if条件句
            console.log('2')
        }
        if(1){
             alert(111)
         }else {
             alert(222)
         }

        console.log(true + 1)//可以直接用布尔值与整型运算

        var x;
        console.log(x); //undefined,没有实际意义的变量

        //直接将文本(标签)插入到html的页面中
        function f() {
                     document.write("<h1>hello H!</h1>")
                 }
        console.log(typeof f()) //查看它的类型

        //Undefined:undefined     //Undefined这个数据类型就只有一个值就是undefined
        //null:null               //针对对象用的 var Person() =  person 实例化出的person是空的,此时的person类型就是null

 强制转换对象

console.log("hello"+2); //hello2
console.log("hello"+true); //hellotrue
console.log(2+true);       //3
console.log(parseInt(6.9234454)); // 6
//NAN: not a number,属于Number的一种
console.log(parseInt("hello"));    //NAN
console.log(parseInt("123"));     //123
console.log(parseInt("123abc"));  //123
console.log(parseInt("abc1234")); //NAN

var n=NaN;
console.log(n>5) ; //f
console.log(n<5) ; //f
console.log(n==5) ;//f
console.log(n==NaN) ;//NAN只要参与比较,布尔值一定是false,除非!=
console.log(n!=NaN) ;//t

typeof :区分基本数据类型

console.log(typeof 123);      //number
console.log(typeof "hello");  //string
console.log(typeof true);     //boolean
console.log(typeof null);     //object
console.log(typeof undefined);//undefined

console.log(typeof [12,3,4]); //object
console.log(typeof {"name":"123"}); //object

运算符

++i,--i,i++,i--

var i = 10;
i++;
console.log(i)      //11
console.log(i++)    //11,先输出结果,之后再加
console.log(++i)    //13,先加后输出

逻辑运算符

与(&&),或(||),非(!)

console.log("hello" && 4)   //4
console.log(2==2);          //true
console.log("2"==2);        //true
console.log(2==="2")        //false

console.log(3>20);          //false
console.log(3>"20");        //false,z只要有一个是数字类型,其他的也会转换成数字类型进行比较
console.log("3">"28")       //true,比最高位,3>2

控制语句

--if

<script>
    var name = 'harvey'
        if (name = '翠花'){
            alert('真俗')
        }
        else if (name = 'Tyrion'){
            alert('偶像')
        }
        else {
            alert('harvey is me')
        }
</script>

--switch
在<head>中加入 <meta charset="UTF-8"> ,可解决中文乱码问题。

应对多种情况下执行不同的代码

<script>
        var week = 'Monday';
        var week = 'Wednesday';

        switch (week){
            case 'Monday' : alert('周一');break;  //每一种情况必须有break,否则将一次性运行多个alert直到break或全部运行完
            case 'Tuesday' : alert('周二');break;
            case 'Wednesday' : alert('周三');break;
            case 'Thursday' : alert('周四');break;
            case 'Friday' : alert('周五');break;
            case 'Saturday' : alert('周六');break;
            case 'Sunday' : alert('周日');break;
            default : alert('nothing');           //以上情况之外运行的代码
        }
</script>

for循环

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>hello the Hound</p>
<p>hello kingslayer</p>
<p>hello snow</p>
<p>hello Tyrion</p>
    <script>
        for (var i = 0;i<10;i++){
            document.write('第' + i + '个i' + '<br>') //字符串拼接和换行符br
        }

        var attr = [111,222,333];
        //方法一:
        for (var i = 0;i < attr.length;i++){
            document.write(i);
            document.write('<br>');
            document.write(attr[i]);
            document.write('<br>');
        }
        //方法二:
        for (var i in attr){
            document.write(i);
            document.write('<br>');
            document.write(attr[i]);
            document.write('<br>');
        }
        var ppp = document.getElementsByTagName('p');   //拿出p标间中的值
        console.log(ppp);
//      不推荐用此方法拿值,会多打印三个无用数据length,item,namedItem
        for (var i in ppp){
            console.log(i)
        }
        for (var i=0;i<ppp.length;i++){
                console.log(i);
                console.log(ppp[i]);
        }

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

while循环

<script>
//        while
        var sum = 0;
        var i = 1;
        while (i<=100){
            sum += i;
            i++;
        }
        console.log(sum)

//        for循环
        var sum = 0;
        for (var i = 1;i <= 100;i++){
            sum += i;
        }
        console.log(sum)
    </script>

异常处理

<script>
        try {
            console(123);
            throw Error("define error")
        }
        catch (e){                      //拿到错误详情
            console.log(e)
        }
        finally {                       //无论如何都会运行
            console.log('结束')
        }
    </script>

字符串对象

//创建字符串对象两种方式
        var str1="hello";

        var str2=new String("hello2");

        console.log(typeof str1);
        console.log(typeof str2);

        //字符串的属性
        console.log(str1.length);
        // 字符串的方法
        //编排方法
        console.log(str1.italics());  //     <i>hello</i>
        console.log(str1.bold());    //      <i>hello</i>
        console.log(str1.anchor());  //      <i>hello</i>
        //查询字符串索引
        var str="welcome to the world of JS!";

        var str2=str.indexOf("l");   //取第一个l
        var str3=str.lastIndexOf("l");//取最后一个l
        alert(str2);
        //结果为2,查看l的索引
        alert(str3);
        //结果为18

        //substr substring
        console.log(str1.substr(1,3));   //从第一个索引位置开始,取三个
        console.log(str1.substring(1,3));//左取右不取
        //切片
        console.log(str1.slice(1,4));    //ell,从第一个切到第四个
        console.log(str1.slice(-3,-1))   //ll 也可以从后面取
        
//创建方式
        var arr1=[1,"hello",[11,2],{"name":"Yuan"}];
        var arr2=new Array(3);
        var arr3=new Array(1,"world",true,[1,2,3]);

        console.log(typeof arr1);   //都是object类型
        console.log(typeof arr2);
        console.log(typeof arr3);

        var arr4=new Array(10)      //10是size,可以限制size
        console.log(arr1.length);

        //Array对象的方法
        //join()
        var arr5=[1,2,3,4,"1234"];
        var ret=arr5.join("**");    //1**2**3**4**1234
        console.log(ret);
        console.log(typeof ret)     //string
        //toString()
        var ret2=arr1.toString();
        console.log(ret2);
        console.log(typeof ret2);
        //concat()拼接
        var arr5=[1,2,3];
        var ret3=arr5.concat([5,66]); //[1, 2, 3, 5, 66]
        console.log(ret3);
        console.log(typeof ret3);     //object
        //reverse排序
        var arr6=[23,45,37,88];
        var arr6=[10,45,100,88];
        console.log(arr6.reverse());  //[88, 100, 45, 10]使列表反序
        console.log(arr6.sort()) ;    //[10, 100, 45, 88]比最高位,100比10多一位

        //自制排序,从小到大
        function f(a,b){
            if (a>b){
                return 1
            }
            else if (a<b){
                return -1
            }
            else {
                return 0
            }
        }
        console.log(arr6.sort(f2))
        //简化版
        function f2(a,b) {
            return a-b
        }
        console.log(arr6.sort(f2))

栈操作

push,pop 

//push,pop
var arr = [1,2,3];
arr.push([7,8,9]);    //[1, 2, 3, [7, 8, 9]],将其整体放入
console.log(arr.length);//4
arr.push('hello',55);  // [1, 2, 3, Array(3), "hello", 5] 用逗号隔开可以放入单个对象
console.log(arr);
console.log(arr.length);//6
console.log(arr.pop()); //55,取出值,先进后出,后进先出
console.log(arr.pop()); //hello
console.log(arr.length);//4

unshift,shift 

<script>
        //shift,unshift
        var arr = [5,6,7];
        arr.unshift([98,99]);   //[[98,99],5,6,7]除了放的位置不同,其他和push一样
        arr.unshift(true,'yes');//[true,'yes',[98,99],5,6,7]从列表开始的位置放
        arr.shift();//["yes",[11,22],5,6,7],直接拿走第一个
        console.log(arr);
        console.log(arr.length)
    </script>

函数

<script>
        //函数创建方式一
        function f(a,b){
            alert('hello');
            return a+b;     //如果没有返回值默认返回null
        }
        console.log(f(99,1));

        f2('harvey',18);    //js中将会优先运行所有函数,所以调用在函数之前也无妨
        function f2(name,age) {
            console.log('hello'+ name);
        }
        //函数的创建方式二 只是为了更好地理解函数也是一个对象,不推荐使用
        var obj=new Function("name","console.log(\"hello\"+name)")
        //var 函数名=new Function('参数','函数内容')
        obj("武大");
        console.log(obj.length)

        // 函数的调用
        function add(x,y,z) {
            return x+y+z
        }
        console.log(add(1,2,3,4,5,6));      //多余的会剩下,只拿前三个
        console.log(add(1,2));              //NaN
        console.log(add("hello","world"));  //helloworldundefined
    </script>

面试题

//面试题
function f(x,y){
    return x+y;
        }
//如果再重新定义f
var f = 1;
var b = 2;
//下面的调用能否执行呢?
f(f,b)      //肯定不能啊,f函数已经被f=1覆盖了,1(1,b),怎么执行?

arguments

function f() {
          console.log(arguments)
      }
        f(1,2,45,6,7,78);   //可以获取所有参数

        //可以通过它计算所有参数的累加和
        function add() {
            var sum = 0;
            for (var i = 1;i < arguments.length;i++){
                sum += arguments[i]
            }
            return sum   //注意要放在for循环之外,这是函数的返回值
        }
        console.log(add(1,2,6,9))

匿名函数

        //匿名函数
        //不会被优先运行的函数,调用放在函数内容之前将不会运行
        var func = function (arg) {
            alert(arg)
        };
        func('hello');
        //也可以这样定义
        (function(arg){
            alert(arg)
            })("harvey")

DOM节点

setInterval(func,1000),clearInterval(),func函数隔一段周期(单位为毫秒)运行一次,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="text" id="text1" onclick="Begin()">  <!-- 建立一个输入框,点击即运行begin函数-->
<button onclick="end()">停止</button>             <!-- 建立一个按钮,点击即运行end函数-->
    <script>
        function ShowTime() {
            var current_time = new Date().toLocaleString(); //获取时间并字符串形式
            var box = document.getElementById('text1');      //用document方式通过id拿到标签
            box.value = current_time;                        //将当时的时间当作标签的value,就可以在输入框显示了
        }

        //如果重复点击输入框将会生成多个clock1,关闭只能关闭有值的那个clock1,其他的多余的无值clock1仍会运行,无法关闭
        //所以当点击第一次时,clock1的值应该是undefined,空值,之后Begin的触发clock1已经有值,都不会再生成clock1,而是空操作了
        var clock1;
        function Begin() {
            if (clock1 == undefined){
                ShowTime();
                clock1 = setInterval(ShowTime,1000);
            }
        }
        function end() {
            clearInterval(clock1);
            clock1 = undefined;     //彻底清除这个定时器
        }
    </script>
</body>
</html>

setTimeout(f,1000),1秒之后调用函数,clearTimeout(),取消定时启动函数的setTimeout方法

<script>
    function f() {
        console.log("hello...")
    }
    var c = setTimeout(f,1000);
    clearTimeout(c)
</script>

window是对象方法

<script>
        //alert 只是因为window是全局变量,所以省略也可以调用
        window.alert('hello')

        //confirm 弹窗中有确定和取消两个选项,点击其中一个可以执行不同的代码
        var ret1 = window.confirm('hello,harvey');
        console.log(ret1);

        //prompt 弹窗中有文本框,根据输入内容可做不同的操作
        var ret2 = window.prompt('hello,harvey');
        console.log(ret2);

        //在新标签中打开特定网页
        open("http://www.baidu.com")
    </script>

history

<body>
<!--2.html文件中有我们写好的back方法,在forward页面下进入2文件,2文件中的后退按钮可以回到forward页面中,
同样只要有了浏览历史,我们在forward页面中不用超链接,通过前进按钮也可以回到back页面了-->
<a href="2.html">2</a>
<button onclick="history.forward()">前进</button>
<!--通过go也可以实现前进后退-->
<button onclick="history.go(1)">>>>>> </button>
</body>
<body>
<button onclick="history.back()">后退</button>
<button onclick="history.go(-1)">back</button>
</body>

作用域

<script>
//    if(1){
//        var x=10;
//    }
//    console.log(x);
//
//    function f() {
//        var y=12;
//    }
//
//    console.log(y)


//    var city = 'beijing';
//
//    function func(){
//        var city = 'shanghai';

//        function inner(){
//            var city = 'shenzhen';
//            console.log(city);
//        }
//        inner();
//    }
//    func();


var city = 'beijing';

function Bar(){
    console.log(city);
}
function func(){

    var city = 'shanghai';
    return Bar;
}
var ret = func();

ret();

</script>

location

<body>
<button onclick="f()">click</button>

<script>
    function f() {
        location.reload()                         //刷新页面
        location.assign("http://www.baidu.com")   //跳转至某页面,是可以后退的
        location.replace("http://www.baidu.com")  //某页面将覆盖当前页面,不可后退
    }

</script>
</body>

DOM属性

<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>
    <span>span</span>
</div>
<script>
    //var ele0 = document.getElementById()
    var ele1 = document.getElementsByClassName('p1')[0]; //如果有多个class=p1,可以通过索引拿某一个的文本内容
    console.log(ele1);//hello p
    //节点的属性
    //    console.log(ele1.nodeName); p
    //    console.log(ele1.nodeType); 1
    //    console.log(ele1.nodeValue);null
    console.log(ele1.innerHTML);    //只需记住这个,获取中间的文本
    ele1.innerHTML="hello world"    //可以重新赋值
    //取父级标签名
    //var p_ele = ele1.parentNode;
    //console.log(p_ele.nodeName) //DIV

    //取同胞的标签名
    var b_ele = ele1.nextSibling;
    console.log(b_ele.nodeName);  //#text,如果同胞不在同一行内,将会取到中间空的部分(回车后的空白)
    //所以通过node方法无法达到效果,但是可以限定只拿对象
    var b_ele2 = ele1.nextElementSibling;//这样就会跳过空白部分
    console.log(b_ele2.nodeName);

    //取子标签名
    var ele3=document.getElementsByClassName("div1")[0];//拿到一个class=div1
    console.log(ele3.children[1].children)  //[div, a] 拿div1的第二个子标签里的全部子标签

    //练习
    var ele4=document.getElementsByName("littleP")[0]; //拿到第一个id=littleP的标签
    var ele5=ele4.nextElementSibling;   //拿到该标签的兄弟标签
    console.log(ele5.innerHTML);        //<div>div3</div>,<a href="">click</a> 全家一个不剩全拿来
    console.log(ele5.innerText);        //hello div,div3,click,只拿标签内容,不拿其他的

    //局部查找
    //由于id是唯一的,所以并不会重复,并不支持在局部内通过id查找,多此一举,另外name也是不支持的
    var ele6=document.getElementsByClassName("div1")[0];
    var ele7=ele6.getElementsByTagName("span");
    console.log(ele7[0].innerHTML)

</script>
</body>

焦点

<body>
<input type="text" id="search" value="请输入用户名" onfocus="f1" onblur="f2">

<script>
    var ele = document.getElementById('search');
    function f1() {
        if (ele.value == '请输入用户名'){       //如果获取焦点时value是默认的,那么将删除默认,将输入框清空
            ele.value = '';
        }
    }
    function f2() {
        if (!ele.value.trim())
        ele.value = '请输入用户名'; //如果用户输入一半取消焦点额那不应该将其更换为默认值,此处的trim相当于
    }                              //strip,去除空格,判断如果去掉空格之后还为空,那说明输入的只是空格,失去焦点将重回默认值
</script>

</body>

onload,当页面加载完成后才会执行的函数

<body onload='f()'>
<div class="div1">hello div</div>

<script>

    function f() {
        var ele=document.getElementsByClassName("div1")[0];
        console.log(ele.innerHTML);
    }

</script>

</body>

事件绑定

  • 第一种(拿标签对象)
<body>
<div class="v1">
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <p id="p1">pppppp</p>
</div>

<script>
    //用此方法可以做到html和js代码完全分离,建议使用
    var ele = document.getElementById("p1");
    ele.onclick=function () {
        alert(123)
    };

    //js不会自己做便利
    var ele2 = document.getElementsByClassName('v2');
    for (var i = 0;i < ele2.length;i++) {
        ele2[i].onclick = function () {
            alert(666)
        }
    }

</script>

</body>
  • 第二种(this参数)
<body>
<div class="v1">
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <p id="p1" onclick="func(this)">pppppp</p>
</div>
<script>
    //标签中的func有参数后,定义的func也得有参数,而有this参数的标签,就可以可以拿到这个标签对象
    function func(self) {
        console.log(self)
        alert(1234)
    }
</script>
</body>

onsubmit

<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) {
        console.log('hello');//点击提交后将会先弹框,后提交表单,弹框属于前端操作
        alert(666);          //用这一特性,我们可以在前端做简单的格式限定,对于格式乱填的用户也就省下提交后端的步骤了
        //return False 假设上面有一段判断逻辑,当输入内容不符合我们的第一道门槛时,用此方法阻止发送表单到后端。
        //阻止后一般会接个弹窗说明,例如‘您输入的格式有误’

        //第二种阻止方式,将会阻止onsubmit默认会发生的事件。此处的默认发生事件就是上传表单
        //e.preventDefault()
    }

</script>

</body>

阻止事件传播

<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        .outer{
            width: 300px;
            height: 300px;
            background-color: antiquewhite;
        }
        .inner{
            width: 100px;
            height: 100px;
            background-color: rebeccapurple;
        }
    </style>
</head>
<body>
<div class="outer" onclick="func()">
    <div class="inner"></div>
</div>
<script>
    //当标签嵌套时,子标签的绑定触发可能会导致父标签的绑定事件也会触发
    //此处的onclick事件要如何只触发inner的不触发outer的呢?
    var ele = document.getElementsByClassName('inner')[0];
    ele.onclick = function (e) {
        alert('I am inner');
        //阻止事件传播,要加在子标签中,相当于把自己的门窗全关好,不让爸爸知道自己在干什么不可描述的事情
        // e.stopPropagation()
    };
    function func(e) {
        alert('I am outer');
    }
</script>

</body>
</html>

DOM节点增删改查

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .div1,.div2,.div3,.div4{
            width: 300px;
            height: 100px;
        }
        .div1{
            background-color: green;
        }
        .div2{
            background-color: yellow;
        }
        .div3{
            background-color: rebeccapurple;
        }
        .div4{
            background-color: deeppink;
        }
    </style>
</head>

<body>
<div class="div1">
    <button onclick="add()">add</button>
    hello div1
</div>
<div class="div2">
    <button onclick="del()">del</button>
    <p>不要删我呀</p>
    hello div2
</div>
<div class="div3">
    <button onclick="change()">change</button>
    <p>hello div3</p>
</div>
<div class="div4">hello div4</div>

<script>
    //增
    function add(){
        var ele = document.createElement('p');  //增加一个标签<p></p>
        ele.innerHTML = '<h1>hello p</h1>';     //标签的内容是h1格式的hello p
        //ele.innerText = '<h1>hello p</h1>';   //标签内容是<h1>hello p</h1>
        ele.style.color = 'red';
        ele.style.fontSize="10px";
        var father_ele = document.getElementsByClassName('div1')[0]; //必须通过找到父标签后添加
        father_ele.appendChild(ele)
    }
    //删
    function del() {
        var father_ele = document.getElementsByClassName('div2')[0];//同样必须先找到父标签
        var son_ele = document.getElementsByTagName('p')[0];//然后找到要删除的标签
        father_ele.removeChild(son_ele)
    }
    //改
    function change() {
        var img_ele = document.createElement('img'); //建立一个img标签<img src=''>
        img_ele.src = 'timg.jpg';   //为img标签添加路径
        //img.setAttribute("src","GTAV.jpg"),其实js标准格式是这样,优化后才有上面的格式
        var ele = document.getElementsByTagName("p")[1];//找到原标签
        var father_ele = document.getElementsByClassName('div3')[0];//同样拿到父标签
        father_ele.replaceChild(img_ele, ele);    //将前者代替后者
    }
</script>
</body>

class属性

body>
<div class="div1 div2">div1</div>
<script>
    var ele=document.getElementsByTagName("div")[0];

    console.log(ele.className);     //div1 div2
    console.log(ele.classList[0]);  //div1
    console.log(ele.classList[1]);  //div2
    ele.classList.add("hide");
    console.log(ele.className);     //div1 div2 hide
</script>
</body>

classList之模态对话框

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

    <style>
        .content{
            height: 1800px;
            background-color: white;
        }
        /*阴影部分,沾满全屏,不跟随滚轮滑动,透明度0.7*/
        .shade{
            position: fixed;
            top:0;
            left: 0;
            right: 0;
            bottom: 0;
            background-color: gray;
            opacity: 0.7;
        }
        /*top和left居中的是这个盒子的左上角的点居中,利用margin让整个盒子居中*/
        .model{
            width: 200px;
            height: 200px;
            background-color: bisque;
            position: absolute;
            top:50%;
            left: 50%;
            margin-top: -100px;
            margin-left: -100px;

        }
        /*class有hide的标签都隐藏不显示*/
        .hide{
            display: none;
        }
    </style>
</head>

<body>
<div class="content">
    <button onclick="show()">show</button>
    hellohellohellohellohellohellohellohellohellohellohellohello
</div>

<div class="shade hide"></div>

<div class="model hide">
    <button onclick="cancel()">cancel</button>
</div>

<script>
    function show(){
        var ele_shade = document.getElementsByClassName('shade')[0];
        var ele_model = document.getElementsByClassName('model')[0];
        //点击show之后原本隐藏的标签从class列表中删除hide,取消隐藏
        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];
        //点击cancle之后原本显示的标签在class列表中添加hide,隐藏
        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>
<button onclick="selectAll()">全选</button>
<button onclick="cancel()">取消</button>
<button onclick="reverse()">反选</button>

<table border="1px">
    <tr>
        <td><input type="checkbox"></td>
        <td>1</td>
        <td>2</td>
        <td>3</td>
    </tr>
    <tr>
        <td><input type="checkbox"></td>
        <td>44</td>
        <td>55</td>
        <td>66</td>
    </tr>
    <tr>
        <td><input type="checkbox"></td>
        <td>777</td>
        <td>888</td>
        <td>999</td>
    </tr>
</table>

<body>
<script>
    function selectAll() {
        var ele = document.getElementsByTagName('input'); //通过标签拿到的是一个类似数组的结构
        for (var i = 0;i < ele.length;i++){
            var input = ele[i];     //拿到这个数组中的每一个对象
            input.checked = true;   //让每一个对象都被选中
        }
    }
    function cancel(){
        var ele = document.getElementsByTagName('input');
        for (var i = 0;i < ele.length;i++){
            var input = ele[i];
            input.checked = false;
        }
    }
    function reverse(){
        var ele = document.getElementsByTagName('input');
        for (var i = 0;i < ele.length;i++){
            var input = ele[i];
            input.checked = !input.checked;     //拿到的每一个将其选中状态取反
//          或者做判断取反
//          if(input.checked){
//                input.checked=false
//            }else {
//                input.checked=true
//            }
            }
    }
</script>
</body>
</html>

二级联动

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

<body>
<select id="province">
    <option value="">请选择省份</option>     <!--后面的内容动态添加-->
</select>
<select id="cities">
    <option value="">请选择城市</option>
</select>

<script>
    data = {"河北省":["石家庄","廊坊"],"山西":["晋城","大同"],"陕西":["西安","宝鸡"]};
    var p_ele = document.getElementById('province');
    var c_ele = document.getElementById('cities');
    //拿到父标签对象后,我们需要给这两个对象添加option标签,option标签就是data中的键
    for (var i in data) {
        var ele = document.createElement('option'); //首先遍历,遍历出的每一个都应当创建一个option
        ele.innerHTML = i;  //将每一个遍历出的对象赋值给option当内容
        p_ele.appendChild(ele); //现在的ele已经是有内容的option标签了,添加到父标签中
    }

    //动态添加就是用户选哪个省,哪个省对应的城市才会添加到cities中,所以我们需要知道用户的选择
    p_ele.onchange = function () {
        console.log(this.selectedIndex); //选河北为1,山西2,陕西3,0为'请选择城市'
        console.log(this.options[this.selectedIndex]);
        //this.selectedIndex;         //this就是绑定onchange的标签 select,此处可以获得被选中的option的索引
        //this.options[this.selectedIndex]; //这样我们就通过索引拿到了具体的省份
        var city = data[this.options[this.selectedIndex].innerHTML]; //data[河北]
        c_ele.options.length=1;  //解决bug,二次选省份上次省份的城市不清除
        // 此处length=0为清空,length=1为显示'请选择城市'

        //拿到省份对应的城市后,是这一个类似数组的形式,需要遍历每一个城市
        for (var i = 0;i < city.length;i++) {
            var ele = document.createElement('option');//每一个遍历出的对象都要有一个option
            ele.innerHTML = city[i]; //将每一个遍历出的对象赋值给option当内容
            c_ele.appendChild(ele);  //现在的ele已经是有内容的option标签了,添加到父标签中
        }
    }
</script>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值