金子fa

导航

js作业合集

14-根据数组渲染京东商品列表

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<style>
    li{
        list-style-type: none;
        padding: 0;
        margin: 0;
        width: 200px;
        height: 260px;
        border: 1px solid #000;
        text-align: center;
        float:left;
        margin: 10px;
    }
    li img{
        width: 140px;
        height: 140px;
    }
    li p{
        overflow: hidden;
        text-overflow: ellipsis;
        white-space:nowrap;
        width: 150px;
        margin:0 auto;
    }
</style>
<body>

</body>
<script>

// 虽然数组中可以存放各种不同的数据,但是通常我们在项目中,会给数组中存放相同类型的数据
// 共有4个商品,且4个商品的数据都是一样的,所以将4个商品的数据存放在数组中
var arr = [
    // 每个商品都包含3个东西,这3个东西都是不一样的:图片链接、名称、价格,为了更好的能分辨清楚这3个东西,就将每个商品的数据,作为一个对象
    {
        goodsImg: 'https://img30.360buyimg.com/seckillcms/s280x280_jfs/t1/126365/21/24434/63006/622af7b6E6808ac6d/ce21176f2d23014b.jpg.webp',
        goodsName: '多莱米(Doremi) 无线蓝牙耳机半入耳超薄迷你隐形健身运动音乐游戏适用于oppo华为vivo苹果 黑色 轻薄贴耳 睡躺可戴',
        goodsPrice: '83.00'
    },
    {
        goodsImg: 'https://img12.360buyimg.com/seckillcms/s280x280_jfs/t1/209493/25/10274/137859/619c90e6Ea0593ce4/6ceaab5d094f4008.jpg.webp',
        goodsName: '朵唯(DOOV)D13 Pro 4G老人手机 移动联通电信全网通 大图标大字老年机 百元学生手机 32GB拍照手机 青空蓝',
        goodsPrice: '479.00'
    },
    {
        goodsImg: 'https://img10.360buyimg.com/seckillcms/s280x280_jfs/t1/214381/37/14975/192879/622dc5d9E21737376/d4ef53fed054372d.jpg.webp',
        goodsName: '【男童鞋】安踏儿童运动鞋男童跑鞋网面透气中大童男鞋2022年春季新品官网旗舰休闲鞋青少年学生童鞋 【透气网面】深藏青/阳光橙/安踏白 36码/内长23cm',
        goodsPrice: '129.00'
    }
]
console.log(arr);
// 每个商品都是一个列表项,应该每个商品信息都使用li标签


for(var i=0; i<arr.length; i++) {
    document.write('<li>');
        // arr[0] 获取到数组中第一个对象
        var goods = arr[i]
        // 对象中获取图片路径,使用goods.goodsImg获取,获取到的图片路径赋值给imgPath变量
        var imgPath = goods.goodsImg

        document.write('<img src="' + imgPath + '" />');
        document.write('<p>'+goods.goodsName+'</p>');
        document.write('<span>'+goods.goodsPrice+'</span>');
    document.write('</li>');
}
</script>
</html>
 
页面效果

 

 

将'I Love You'转换成'You Love I'

 

 将'i love you'这个字符串转成'You Love I'

 

思路:先将每个单词的首字母大写,然后再进行上面步骤
1.将每个单词获取到 - 将字符串转成数组
2.将每个单词首字母大写 - 数组中的每个元素就可以进行首字母大写
3.将首字母打的获取到转大写,跟单词后面的字符拼接在一起
*/
// var str = 'i love you'
// 将字符串转成数组
// var arr = str.split(' ')
// console.log(arr);
// 每个单词都需要首字母大写 - 遍历数组
// var brr = []
// arr.forEach(function(v) {
//     // v就是遍历出来的每个元素
//     // console.log(v);
//     // 将v的第一个字符获取到并转大写
//     // console.log(v[0])
//     var firstWord = v[0].toUpperCase()
//     // console.log(firstWord);
//     // 要跟后面的字符拼接 - 获取到首字母后面的所有字符 - 截取字符串
//     var otherWords = v.slice(1)
//     // console.log(otherWords);
//     // 拼接
//     var newWord = firstWord + otherWords
//     // console.log(newWord);
//     // 将所有新单词放在brr中
//     brr.push(newWord)
// })
// console.log(arr);
// console.log(brr);

// var brr = arr.map(function(v) {
//     var firstWord = v[0].toUpperCase()
//     var otherWords = v.slice(1)
//     return firstWord + otherWords
// })
// // console.log(brr);
// var str1 = brr.reverse().join(' ')
// console.log(str1);
过滤下面字符串中的敏感词

 

 

 

 

字符串去重复

 

 

// 将不重复的放在新字符串中
// var str = 'asdfasdfasdf'
// var str1 = str[0] // as
// for(var i=1; i<str.length; i++) {
//     var a = true
//     // 小循环在判断str[i]在不在str1中 - indexOf 在字符串中找元素第一次出现的下标,如果找到了,返回下标,找不到返回-1 - 可以利用这个方法判断某个字符是否在字符串中
//     var index = str1.indexOf(str[i])
//     if(index < 0) {
//         str1 += str[i]
//     }
//     // for(var j=0; j<str1.length; j++) {
//     //     if(str[i] === str1[j]) {
//     //         a = false
//     //         break
//     //     } else {
//     //         // 遍历了一个源字符串中的字符,跟str1中的第一个字符不相等,但是我们判断的是这个字符在不在str1中,应该将str1中所有字符都跟当前字符去比较,不能肯定这个字符就不在str1中
//     //     }
//     // }
//     // // 当小循环结束了,都没有一次是break,才能肯定这个字符他不在str1中
//     // // 判断上面的循环是否完整的执行结束了,而不是中间被break了
//     // // if(j === str1.length) {
//     // //     str1 += str[i]
//     // // }

//     // if(a) {
//     //     str1 += str[i]
//     // }
// }
// console.log(str1);

// for(var i=1; i<100; i++) {
//     if(i === 5) {
//         break
//     }
// }
// 如何判断上面循环是否完整执行结束了
// 当循环完整结束后,这里输出i是100
// 如果被break了,这里输出i是5
 
利用对象的键不重复

 

统计字符串中每个字符的个数

 

// 思路:
/*
1.统计一个字符的个数
2.遍历字符串统计每个
*/
// var str = 'asdfasdfasdfasdefasdfss'
// 统计a的个数 - 遍历字符串,每个字符跟当前字符比较是否一样,一样了计数器++
// var k = 0
// for(var i=0; i<str.length; i++) {
//     if(str[i] === 's') {
//         k++
//     }
// }
// console.log(k);
// 遍历字符串,每个字符的个数统计
// for(var j=0; j<str.length; j++) {
//     // 统计str[j]他出现的个数 - str[j]中有重复的字符,会有很多重复的统计
//     var k = 0
//     for(var i=0; i<str.length; i++) {
//         if(str[i] === str[j]) {
//             k++
//         }
//     }
//     console.log(str[j] + '字符出现了' + k + '次');
// }
// 因为外面的循环,会遍历所有字符,会有重复的字符,统计结果中有很多重复的结果
// 解决:先对str去重,然后外面的循环使用去重后的字符串遍历
// 去重
// var str1 = ''
// for(var i=1; i<str.length; i++) {
//     var index = str1.indexOf(str[i])
//     if(index < 0) {
//         str1 += str[i]
//     }
// }
// // console.log(str1);
// // 统计
// for(var j=0; j<str1.length; j++) {
//     var k = 0
//     for(var i=0; i<str.length; i++) {
//         if(str[i] === str1[j]) {
//             k++
//         }
//     }
//     console.log(str1[j] + '字符出现了' + k + '次');
// }

// 利用对象键唯一的特性统计
// var str = 'asdfasdfasdfasdefasdfss'
// 将所有字符都作为对象的键
// var obj = {}
// for(var i=0; i<str.length; i++) {
//     // 默认对象中全是每个字符,每个字符的次数默认0
//     obj[ str[i] ] = 0  
// }

// for(var i=0; i<str.length; i++) {
//     // 每个字符都让自己的键对应的值+1
//     obj[ str[i] ] = obj[ str[i] ] + 1  
// }
// console.log(obj);

// for(var i=0; i<str.length; i++) {
//     // 判断对象中是否有当前字符这个键
//     if(obj[ str[i] ]) {
//         // 如果有了,就让原来的值+1再重新赋值给当前这个键
//         obj[str[i]] = obj[str[i]]+1
//     } else {
//         // 如果不存在,就是第一次统计到,给次数赋值为1
//         obj[str[i]] = 1
//     }
// }
// console.log(obj);

// for(var i=0; i<str.length; i++) {
//     // 判断对象中是否有当前字符这个键
//     // if(obj[ str[i] ]) {
//     //     // 如果有了,就让原来的值+1再重新赋值给当前这个键
//     //     // obj[str[i]] = obj[str[i]]+1
//     //     obj[str[i]]++
//     // } else {
//     //     // 如果不存在,就是第一次统计到,给次数赋值为1
//     //     obj[str[i]] = 1
//     // }

//     obj[str[i]] = obj[str[i]] ? ++obj[str[i]] : 1
// }
// console.log(obj);

// var str = 'asdfasdfasdfasdefasdfss'
// // 1.去重
// var str1 = ''
// for(var i=1; i<str.length; i++) {
//     var index = str1.indexOf(str[i])
//     if(index < 0) {
//         str1 += str[i]
//     }
// }
// // console.log(str1);
// // // str1 = 'asdfe'
// // // 2.统计中的每个字符在str中的出现次数 - 利用indexOf
// // // 遍历str1
// // for(var i=0; i<str1.length; i++) {
// //     // str1[i]就是我们要统计的字符
// //     // 定义计数器
// //     var k = 0
// //     // 在str中找当前这个字符在str中第一次出现的下标
// //     // var index = str.indexOf(str1[i])
// //     // // 在str中找到了
// //     // if(index >= 0) {
// //     //     k++
// //     // }

// //     // 第二次继续查找
// //     // var index = str.indexOf(str1[i], index+1)
// //     // if(index >= 0) {
// //     //     k++
// //     // }

// //     // 每次找的过程,其实就是重复 - 用循环处理重复
// //     // 不确定要循环多少次,使用while更好一点
// //     // 定义初始下标
//     var startIndex = 0
//     while(true) {
//         var index = str.indexOf(str1[i], startIndex)
//         if(index >= 0) {
//             k++
//             // 下次开始找的下标,是当前找到的下标+1
//             startIndex = index+1
//         } else {
//             break
//         }
//     }
//     // 输出结果
//     console.log( str1[i] + '出现了'+k+'次');
// }

// for(var i=0;i<str1.length;i++) {
//     var k = 0
//     var index = 0
//     while(index >= 0) {
//         index = str.indexOf(str1[i], index)
//         if(index >= 0) {
//             k++
//             index++
//         }
//     }
//     console.log( str1[i] + '出现了'+k+'次');
// }

// var str = 'asdfasdfasdfasdefasdfss'

// var str1 = 'asdfe'

// 先找str1中的a字符,在str中出现的次数
// 计数器  k = 0
/*
var index = str.indexOf('a', 0)
index = 0
如果index>=0,找到了,继续找
k++
下次再找
var index = str.indexOf('a', 1)
index = 4
如果index>=0,找到了,继续向后找
k++
下次找
var index = str.indexOf('a', 5)
index = 8
如果index>=0,找到了,继续向后找
k++
下次找
var index = str.indexOf('a', 9)
index = 12
如果index>=0,找到了,继续向后找
k++
下次找
var index = str.indexOf('a', 13)
index = 17
如果index>=0,找到了,继续向后找
k++
下次找
var index = str.indexOf('a', 13)
index = -1
如果index>=0,没有找到,a字符就找完了

*/
密码格式要求:长度6~16位,必须同时包含数字、大写字母、小写字母组成
// var password = 'asdjfhkj1321'
/*
1.验证长度:字符串.length
2.同时包含3样:
(1)验证是否包含了数字
(2)验证是否包含了小写
(3)验证是否包含了大写
3.判断是否前面3个小验证同时成立了
*/
// if(password.length >= 6 && password.length <= 16) {
//     // 长度满足要求
//     // 同时包含3样
//     // 验证是否包含了数字
//     // 如何判断字符串中是否包含了数字? - 每个字符都判断是否是数字 - isNaN - 阿斯克码:48-57,将每个字符都转成阿斯克码判断是否在48-57范围内
//     // 定义一个初始值
//     var shuzi = 0
//     // 每个都要判断,就需要遍历字符串
//     for(var i=0; i<password.length; i++) {
//         // 获取每个字符对应的阿斯克码
//         var code = password.charCodeAt(i)
//         // 每个字符的阿斯克码是否是数字,如果是数字,就没有必要继续判断了
//         if(code>=48 && code<=57) {
//             shuzi = 1
//             console.log('包含了数字');
//             break
//         } else {
//             // 1个字符不是数字 - 并不能说整个字符串中没有包含数字
//         }
//     }
//     // 等循环结束以后才能知道是否没有包含数字
//     if(i === password.length) {
//         console.log('没有包含数字');
//     }
//     var daxie = 0
//     for(var i=0; i<password.length; i++) {
//         // 获取每个字符对应的阿斯克码
//         var code = password.charCodeAt(i)
//         // 每个字符的阿斯克码是否是数字,如果是数字,就没有必要继续判断了
//         if(code>=65 && code<=90) {
//             daxie = 1
//             console.log('包含了大写');
//             break
//         } else {
//             // 1个字符不是数字 - 并不能说整个字符串中没有包含数字
//         }
//     }
//     // 等循环结束以后才能知道是否没有包含数字
//     if(i === password.length) {
//         console.log('没有包含大写');
//     }
//     var xiaoxie = 0
//     for(var i=0; i<password.length; i++) {
//         // 获取每个字符对应的阿斯克码
//         var code = password.charCodeAt(i)
//         // 每个字符的阿斯克码是否是数字,如果是数字,就没有必要继续判断了
//         if(code>=97 && code<=122) {
//             xiaoxie = 1
//             console.log('包含了小写');
//             break
//         } else {
//             // 1个字符不是数字 - 并不能说整个字符串中没有包含数字
//         }
//     }
//     // 等循环结束以后才能知道是否没有包含数字
//     if(i === password.length) {
//         console.log('没有包含小写');
//     }
//     // 判断3个变量是否都是1
//     if(shuzi===1 && daxie===1 && xiaoxie===1) {
//         console.log('符合要求');
//     } else {
//         console.log('不符合要求');
//     }
// } else {
//     console.log('长度不够');
// }



var password = 'asdjfhASDFkj1321'
if(password.length >= 6 && password.length <= 16) {
    var shuzi = 0
    // for(var i=0; i<password.length; i++) {
    //     var code = password.charCodeAt(i)
    //     if(code>=48 && code<=57) {
    //         shuzi = 1
    //         break
    //     }
    // }
    var daxie = 0
    // for(var i=0; i<password.length; i++) {
    //     var code = password.charCodeAt(i)
    //     if(code>=65 && code<=90) {
    //         daxie = 1
    //         break
    //     }
    // }
    var xiaoxie = 0
    // for(var i=0; i<password.length; i++) {
    //     var code = password.charCodeAt(i)
    //     if(code>=97 && code<=122) {
    //         xiaoxie = 1
    //         break
    //     }
    // }
    // 将3个循环中的单分支判断放在1个循环 - 3个循环一毛一样,且获取阿斯克码的代码也是一样的,3个循环中不一样的代码就是单分支判断不一样
   
    for(var i=0; i<password.length; i++) {
        var code = password.charCodeAt(i)
        if(code>=48 && code<=57) {
            shuzi = 1
            continue
        }
        if(code>=65 && code<=90) {
            daxie = 1
            continue
        }
        if(code>=97 && code<=122) {
            xiaoxie = 1
            continue
        }
    }
   
    if(shuzi===1 && daxie===1 && xiaoxie===1) {
        console.log('符合要求');
    } else {
        console.log('不符合要求');
    }
} else {
    console.log('长度不够');
}


// for(var i=1; i<=100; i++) {
//     if(i%3 === 0) {
//         console.log(i);
//     }
//     if(i%5 === 0) {
//         console.log(i);
//     }
// }
// for(var i=1; i<=100; i++) {
//     if(i%5 === 0) {
//         console.log(i);
//     }
// }
请根据控制台输入的特定日期格式拆分日期   如:请输入一个日期(格式如:XX月XX日XX年)  经过处理得到:XX年XX月XX日

 

 

限制文件后缀

 

获取随机颜色
编写一个函数获得一个十六进制的随机颜色的字符串(例如:#20CD4F或rgb(20,23,49))
颜色有3种表现形式
1.英文单词
2.rgb - rgb(0~255的随机数, 0~255的随机数, 0~255的随机数)
3.16进制 - #0~255的随机数转成16进制 + 0~255的随机数转成16进制 +0~255的随机数转成16进制

rgb的随机颜色值
var num1 = getRandom(0, 256)
console.log(num1);

var num2 = getRandom(0, 256)
console.log(num2);

var num3 = getRandom(0, 256)
console.log(num3);
// css的值,在js中都是以字符串形式表现的
var res = 'rgb(' + num1 + ',' + num2 + ',' + num3 + ')'
console.log(res);

小demo点击div让div更换随机背景颜色
box.onclick = function() {
    var num1 = getRandom(0, 256)
    console.log(num1);

    var num2 = getRandom(0, 256)
    console.log(num2);

    var num3 = getRandom(0, 256)
    console.log(num3);
    // css的值,在js中都是以字符串形式表现的
    var res = 'rgb(' + num1 + ',' + num2 + ',' + num3 + ')'
    console.log(res);
    box.style.backgroundColor = res
}

重复代码简化
var arr = []
for(var i=0; i<3; i++) {
    var num = getRandom(0, 256)
    arr.push(num)
}
console.log(arr);
var str = arr.join()
console.log(str);
var res = 'rgb(' + str + ')'
box.onclick = function() {
    var arr = []
    for(var i=0; i<3; i++) {
        var num = getRandom(0, 256)
        arr.push(num)
    }
    console.log(arr);
    var str = arr.join()
    console.log(str);
    var res = 'rgb(' + str + ')'
    box.style.backgroundColor = res
}

16进制颜色值
var res = '#'
for(var i=0; i<3; i++) {
    var num = getRandom(0, 256)
    // 转成16进制
    num = num.toString(16)
    // 将每个num都拼接在一起
    res += num
}
console.log(res);

box.onclick = function() {
    var res = '#'
    for(var i=0; i<3; i++) {
        var num = getRandom(0, 256)
        // 转成16进制
        num = num.toString(16)
        // console.log(num);
        // 判断num是否是1位,如果是1位前面补0
        num = num.length===1 ? '0' + num : num
        // 将每个num都拼接在一起
        res += num
    }
    console.log(res);
    // 瑕疵:16进制颜色值必须是6位,少于6位是无法使用的
    box.style.backgroundColor = res
}


封装一个随机颜色值的函数
function getColor(hex) {
    // hex是布尔值,如果是true,就用16进制的颜色值,如果hex是false或不传,就使用rgb的颜色值
    // 判断hex是true还是没有传递
    if(hex) {
        // 16进制颜色值的获取
        var color = '#'
        for(var i=0; i<3; i++) {
            var num = getRandom(0, 256)
            num = num.toString(16)
            num = num.length === 1 ? '0' + num : num
            color += num
        }
        return color
    } else {
        // rgb颜色值的获取
        var arr = []
        for(var i=0; i<3; i++) {
            var num = getRandom(0, 256)
            arr.push(num)
        }
        var str = arr.join()
        return 'rgb(' + str + ')'
    }
}


function getColor(hex) {
    var arr = []
    var str = '#'
    for(var i=0; i<3; i++) {
        var num = getRandom(0, 256)
        arr.push(num)

        num = num.toString(16)
        num = num.length === 1 ? '0' + num : num
        str += num
    }
    if(hex) {
        return str
    }
    return 'rgb(' + arr.join() + ')'
}

box.onclick = function() {
    var color = getColor(true)
    console.log(color);
    box.style.backgroundColor = color
}
已知内容条数,和每页展示的条数,编程输出所有页码

 

 

获取具体时间

 

// 从时间日期对象中获取具体的时间
var date = new Date()
console.log(date);
// 获取年份 - 对象.getFullYear()
var year = date.getFullYear()
console.log(year);
// 获取月份 - 对象.getMonth() - 在对象中,使用0~11来描述1~12月
var month = date.getMonth() + 1 // 因为获取到的月份会比实际月份小1,所以通常会+1
console.log(month);
// 获取日 - 对象.getDate()
var d = date.getDate() // 注意:千万不要使用date变量表示日
console.log(d);
// 获取星期 - 对象.getDay()
var day = date.getDay()
console.log(day);
// 获取时 - 对象.getHours()
var hour = date.getHours()
console.log(hour);
// 获取分 - 对象.getMinutes()
var minute = date.getMinutes()
console.log(minute);
// 获取秒 - 对象.getSeconds()
var second = date.getSeconds()
console.log(second);
// 获取毫秒 - 对象.getMilliseconds() - 1s === 1000ms
var mill = date.getMilliseconds()
console.log(mill);

// 获取时间戳:从1970年1月1日8点0分0秒到现在所走过的毫秒数来描述当前时间的
// 语法:对象.getTime()
var time = date.getTime()
console.log(time);
// 为什么要用时间戳来描述时间,很多情况下,我们需要对时间进行计算的,减法运算:
// 2022年10月1日 - 2022年3月18日
// 国庆的时间戳 - 当前的时间戳 = 毫秒差 - 转换成天数

/*
总结;
    获取具体的时间日期:
        getFullYear()
        getMonth() + 1
        getDate()
        getDay()
        getHours()
        getMinutes()
        getSeconds()
        getMilliseconds()
        getTime()
*/
设置时间
// 通过时间日期对象设置时间
var date = new Date() // 获取到当前时间对象
console.log(date);
// 将这个对象变成另外一个时间的对象 - 设置这个时间
// 设置年份:对象.setFullYear(目标年份)
date.setFullYear(2023)
console.log(date);
// 设置月份:对象.setMonth(目标月份) - 0~11来描述1~12月
date.setMonth(4) // 参数是0~11,参数:比实际月份-1
console.log(date);
// 设置日:对象.setDate(目标日)
date.setDate(25)
console.log(date);
// 设置时:对象.setHours(目标时)
date.setHours(15)
console.log(date);
// 设置分:对象.setMinutes(目标分)
date.setMinutes(50)
console.log(date);
// 设置秒:对象.setSeconds(目标秒)
date.setSeconds(59)
console.log(date);
// 设置毫秒:对象.setMilliseconds(目标毫秒数)
date.setMilliseconds(500)
console.log(date);
// 通过设置具体的时间,时间日期对象就发生了变化 - 通过设置以后的对象获取具体的时间
console.log( date.getMilliseconds() );

// 设置时间戳:对象.setTime(时间戳) - 将当前这个对象的时间切换成指定时间戳的对象
date.setTime(0)
console.log(date);

/*
总结:
    设置具体时间
        setFullYear()
        setMonth() - 参数要比实际的月份少1
        setDate()
        setHours()
        setMinutes()
        setSeconds()
        setMilliseconds()
        setTime()
    注意:在设置时间中,没有设置星期几,因为星期几是根据年月日生成的,是不能被设置
*/
100天前是几月几号

 

创建不同时间的日期对象 

 

现在距离国庆还有多少天

 

 

判断当前是否还能限时抢购,开始时间:"2019-8-1",结束时间:"2019-9-1"

 

获取时间栈 

 

 格式化输出时间

 

 

 

.编写函数,格式化当前时间为 "YYYY-MM-DD HH:ii:ss"

 

 定义函数,要求传入两个时间节点,能返回两个时间节点之间相差多少天多少小时多少分钟多少秒

 

 根据结构喝数据创建表格

<body>
    <table border=1 width="500">
        <thead>
            <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>成名绝技</th>
            </tr>
        </thead>
        <tbody>
            <!-- <tr>
                <td>1</td>
                <td>令狐冲</td>
                <td>20</td>
                <td>男</td>
                <td>独孤九剑</td>
            </tr>
            <tr>
                <td>2</td>
                <td>东方不败</td>
                <td>50</td>
                <td>女</td>
                <td>葵花宝典</td>
            </tr> -->
        </tbody>
    </table>
</body>
<script>
var arr = [
    {
        name:"令狐冲",
        age:20,
        sex:"男",
        skill:"独孤九剑"
    },
    {
        name:"东方不败",
        age:50,
        sex:"女",
        skill:"葵花宝典"
    },
    {
        name:"任我行",
        age:55,
        sex:"男",
        skill:"吸星大法"
    }
];
// innerText和innerHTML赋的值只能是字符串
/*
思路:
需要在tbody中放3个tr,使用innerHTML
每个tr中的内容都是对应数组中每个对象的数据
第一个对象可以拼接成一个tr的内容
第二个对象可以凭借成第二个tr的内容
....
最终,需要将3个tr拼接成一个更大的字符串,放在innerHTML里面
先定义一个空字符串,拼接一次,再拼接一次,最后拼接一次

每次拼接,都需要对应每个对象中的数据,拼接3次,其实就是在遍历数组
循环遍历数组,每遍历一次拼接一次
*/
var str = ''
for(var i=0; i<arr.length; i++) {
    var obj = arr[i]
    // str += '<tr><td>'+(i+1)+'</td><td>'+obj.name+'</td><td>'+obj.age+'</td><td>'+obj.sex+'</td><td>'+obj.skill+'</td></tr>'
    str += '<tr>'
        str += '<td>'
            str += i+1
        str += '</td>'
        str += '<td>'
            str += obj.name
        str += '</td>'
        str += '<td>'
            str += obj.age
        str += '</td>'
        str += '<td>'
            str += obj.sex
        str += '</td>'
        str += '<td>'
            str += obj.skill
        str += '</td>'
    str += '</tr>'
}
var tbody = document.querySelector('tbody');
tbody.innerHTML = str
 
删除表格
 
 
<style>
    td:last-child{
        background-color: #abcdef;
    }
</style>
<body>
    <table border=1 width="500">
        <thead>
            <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>成名绝技</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
           
        </tbody>
    </table>
</body>
<script>
var arr = [
    {
        name:"令狐冲",
        age:20,
        sex:"男",
        skill:"独孤九剑"
    },
    {
        name:"东方不败",
        age:50,
        sex:"女",
        skill:"葵花宝典"
    },
    {
        name:"任我行",
        age:55,
        sex:"男",
        skill:"吸星大法"
    }
];
loadHTML()
function loadHTML() {
    var str = ''
    for(var i=0; i<arr.length; i++) {
        var obj = arr[i]
        str += '<tr>'
            str += '<td>'
                str += i+1
            str += '</td>'
            str += '<td>'
                str += obj.name
            str += '</td>'
            str += '<td>'
                str += obj.age
            str += '</td>'
            str += '<td>'
                str += obj.sex
            str += '</td>'
            str += '<td>'
                str += obj.skill
            str += '</td>'
            str += '<td>'
                str += '删除'
            str += '</td>'
        str += '</tr>'
    }
    var tbody = document.querySelector('tbody');
    tbody.innerHTML = str
}

// // 获取删除的td
// var tds = document.querySelectorAll('td:last-child');
// console.log(tds);

// tds[0].onclick = function(){
//     // 删除tr,没有学习标签删除,所以需要将数组中当前数据对应的对象删掉,然后根据新的数据重新创建表格 - 间接性的将tr删掉了
//     arr.splice(0, 1)
//     console.log(arr);
//     loadHTML()
//     // 重新获取td - 重新添加事件

// }
// tds[1].onclick = function(){
//     arr.splice(1, 1)
//     loadHTML()
// }
// tds[2].onclick = function(){
//     arr.splice(2, 1)
//     loadHTML()
// }

// 上面这个绑定事件的操作在重复 - 用循环处理重复
// for(var i=0; i<tds.length; i++) {
//     tds[i].onclick = function() {
//         // console.log(111); // 调试事件是否可用
//         // arr.splice(i, 1)
//         // console.log(arr); // 调试数组是否删除成功

//         // 删除数组没有成功,能有问题的代码就是 变量i
//         console.log(i); // 3

//         // loadHTML()
//     }
// }
// console.log(i); // 3

/*
当循环中添加了事件,事件中要获取每次循环对应的变量是获取不到的,原因如下:
当我们刷新页面,循环会执行结束,此时全局中的i是3
接下来,我们才会去点击,此时,在事件函数中,输出i  
    在事件函数中先找变量i是否被定义过,发现没有,然后去全局找,找到了,值是3

*/

// 在事件函数中,每次找i,都在全局,全局中的i我们是无法修改的 - 将每次的i,留在一个局部中,让事件函数处在这个局部中
addEvent()
function addEvent() {
    // 获取删除的td
    var tds = document.querySelectorAll('td:last-child');
    for(var i=0; i<tds.length; i++) {
        // function fn(i) {
        //     tds[i].onclick = function() {
        //         // console.log(i);
        //         arr.splice(i, 1)
        //         loadHTML()
        //         addEvent()
        //     }
        // }
        // fn(i)
        (function(i) {
            tds[i].onclick = function() {
                // console.log(i);
                arr.splice(i, 1)
                loadHTML()
                addEvent()
            }
        })(i)
    }
}

// var i = 0
// function fn(i) {
       
//     tds[i].onclick = function() {
//         console.log(i);
//     }

// }

// fn(i)
// i++
// function fn(i) {
       
//     tds[i].onclick = function() {
//         console.log(i);
//     }

// }

// fn(i)
// i++
// function fn(i) {
       
//     tds[i].onclick = function() {
//         console.log(i);
//     }

// }

// fn(i)
// i++





// 每次点击删除的td,都会,将数组操作完以后,重新加载表格 - 给tbody中重新放一个字符串内容 - 形成新的tr和td,新的td没有给绑定过事件,所以,删除一次以后,再次点击是无效的 - 我们需要在每次删除以后,都要重新获取td,重新添加事件
 
利用节点操作实现表格删除
 
<style>
    td:last-child{
        background-color: #abcdef;
    }
</style>
<body>
    <table border=1 width="500">
        <thead>
            <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>成名绝技</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
           
        </tbody>
    </table>
</body>
<script>
var arr = [
    {
        name:"令狐冲",
        age:20,
        sex:"男",
        skill:"独孤九剑"
    },
    {
        name:"东方不败",
        age:50,
        sex:"女",
        skill:"葵花宝典"
    },
    {
        name:"任我行",
        age:55,
        sex:"男",
        skill:"吸星大法"
    }
];
var tbody = document.querySelector('tbody');
loadHTML()
function loadHTML() {
    var str = ''
    for(var i=0; i<arr.length; i++) {
        var obj = arr[i]
        var tr = document.createElement('tr')
        tbody.appendChild(tr)
        var td = document.createElement('td')
        td.innerText = i+1
        tr.appendChild(td)
        for(var attribute in obj) {
            var td = document.createElement('td')
            td.innerText = obj[attribute]
            tr.appendChild(td)
        }
        var td = document.createElement('td')
        td.innerText = '删除'
        tr.appendChild(td)
        // str += '<tr>'
        //     str += '<td>'
        //         str += i+1
        //     str += '</td>'
        //     str += '<td>'
        //         str += obj.name
        //     str += '</td>'
        //     str += '<td>'
        //         str += obj.age
        //     str += '</td>'
        //     str += '<td>'
        //         str += obj.sex
        //     str += '</td>'
        //     str += '<td>'
        //         str += obj.skill
        //     str += '</td>'
        //     str += '<td>'
        //         str += '删除'
        //     str += '</td>'
        // str += '</tr>'
    }
   
    // tbody.innerHTML = str
}
// 表格删除
var tds = document.querySelectorAll('td:last-child');
// 遍历给他们添加事件
for(var i=0; i<tds.length; i++) {
    tds[i].onclick = function() {
        // 删除当前td所属的tr
        // tbody.removeChild(当前td所属的tr)
        // tbody.removeChild(this.parentElement)
        // console.log(this);
        this.parentElement.parentElement.removeChild(this.parentElement)
    }
}
 
 
 
 
广告弹出

 

<style>
    .adver{
        width: 300px;
        height: 150px;
        border: 1px solid #ccc;
        background-color: pink;
        position: absolute;
        bottom: 0;
        right: 0;
    }
    span{
        position: absolute;
        top: 0;
        right: 10px;
    }
</style>
<body>
<div class="adver">
    <span>×</span>
</div>
</body>
<script>
var adver = document.querySelector('.adver');
// 延迟消失
// setTimeout(function() {
//     // 消失 - 让div
//     // display:none   opacity:0   right: -300px
//     adver.style.display = 'none'
// }, 2000)

var span = document.querySelector('span');
span.onclick = function() {
    adver.style.display = 'none'

    setTimeout(function() {
        adver.style.display = 'block'
    }, 2000)
}
// setInterval(function() {
//     adver.style.display = 'block'
//     console.log(1);
// }, 2000)
距离过年的倒计时

 

<!-- 从效果中可以看出:
需要在页面中有4个标签,其中分别放日时分秒,这4个数字不停在变化 - 每隔1s就变一次

需要在页面中放上着4个标签
-->
距离过年倒计时:<span>0</span><span>0</span><span>0</span><span>0</span>
</body>
<script>
// 将过年的时间距离现在有多少天、时分秒计算出来 - 放进标签中去
var date = new Date()
var year = date.getFullYear()
var guonian = +new Date(year+1 + '-1-1')
console.log(guonian)
// date.setFullYear(date.getFullYear() + 1)
// 还需要设置月日时分秒
// var guonian = date.getTime()

var spans = document.querySelectorAll('span');

jisuan()
function jisuan() {
    var now = +new Date()
    var diff = guonian - now;
    var arr = []
    var day = parseInt(diff / 1000 / 60 / 60 / 24)
    var hour = parseInt(diff / 1000 / 60 / 60)%24
    var minute = parseInt(diff / 1000 / 60) % 60
    var second = parseInt(diff / 1000) % 60
    arr.push(day, hour, minute, second)
    // spans[0].innerText = day
    // spans[1].innerText = hour
    // spans[2].innerText = minute
    // spans[3].innerText = second

    // spans[0].innerText = arr[0]
    // spans[1].innerText = arr[1]
    // spans[2].innerText = arr[2]
    // spans[3].innerText = arr[3]

    arr.forEach(function(v, i) {
        spans[i].innerText = v
    })
}
// 定时器会在1s后执行
setInterval(jisuan, 1000)

 获取滚轮划过的距离

<div style="width: 20px;">
    夜,结束了一天的喧嚣后安静下来,伴随着远处路灯那微弱的光。风,毫无预兆地席卷整片旷野,撩动人的思绪万千。星,遥遥地挂在天空之中,闪烁着它那微微星光,不如阳光般灿烂却如花儿般如痴如醉。

      ——题记
   
      欲将沉醉换悲凉,清歌莫断肠。这混乱的尘世,究竟充斥了多少绝望和悲伤。你想去做一个勇敢的男子,为爱,为信仰,轰轰烈烈的奋斗一场。你周身充斥着无人可比的灵气和光芒。你有着与伟人比肩的才气和名声,你是那样高傲孤洁的男子。你的一寸狂心未说,已经几度黄昏雨。
   
      曾经以为,相爱的人一定要相守,只有相守,情感才能长久。可是,此岸和彼岸只不过是空间的差距,却无法拉长心灵的距离。
</div>
</body>
<script>
// 滚动过的距离:
// 卷去的高度
// var t = document.documentElement.scrollTop
// console.log(t);

// 卷去的宽度
// var l = document.documentElement.scrollLeft

window.onscroll = function() {
    // 有文档声明的写法
    // var t = document.documentElement.scrollTop
    // 没有文档声明的写法
    // var t = document.body.scrollTop

    // 不管什么情况都能获取到滚动过的距离
    var t = document.documentElement.scrollTop || document.body.scrollTop
    console.log(t);
    if(t >= 800) {
        document.body.style.backgroundColor = 'hotpink'
    }

    // var l = document.documentElement.scrollLeft
    // console.log(l);
    // if(l >= 4000) {
    //     document.body.style.backgroundColor = 'skyblue'
    // }
}
顶部悬浮喝回到顶部的动画效果
 
<style>
    .top{
        width: 100%;
        height: 100px;
        background-color: #abcdef;
        display: none;
        position: fixed;
        top: 0;
        left: 0;
    }
    .box{
        width: 20px;
    }
    .totop{
        position:fixed;
        right: 50px;
        bottom: 50px;
        width: 50px;
        height: 50px;
        border: 1px solid #000;
        text-align: center;
        line-height: 25px;
        display: none;
    }
</style>
<body>
<div class="top">
    这是顶部
</div>
<div class="box">
    春雨像个多情的恋人,缠缠绵绵了一天一夜依然不肯离去。清晨的雾霭还没有散尽,窗外的风景依然笼罩在薄纱似的雨雾里,朦朦胧胧,似真似幻。郊外的山峦和建筑越发显得模糊,就像水墨画里的远景,淡到和阴雨绵绵的天空融为一体。
   
    楼下院子里有一棵杏树,枝杈繁盛的树干已经长到了和三楼的窗户一样高。隔着玻璃仔细瞧,忽然发现枝头上已经掇满暗红色的花蕾,有的花蕾裂开了小口子,里面露出鲜艳的花瓣。还有个别性子急的,已经在雨中奋力绽放了,粉红色的花朵看似柔嫩脆弱,但一点儿也不畏惧料峭的春寒,急切地向世界展示着自己的美丽。

    我忽然意识到现在已经三月中旬,马上临近春分了。往年这个时候早已按捺不住好奇的心情,约几个好友匆匆奔赴山野,踏青、看花儿、拍风景、挖野菜……忙得不亦乐乎。北方的春天来的晚,去的也慢,一直可以玩到四月下旬,采完最后一波香椿才肯作罢。
</div>
<div class="totop">回到<br> 顶部</div>
</body>
<script>
var topbox = document.querySelector('.top');
var totop = document.querySelector('.totop');
window.onscroll = function() {
    var t = document.documentElement.scrollTop || document.body.scrollTop
    if(t >= 1800) {
        topbox.style.display = totop.style.display = 'block'
    } else {
        topbox.style.display = totop.style.display = 'none'
    }
}

totop.onclick = function() {
    var t = document.documentElement.scrollTop || document.body.scrollTop
    var timer = setInterval(function() {
        t -= 20
        console.log(1);
        if(t <= 0) {
            clearInterval(timer)
        }
        document.documentElement.scrollTop = document.body.scrollTop = t
    }, 20)
}

点击按钮切换图片 

<body>
<button>按钮</button>
<br>
<img src="./images/1.webp" width="400" height="200">
</body>
<script src="./js/utils.js"></script>
<script>
// 获取按钮 - 添加点击事件
var btn = document.querySelector('button');
var img = document.querySelector('img');
// 全局定义初始数字
// var num = 1
var arr = ['./images/1.webp', './images/2.webp', './images/3.webp']
// 全局定义初始下标
var index = 0
btn.onclick = function() {
    // 换图片 - 更换图片的路径
    // 随机切换 - 需要从./images/1.webp ./images/2.webp ./images/3.webp中随机找一个路径放在img的src属性中

    /*
    思路1:发现所有的路径中只有数字不一样,从1~3之间获取一个随机数,然后拼接成一个路径
    思路2:将这3个图片路径放在一个数组中,从数组中随机获取一个元素
    */
    // var num = getRandom(1, 4)
    // var imgPath = './images/'+num+'.webp'

    // var arr = ['./images/1.webp', './images/2.webp', './images/3.webp']
    // var index = getRandom(0, arr.length)
    // var imgPath = arr[index]

    // 按照顺序切换: 1.webp  2.webp  3.webp
    // num++
    // 判断num最大值
    // if(num === 4) {
    //     num = 3
    //     // 1.不继续了
    //     return
    // }

    // 2.循环播放
    // if(num === 4) {
    //     num = 1
    // }
    // var imgPath = './images/'+num+'.webp'


    // 下标自增
    index++
    if(index === arr.length) {
        index = 0
    }
    var imgPath = arr[index]
    // 需要给img设置src属性
    img.src = imgPath
}
</script>
 
网页换皮肤
 
<style>
    .top{
        width: 100%;
        height: 0;
        background-color: pink;
        display: flex;
        justify-content: space-around;
        align-items: center;
        overflow: hidden;
        /* border: 10px solid #000; */
        transition: height 1s;
    }
    .top img{
        height: 120px;
        width: 200px;
    }
    html,body{
        padding: 0;
        margin: 0;
    }
</style>
<body>
<div class="top">
    <img src="./images/1.webp" alt="">
    <img src="./images/2.webp" alt="">
    <img src="./images/3.webp" alt="">
</div>
<button>按钮</button>
</body>
<script>
// 获取所有的要操作的标签
var btn = document.querySelector('button');
var box = document.querySelector('.top');
var imgs = document.querySelectorAll('.top>img');
// 给按钮添加事件
btn.onclick = function() {
    if(box.clientHeight > 0) {
        // 收回
        // 让div收回
        // var timer = setInterval(function() {
        //     // 获取高度
        //     var h = box.clientHeight
        //     // 加大
        //     h -= 2
        //     // 判断最大值
        //     if(h <= 0) {
        //         h = 0
        //         clearInterval(timer)
        //     }
        //     // 设置高度样式 - 设置的高度,值是不包含边框的
        //     box.style.height = h + 'px'
        // }, 20)

        box.style.height = 0
    } else {
        // 设置定时器
        // var timer = setInterval(function() {
        //     // 获取高度
        //     var h = box.clientHeight
        //     // 加大
        //     h += 2
        //     // 判断最大值
        //     if(h >= 150) {
        //         h = 150
        //         clearInterval(timer)
        //     }
        //     // 设置高度样式 - 设置的高度,值是不包含边框的
        //     box.style.height = h + 'px'
        // }, 20)
        box.style.height = 150 + 'px'
    }
}

// 循环所有img标签并添加事件
for(var i=0; i<imgs.length; i++) {
    imgs[i].onclick = function() {
        // 给网页设置当前图片为背景
        // 给网页设置背景 - 怎么设置?给body设置background-image样式
        // 当前图片的路径怎么获取?
        // console.log(this);
        var imgPath = this.getAttribute('src')
        // console.log(imgPath);
        // document.body.style.backgroundImage = 'url(图片路径)'
        // document.body.style.backgroundImage = 'url('+imgPath+')'
        // document.body.style.backgroundRepeat = 'no-repeat'
        // document.body.style.backgroundSize = '100% 100%'

        // document.body.style.background = 'url('+imgPath+') no-repeat 0 0 / 100% 100%'

        // document.body.style.width = '100%'
        // document.body.style.height = '100%'
        setStyle(document.body, {
            width: '100%',
            height: '100%',
            background: 'url('+imgPath+') no-repeat 0 0 / 100% 100%'
        })
        document.documentElement.style.width = '100%'
        document.documentElement.style.height = '100%'
        // 让div收回
        // var timer = setInterval(function() {
        //     // 获取高度
        //     var h = box.clientHeight
        //     // 加大
        //     h -= 2
        //     // 判断最大值
        //     if(h <= 0) {
        //         h = 0
        //         clearInterval(timer)
        //     }
        //     // 设置高度样式 - 设置的高度,值是不包含边框的
        //     box.style.height = h + 'px'
        // }, 20)
        box.style.height = 0 + 'px'
    }
}

// 封装批量设置样式的函数
// document.body.style.background = 'url('+imgPath+') no-repeat 0 0 / 100% 100%'
// document.body.style.width = '100%'
// document.body.style.height = '100%'
function setStyle(element, obj) {
    // var obj = {
    //     height: '100%',
    //     width: '100%',
    //     background: 'url('+imgPath+') no-repeat 0 0 / 100% 100%'
    // }
    for(var key in obj) {
        element.style[key] = obj[key]
    }
}
</script>

图片时钟 


<!-- <div class="box">
    <span>0</span>点
    <span>0</span>分
    <span>0</span>秒
</div> -->

<img src="./images/0.JPG" alt="">
<img src="./images/0.JPG" alt="">
<span><img src="./images/colon.JPG" alt=""></span>
<img src="./images/0.JPG" alt="">
<img src="./images/0.JPG" alt="">
<span><img src="./images/colon.JPG" alt=""></span>
<img src="./images/0.JPG" alt="">
<img src="./images/0.JPG" alt="">
</body>
<script>
// var spans = document.querySelectorAll('span');
// setInterval(function() {
//     var date = new Date()
//     var hour = date.getHours()
//     var minute = date.getMinutes()
//     var second = date.getSeconds()
//     spans[0].innerText= hour
//     spans[1].innerText= minute
//     spans[2].innerText= second
// }, 1000)
// 每隔一秒就更换所有图片 - 根据当前时间
var imgs = document.querySelectorAll('body>img');
clock()
setInterval(clock, 1000)
function clock() {
    var date = new Date()
    var hour = date.getHours()
    var minute = date.getMinutes()
    var second = date.getSeconds()
    hour = bu0(hour)
    minute = bu0(minute)
    second = bu0(second)
    var str = hour + minute + second
    console.log(hour, minute, second);
    // imgs[0].src = './images/'+str[0]+'.JPG'
    // imgs[1].src = './images/'+str[1]+'.JPG'
    // imgs[2].src = './images/'+str[2]+'.JPG'
    // imgs[3].src = './images/'+str[3]+'.JPG'
    // imgs[4].src = './images/'+str[4]+'.JPG'
    // imgs[5].src = './images/'+str[5]+'.JPG'
    for(var i=0; i<imgs.length; i++) {
        imgs[i].src = './images/'+str[i]+'.JPG'
    }
}
function bu0(num) {
    if(num < 10) {
        return '0' + num
    } else {
        return '' + num
    }
}
</script>
 
进度条
<style>
    .box{
        width: 300px;
        height: 30px;
        border: 1px solid #000;
    }
    .small{
        width: 0px;
        height: 30px;
        background-color: hotpink;
    }
</style>
<body>
<div class="box">
    <div class="small"></div>
</div>
<button class="start">开始</button>
<button class="pause">暂停</button>
<button class="continue">继续</button>
<button class="stop">停止</button>
</body>
<script>
// 点击开始 - 让small的width慢慢加大
var startBtn = document.querySelector('.start');
var small = document.querySelector('.small');
var timer = null
// 规定,只有timer的值是null的时候才可以开启定时器
startBtn.onclick = function() {
     // 获取宽
    var w = small.clientWidth // 0
    if(w > 0) {
        return
    }
    timer = setInterval(function() {
        // 加大
        w += 2 // 2
        // 限制最大值
        if(w >= 300) {
            w = 300
            clearInterval(timer)
        }
        // 设置
        small.style.width = w + 'px' // 宽度变成了2px
    }, 20)
}
// 点击暂停,停止定时器
var pauseBtn = document.querySelector('.pause');
pauseBtn.onclick = function() {
    clearInterval(timer)
    timer = null
}

// 点击继续跟开始一样
var continueBtn = document.querySelector('.continue');
// 当按钮点击第一次的时候,给全局变量timer赋值一个定时器,当他还在继续运行的时候,有点击了第二次,此时,给全局变量timer赋值第二个定时器,此时,第一个定时器还在运行,当small到头的时候,停止定时器,拿timer变量去停止,timer变量代表第二个定时器,停止的是第二个,此时第一个定时器还在运行,停不下来了,找不到他的返回值。
continueBtn.onclick = function() {
    // 每次开启定时器之前,先清除定时器 - 可以保证永远只有一个定时器在同时执行
    // clearInterval(timer)
    // if(!timer) {
    //     timer = setInterval(function() {
    //         // 获取宽
    //         var w = small.clientWidth
    //         // 加大
    //         w += 1
    //         // 限制最大值
    //         if(w >= 300) {
    //             w = 300
    //             clearInterval(timer)
    //             timer = null
    //         }
    //         // 设置
    //         small.style.width = w + 'px'

    //         console.log(1);
    //     }, 50)
    // } else {
    //     return
    // }
   

    if(timer) {
        return
    }
    timer = setInterval(function() {
        // 获取宽
        var w = small.clientWidth
        // 加大
        w += 1
        // 限制最大值
        if(w >= 300) {
            w = 300
            clearInterval(timer)
            timer = null
        }
        // 设置
        small.style.width = w + 'px'

        console.log(1);
    }, 50)
}
// 点击停止归零
var stopBtn = document.querySelector('.stop');
stopBtn.onclick = function() {
    small.style.width = 0 + 'px'
    clearInterval(timer)
    timer = null
}
 
tab切换
<style>
    *{
        list-style-type: none;
        padding: 0;
        margin: 0;
    }
    .tab {
        width: 500px;
        height: 400px;
        border: 3px solid #00f;
        margin: 50px auto;
    }
    .tab ol li a img{
        width: 500px;
        height: 300px;
    }
    .tab ul{
        display: flex;
        justify-content: space-evenly;
        align-items: center;
        background-color: #ccc;
        height: 100px;
    }
    .tab ul li{
        width: 100px;
        height: 50px;
        background-color: hotpink;
        text-align: center;
        line-height: 50px;
        font-size: 30px;
        font-weight: bold;
    }
    .tab ol li{
        display :none;
    }
    .tab ol li.active{
        display: block;
    }
    .tab ul li.on{
        background-color: #f00;
        color: #fff;
    }
</style>
<body>
<div class="tab">
    <ul>
        <li xiabiao=0 class="on">城市</li>
        <li xiabiao=1>大树</li>
        <li xiabiao=2>鲜花</li>
    </ul>
    <ol>
        <li class="active">
            <a href="">
                <img src="./images/1.webp" alt="">
            </a>
        </li>
        <li>
            <a href="">
                <img src="./images/2.webp" alt="">
            </a>
        </li>
        <li>
            <a href="">
                <img src="./images/3.webp" alt="">
            </a>
        </li>
    </ol>
</div>
</body>
<script>
// 获取ul下的li,绑定事件
var ulis = document.querySelectorAll('.tab ul li');
// for(var i=0; i<ulis.length; i++) {
//     ulis[i].setAttribute('xiabiao', i)
// }


var olis = document.querySelectorAll('.tab ol li');
// for(var i=0; i<ulis.length; i++) {
//     (function(i) {
//         ulis[i].onclick = function() {
//             // 先将所有li的on类名都去掉
//             for(var j=0; j<ulis.length; j++) {
//                 ulis[j].className = ''
//             }
//             // 点击哪个li就给哪个li添加on类名
//             this.className = 'on'
//             // 将所有的active类名去掉
//             for(var j=0; j<olis.length; j++) {
//                 olis[j].className = ''
//             }

//             // 找当前点击的li的下标
//             console.log(i);
//             // 给当前li对应的图片所在的li添加active类名
//             olis[i].className = 'active'
//         }
//     })(i)
// }

var daiondeli = document.querySelector('.tab ul li.on');
var active = document.querySelector('.tab ol li.active');
// for(var i=0; i<ulis.length; i++) {
//     (function(i) {
//         ulis[i].onclick = function() {
//             // 将带有on类名的li上面的类名on去掉就好
//             daiondeli.className = ''
//             // 点击哪个li就给哪个li添加on类名
//             this.className = 'on'
//             // 哪个li带有on类名,就把他存到daiondeli中
//             daiondeli = this

//             // 带有active 的类名去掉
//             active.className = ''
//             // 给当前li对应的图片所在的li添加active类名
//             olis[i].className = 'active'
//             // 谁带有active列名,就把他赋值给active变量
//             active = olis[i]
//         }
//     })(i)
// }


// for(var i=0; i<ulis.length; i++) {
//     ulis[i].xiabiao = i // 将自己的下标放在每个标签对象中
//     ulis[i].onclick = function() {
//         // 将带有on类名的li上面的类名on去掉就好
//         daiondeli.className = ''
//         // 点击哪个li就给哪个li添加on类名
//         this.className = 'on'
//         // 哪个li带有on类名,就把他存到daiondeli中
//         daiondeli = this

//         // 带有active 的类名去掉
//         active.className = ''
//         // 找到当前li的下标
//         console.dir(this)
//         var index = this.xiabiao
//         // 给当前li对应的图片所在的li添加active类名
//         olis[index].className = 'active'
//         // 谁带有active列名,就把他赋值给active变量
//         active = olis[index]
//     }
// }


// for(var i=0; i<ulis.length; i++) {
//     ulis[i].setAttribute('xiabiao', i)
//     ulis[i].onclick = function() {
//         // 将带有on类名的li上面的类名on去掉就好
//         daiondeli.className = ''
//         // 点击哪个li就给哪个li添加on类名
//         this.className = 'on'
//         // 哪个li带有on类名,就把他存到daiondeli中
//         daiondeli = this

//         // 带有active 的类名去掉
//         active.className = ''
//         // 找到当前li的下标
//         console.log(this)
//         var index = this.getAttribute('xiabiao')
//         // 给当前li对应的图片所在的li添加active类名
//         olis[index].className = 'active'
//         // 谁带有active列名,就把他赋值给active变量
//         active = olis[index]
//     }
// }
</script>
 
隔行换色

 

<body>
<table border=1 width="500">
    <thead>
        <tr>
            <th>序号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>成名绝技</th>
        </tr>
    </thead>

</table>
</body>
<script>
var arr = [
    {
        name:"令狐冲",
        age:20,
        sex:"男",
        skill:"独孤九剑"
    },
    {
        name:"东方不败",
        age:50,
        sex:"女",
        skill:"葵花宝典"
    },
    {
        name:"任我行",
        age:55,
        sex:"男",
        skill:"吸星大法"
    },
    {
        name:"乔峰",
        age:30,
        sex:"男",
        skill:"降龙十八掌"
    },
    {
        name:"张无忌",
        age:19,
        sex:"男",
        skill:"九阳神功"
    },
    {
        name:"段誉",
        age:22,
        sex:"男",
        skill:"六脉神剑"
    }
];
var tbody = document.createElement('tbody')
var table = document.querySelector('table');
table.appendChild(tbody)
var str = ''
arr.forEach(function(v, i) {
    if(i%2) {
        str += '<tr bgColor="pink">'
    } else {
        str += '<tr bgColor="skyblue">'
    }
   
        str += '<td>'+(i+1)+'<td>'
        for(var key in v) {
            str += '<td>'+v[key]+'<td>'
        }
    str += '</tr>'
})
tbody.innerHTML = str
</script>
 
简易计算器
 
<body>
<input type="text" name="num1">
<select>
    <option value="0">请选择符号</option>
    <option value="+">+</option>
    <option value="-">-</option>
    <option value="*">*</option>
    <option value="/">/</option>
</select>
<input type="text" name="num2">
<button>=</button>
<input type="text" name="result">
</body>
<script>
var num1Input = document.querySelector('[name="num1"]');
var num2Input = document.querySelector('[name="num2"]');
var select = document.querySelector('select');
var btn = document.querySelector('button');
var resultInput = document.querySelector('[name="result"]');
// console.log(num1Input.value, num2Input.value);
// 一定要把获取数据的操作放在点击事件中
btn.onclick = function() {
    // console.log(num1Input.value, num2Input.value);
    // 运算 - 根据选择的符号 - 判断符号是什么
    // console.log(select.value)
    switch(select.value) {
        case '+':
            var res = num1Input.value-0 + num2Input.value*1
        break;
        case '-':
            var res = num1Input.value - num2Input.value
        break;
        case '*':
            var res = num1Input.value * num2Input.value
        break;
        case '/':
            var res = num1Input.value / num2Input.value
        break;
    }
    resultInput.value = res
}
</script>
 

简易年历

 

<style>
    ul{
        list-style-type: none;
        padding: 0;
        margin: 0;
        display: grid;
        grid-template-rows: 50px 50px 50px 50px;
        grid-template-columns: 50px 50px 50px;
        grid-row-gap: 5px;
        grid-column-gap: 5px;
        justify-content: center;
    }
    .box{
        width: 200px;
        background-color: #ccc;
        padding: 10px 0 1px;
        margin: 50px auto;
    }
    p{
        padding: 0;
        margin: 0;
    }
    ul li{
        text-align: center;
        background-color: #333;
        color: #fff;
        line-height: 24px;
    }
    .box .introduce{
        margin: 18px;
        background-color: #eee;
        padding: 10px;
        line-height: 24px;
        color: #666;
    }
    li.active{
        background-color: #fff;
        color: hotpink;
        border: 1px solid #000;
    }
</style>
<body>
<div class="box">
    <ul>
        <li class="active">
            <b>1</b>
            <p>一月</p>
        </li>
        <li>
            <b>2</b>
            <p>二月</p>
        </li>
        <li>
            <b>3</b>
            <p>三月</p>
        </li>
        <li>
            <b>4</b>
            <p>四月</p>
        </li>
        <li>
            <b>5</b>
            <p>五月</p>
        </li>
        <li>
            <b>6</b>
            <p>六月</p>
        </li>
        <li>
            <b>7</b>
            <p>七月</p>
        </li>
        <li>
            <b>8</b>
            <p>八月</p>
        </li>
        <li>
            <b>9</b>
            <p>九月</p>
        </li>
        <li>
            <b>10</b>
            <p>十月</p>
        </li>
        <li>
            <b>11</b>
            <p>十一月</p>
        </li>
        <li>
            <b>12</b>
            <p>十二月</p>
        </li>
    </ul>
    <div class="introduce">
        <b>1月</b>
        <p>元旦放假,新年快乐!</p>
    </div>
</div>
</body>
<script>
var arr = [
    {
        title:"1月",
        content:"元旦放假,新年快乐!"
    },
    {
        title:"2月",
        content:"没有情人的情人节怎么过?"
    },
    {
        title:"3月",
        content:"妇女节快乐!男人的节日在哪里?"
    },
    {
        title:"4月",
        content:"愚人节快乐!小心诈骗!"
    },
    {
        title:"5月",
        content:"五一小长假,去哪玩?"
    },
    {
        title:"6月",
        content:"祝自己儿童节快乐!"
    },
    {
        title:"7月",
        content:"建党节,庆祝祖国建党周年!"
    },
    {
        title:"8月",
        content:"建军节,愿祖国的军队更强大!"
    },
    {
        title:"9月",
        content:"教师节快乐,老师您辛苦了!"
    },
    {
        title:"10月",
        content:"国庆长假,回家看看!"
    },
    {
        title:"11月",
        content:"光棍节,你剁手了吗?"
    },
    {
        title:"12月",
        content:"圣诞节快乐,平安夜平安!"
    },
];
// 将所有的li获取到
var lis = document.querySelectorAll('li');
var title = document.querySelector('.introduce b');
var content = document.querySelector('.introduce p');
for(var i=0; i<lis.length; i++) {
    lis[i].index = i
    lis[i].onmouseenter = function() {
        // 将所有的active去掉
        for(var j=0; j<lis.length; j++) {
            lis[j].className = ''
        }
        this.className = 'active'
        console.log(this.index);
        var obj = arr[this.index]
        title.innerText = obj.title
        content.innerText = obj.content
    }
}
</script>
 
QQ延迟提示框
 
<body>
<style>
.qq{
    width: 280px;
    height: 600px;
    background-color: #fff;
    border:1px solid #ccc;
    box-shadow:2px 2px 1px #eee;
    position: relative;
}
.avatar{
    width: 60px;
    height: 60px;
    border-radius:50%;
    box-shadow: 5px 0 5px #eee,-5px 0 5px #eee,0 5px 5px #eee,0 -5px 5px #eee;
    position:absolute;
    left:10px;
    top:40px;
}
.info{
    width: 280px;
    height: 150px;
    box-shadow: 2px 0 1px #ccc,-2px 0 1px #ccc,0 2px 1px #ccc,0 -2px 1px #ccc;
    position:absolute;
    right:-285px;
    top:40px;
    display:none;
}
</style>
<div class="qq">
    <!-- 头像 -->
    <div class="avatar"></div>
    <!-- 个人资料提示框 -->
    <div class="info"></div>
</div>
</body>
<script>
// 获取标签
var avatar = document.querySelector('.avatar');
var info = document.querySelector('.info');
// 鼠标移入事件
avatar.onmouseover = function() {
    setTimeout(function() {
        // 让info出现
        info.style.display = 'block'
    }, 500)
}
var timer
avatar.onmouseout = info.onmouseout = function() {
    timer = setTimeout(function() {
        // 让info隐藏
        info.style.display = 'none'
    }, 500)
}

info.onmouseover = function() {
    clearTimeout(timer)
    // 让info出现
    info.style.display = 'block'
}

// info.onmouseout = function() {
//     timer = setTimeout(function() {
//         // 让info隐藏
//         info.style.display = 'none'
//     }, 500)
// }
</script>
 
改变诗篇颜色
 
 

 

 表格添加

 

<style>
    body>form,body>table{
        float:left;
    }
    body>table{
        margin-right: 50px;
    }
</style>
<body>

<table border=1 width="500">
    <caption><h2>内容显示</h2></caption>
    <thead>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>性别</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<form action="">
    <table>
        <caption><h2>表格添加</h2></caption>
        <tr>
            <td>姓名:</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>年龄:</td>
            <td><input type="text" name="age"></td>
        </tr>
        <tr>
            <td>性别:</td>
            <td>
                <input type="radio" name="sex" value="男">
                <input type="radio" name="sex" value="女">
            </td>
        </tr>
        <tr>
            <td></td>
            <td><input type="button" value="添加"></td>
        </tr>
    </table>
</form>
</body>
<script>
// 获取按钮
var btn = document.querySelector('[type="button"]');
var tbody = document.querySelector('tbody');
// console.log(tbody);
btn.addEventListener('click', add)
function add() {
    // 获取数据
    var username = document.querySelector('[name="name"]').value;
    var age = document.querySelector('[name="age"]').value;
    var sexs = document.querySelectorAll('[name="sex"]');
    // 通过输出每个单选框,发现被选中的单选框,他有一个对象的属性checked,选中的是true,没选中的是false - 通过遍历两个单选框,判断哪个的checked属性是true,要谁的value - 选中的value
    for(var i=0; i<sexs.length; i++) {
        if(sexs[i].checked) {
            var sex = sexs[i].value
            break
        }
    }
    // console.log(sexs);
    // console.log(sex);

    // 通过数据组合一个tr放在tbody中
    var str = ''
    str += '<tr>'
        str += '<td>'+username+'</td>'
        str += '<td>'+age+'</td>'
        str += '<td>'+sex+'</td>'
    str += '</tr>'
    tbody.innerHTML += str

    // 将表单清空
    document.querySelector('[name="name"]').value = '';
    document.querySelector('[name="age"]').value = '';
    // 通过单选框的checked属性可以知道哪个是选中的
    sexs[0].checked = false
    sexs[1].checked = false
}
</script>
 
模拟下拉表单
 
<style>
    input{
        width: 194px;
        height: 30px;
        border: 1px solid #000;
        outline: none;
        padding-left: 6px;
    }
    ul{
        list-style: none;
        padding: 0;
        margin: 0;
        width: 200px;
        border: 1px solid #000;
        cursor: pointer;
        display: none;
    }
    li{
        background-color: #eee;
        margin: 2px 0;
        padding-left: 6px;
    }
</style>
<body>
<input type="text">
<ul></ul>
</body>
<script>
// 当文本框获取焦点的时候
var input = document.querySelector('input');
var arr = ['vue', 'react', 'angular']
var ul = document.querySelector('ul');
// 创建下拉菜单
arr.forEach(function(v) {
    var li = document.createElement('li')
    li.innerText = v
    ul.appendChild(li)
})
input.addEventListener('focus', focus)
function focus() {
    // 让ul显示
    ul.style.display = 'block'
}

input.addEventListener('blur', blur)
function blur() {
    // 让ul隐藏
    setTimeout(function() {
        ul.style.display = 'none'
    }, 100)
   
}


// 遍历给所有li绑定事件
for(var i=0; i<ul.children.length; i++) {
    ul.children[i].onclick = function() {
        // 当点击一触发,就会触发失去焦点的事件,ul就隐藏了 - 需要让隐藏延迟执行
        // console.log(this.innerText);
        input.value = this.innerText
    }
}
</script>
 
 
div在窗口中的拖拽
 
<style>
    .box{
        width: 100px;
        height: 100px;
        background-color: pink;
        position: absolute;
        left: 0;
        top: 0;
    }
</style>
<body>
<div class="box"></div>
</body>
<script>
// 拖拽:在div上按下鼠标,移动鼠标,移动过程中让div跟随鼠标移动
/*
分析:
    给div绑定鼠标按下事件 - 在按下的事件中继续绑定移动事件
    div移动:设置left和top - 给div设置定位
    left和top的值是多少?获取鼠标位置,计算left和top
    在鼠标按下时记录鼠标在div上的位置
    left和top = 鼠标在浏览器中位置 - 一开始鼠标是div上的位置
*/
var box = document.querySelector('.box');
box.onmousedown = function() {
    // 获取鼠标在div上按下的位置
    var e = window.event;
    // console.log(e);
    var x1 = e.offsetX
    var y1 = e.offsetY
    // 绑定移动事件
    document.onmousemove = function() {
        // 获取鼠标在浏览器中的位置 - 每个事件都有自己独特的事件对象
        // console.log(window.event);
        var e = window.event;
        var x2 = e.clientX
        var y2 = e.clientY
        // 计算left和top
        var l = x2 - x1
        var t = y2 - y1

        if(l < 0) {
            l = 0
        }
        if(t < 0) {
            t = 0
        }
        if(t > document.documentElement.clientHeight - box.offsetHeight) {
            t = document.documentElement.clientHeight - box.offsetHeight
        }
        if(l > document.documentElement.clientWidth - box.offsetWidth) {
            l = document.documentElement.clientWidth - box.offsetWidth
        }

        // 设置div的left和top
        box.style.left = l + 'px'
        box.style.top = t + 'px'
    }
}
// 拖拽行为一定要记得解绑mousemove事件
window.onmouseup = function() {
    document.onmousemove = null
}
/*
总结:
    绑定按下事件 - box
        获取按下的为位置
        绑定移动事件 - window
            获取移动的位置
            计算left和top = 移动位置 - 按下的位置
            限制left和top的最大值和最小值
            将left和top设置给div
    绑定松开事件 - window
        解绑mousemove事件 - window
*/
</script>
光标位置的实时显现
 

 

 自定义键盘按键控制滚动条

 

<body>
<div style="width:100%;height:2000px;">
阿斯蒂芬
</div>
<!-- <button>按钮</button> -->
<!-- <input type="text"> -->
<!-- <select name="" id="">
    <option value="">1</option>
    <option value="">2</option>
</select> -->

</body>
<script>
// 本来空格和上下键能控制滚动条 - 不希望他们控制了 - 自己规定的键去控制
// 将空格和上下键的默认行为阻止 - 判断按键是否是自己规定的键 - 控制滚动条 - 给滚动过的距离赋值
// var box = document.querySelector('select');
// 键盘事件要给能获取焦点的元素绑定:window document 表单元素
// console.log(document);
// console.log(window);
window.onkeydown = function() {
    // 判断是否是空格和上下键 - 阻止默认行为
    var e = window.event
    var keycode = e.keyCode || e.which
    // if(keycode === 32 || keycode === 38 || keycode === 40) {
    //     return false
    // } else {
    //     // 是否是自己规定的键 - a上 b下
    //     if(String.fromCharCode(keycode).toLowerCase() === 'a') {
    //         var t = document.documentElement.scrollTop || document.body.scrollTop
    //         t -= 10
    //         document.documentElement.scrollTop = document.body.scrollTop = t
    //     } else if(String.fromCharCode(keycode).toLowerCase() === 'b') {
    //         var t = document.documentElement.scrollTop || document.body.scrollTop
    //         t += 10
    //         document.documentElement.scrollTop = document.body.scrollTop = t
    //     } else {
    //         return false
    //     }
    // }


    // 是否是自己规定的键 - a上 b下
    var t = document.documentElement.scrollTop || document.body.scrollTop
    if(String.fromCharCode(keycode).toLowerCase() === 'a') {
        t -= 10
    } else if(String.fromCharCode(keycode).toLowerCase() === 'b') {
        t += 10
    } else {
        return false
    }
    document.documentElement.scrollTop = document.body.scrollTop = t
}
</script>
 
可拖拽的进度条
 
<style>
    .big{
        width: 300px;
        height: 30px;
        border: 1px solid #000;

        display:inline-block;
        vertical-align: middle;
    }
    .small{
        width: 0px;
        height: 30px;
        background-color: hotpink;
    }
    span{
        margin-left: 20px;
    }
</style>
<body>
<div class="big">
    <div class="small"></div>
</div>
<span>0</span>
</body>
<script>
// 获取标签
var big = document.querySelector('.big');
var small = document.querySelector('.small');
var span = document.querySelector('span');
// 添加点击事件
big.onmousedown = function() {
    // 获取鼠标在big上的位置
    var x = window.event.offsetX
    // 将这个数字设置给small的宽度
    small.style.width = x + 'px'
    // 计算
    span.innerText = Math.ceil(x / big.clientWidth * 100)
    // 移动
    big.onmousemove = function() {
        var x = window.event.offsetX
        small.style.width = x + 'px'
        span.innerText = Math.ceil(x / big.clientWidth * 100)
    }
}
// 松开鼠标解绑移动事件
big.onmouseup = function() {
    big.onmousemove = null
}
</script>
 
范围拖拽
 
<style>
    .big{
        width: 400px;
        height: 400px;
        background-color: pink;

        margin: 50px auto;
        position: relative;
    }
    .small{
        width: 100px;
        height: 100px;
        background-color: #0f0;
        position: absolute;
        left: 0;
        top: 0;
    }
    .box{
        width: 300px;
        height: 500px;
        background-color: #00f;
    }
</style>
<body>
<div class="box"></div>
<div class="big">
    <div class="small"></div>
</div>
</body>
<script>
// 拖拽效果:给小div绑定按下事件,给大div绑定移动事件
// 获取鼠标位置,计算小div的left和top
// 给大div绑定松开事件,解绑大div的移动事件

var small = document.querySelector('.small');
var big = document.querySelector('.big');
small.onmousedown = function() {
    // 获取鼠标在small上按下的位置
    var x = window.event.offsetX
    var y = window.event.offsetY
    console.log(111, x, y);
    // 给大div绑定移动事件
    window.onmousemove = function() {
        // 获取鼠标位置
        // var x1 = window.event.offsetX
        // var y1 = window.event.offsetY
        // 以后做拖拽的时候,小心不要使用offset系列的值

        var x1 = window.event.clientX
        var y1 = window.event.clientY

        // offsetX和offsetY,当鼠标在大div上的时候,offsetX和offsetY代表鼠标在大div上的位置,如果鼠标在小div上的时候,offsetX和offsetY就代表鼠标在小div上的位置

        /*
        offsetX和offsetY获取到的是鼠标相对事件源的位置,这是说当鼠标直接在事件源上的时候,如果鼠标不是直接在事件源上的,这个值会变成鼠标直接在哪个标签的位置

        小div在闪烁,在大div上的位置和小div上的位置之间进行闪烁
        */
        console.log(222, x1, y1);
        var t1 = document.documentElement.scrollTop || document.body.scrollTop

        var l = x1 - x - big.offsetLeft

        // 大div距离浏览器顶部的距离 = 大div距离页面顶部的距离 - 滚动过的距离
        // top值 = 鼠标在浏览器上的位置 - 鼠标在小div上的位置 - 大div距离浏览器顶部的距离
        // var t = y1 - y - (big.offsetTop - t1)
        var t = window.event.pageY - y - big.offsetTop
        // pageY = clientY + 滚动过的高度
        if(l < 0) {
            l = 0
        }
        if(t < 0) {
            t = 0
        }
        if(l > big.clientWidth - small.offsetWidth) {
            l = big.clientWidth - small.offsetWidth
        }
        if(t > big.clientHeight - small.offsetHeight) {
            t = big.clientHeight - small.offsetHeight
        }

        small.style.left = l + 'px'
        small.style.top = t + 'px'
    }
}

window.onmouseup = function() {
    window.onmousemove = null
}
/*
总结:
    1.offsetX和offsetY有问题
    2.判断最大值的时候是否需要带边框
    3.以后使用鼠标位置的时候,尽量使用pageX和pageY更严谨
*/
</script>
 
自定义右键菜单
 
<script>
// 自定义右键菜单:将默认菜单去掉,自己创建一个菜单并显示在浏览啊中
/*
阻止右击的默认行为 - 事件源window
创建ul>li*3
插入到body中
设置ul的left和top - 就是鼠标在浏览器中的位置
*/
var arr = ['vue', 'react', 'angular']
var ul = document.createElement('ul')
arr.forEach(function(v) {
    var li = document.createElement('li')
    li.innerText = v
    ul.appendChild(li)
})
// 将ul添加到body中
document.body.appendChild(ul)

// console.log( document.querySelector('ul') );

// 使用事件委托给li绑定事件
// 要获取任意一个元素,必须是这个元素在浏览器中显示了
ul.onmouseover = function() {
    // 把所有的li的背景设置为透明
    // console.log(ul.children[0]);
    for(var i=0; i<ul.children.length; i++) {
        ul.children[i].style.backgroundColor = 'transparent'
    }
    // // 当li是谁 - 事件对象.target
    // console.log( window.event.target );
    // 目标元素可能是ul也可能是li,判断当前这个目标元素是li,才会添加背景
    var tag = window.event.target
    // console.log(tag.nodeName); // 标签节点的节点属性,值是一个大写的标签名
    if(tag.nodeName === 'LI') {
        tag.style.backgroundColor = '#ccc'
    }
    // window.event.target.style.backgroundColor = '#ccc'
}

ul.onclick = function() {
    var tag = window.event.target
    if(tag.nodeName === 'LI') {
        alert(tag.innerText)
        ul.style.display = 'none'
    }
}


ul.style.display = 'none'
window.oncontextmenu = function() {
    // 先获取鼠标在浏览器中点击的位置
    var e = window.event;
    var x = e.pageX;
    var y = e.pageY
    // console.log(222);

    // 判断当鼠标点击的位置在浏览器宽度的百分之80,就让ul在鼠标左边显示
    if(x > document.documentElement*.8) {
        var l = x - 20 - 200
    } else {
        var l = x
    }
    if(x > document.documentElement.clientHeight*.8) {
        var t = y - 20 - 100
    } else {
        var t = y
    }
   
   
    // 批量设置样式的函数
    setStyle(ul, {
        display: 'block',
        listStyle: 'none',
        padding: 0,
        margin: 0,
        width: '200px',
        lineHeight: '30px',
        border: '1px solid #000',
        position: 'absolute',
        left: l + 'px',
        top: t + 'px'
    })
    return false
}

/*
总结:

*/
</script>
 
文字跟随光标
 
 

 

 打字游戏

 

<button>开始</button>
得分: <b>0</b>
</body>
<script src="./js/utils.js"></script>
<script>
// 打字游戏
/*
从浏览器顶端每隔一会就会有一个字符掉下来
敲键盘敲中了对应的某个字符,字符会消失

每隔一会 - 定时器 - 执行一个函数
    一个字符 - 创建一个标签
        创建标签
        标签中放内容 - 随机内容 - 修饰样式
    掉下来
        定时器
            获取当前top
            加大
                限制 - 如果超出了浏览器范围 GAME OVER - 将所有的小定时器和大定时器清除
            设置top


键盘事件 - 事件类型keyup - 事件源window - 事件函数
    获取键盘码 - 转成字符 - 跟当前页面中所有的字符对比
        遍历当前页面中所有的标签,每个标签中的字符跟当前字符做比较 - 全等
            如果true
                将字符对应的定时器停止
                让字符消失
            false
                什么也不做
*/
// 创建数组 - 用于创建好的所有span
var spanArr = []
// 定义一个开关 - 控制多次点击只有第一次才有效
var flag = true
document.querySelector('button').onclick = function() {
    // 按钮被点击多次后,就会有多个定时器同时进行 - 叠加的效果
    // 解决思路:
    // 1.每次开始定时器之前先停止了原先的定时器
    for(var i=0; i<spanArr.length; i++) {
        clearInterval(spanArr[i].timerId)
    }
    // // 清除大定时器
    clearInterval(timer)
    // spanArr = []

    // 从body中清除所有的span
    for(var i=spanArr.length-1; i>=0; i--) {
        document.body.removeChild(spanArr[i])
    }
    spanArr = []
    // 2.定义开关去解决
    if(!flag) {
        return
    }
    flag = false
    var timer = setInterval(function() {
        // 创建标签
        var span = document.createElement('span')
        // 获取随机字母对应的阿斯克码
        var code = getRandom(97, 123)
        // 转换成字母
        var word = String.fromCharCode(code)
        // 放在标签中
        span.innerText = word
        // 随机left值
        var l = getRandom(0, document.documentElement.clientWidth - 30)
        // 修饰样式
        setStyle(span, {
            position: 'absolute',
            width: '30px',
            height: '30px',
            borderRadius: '50%',
            backgroundColor: '#00f',
            textAlign: 'center',
            lineHeight: '30px',
            color: '#fff',
            fontWeight: 'bold',
            top: 0,
            left: l + 'px'
        })
        document.body.appendChild(span)
        // 将span放在spanArr中
        spanArr.push(span)
        // 让字符向下掉
        // 将每个span对应的定时器放在span的属性上
        span.timerId = setInterval(function() {
            // 获取高度
            var t = span.offsetTop
            // 加大
            t += 3
            // 限制最大值
            if(t > document.documentElement.clientHeight - 30) {
                // game over
                alert('GAME OVER')
                // 清除所有小定时器
                for(var i=0; i<spanArr.length; i++) {
                    clearInterval(spanArr[i].timerId)
                }
                // 清除大定时器
                clearInterval(timer)
                // 将开关打开
                flag = true
            }
            // console.log(111);
            // 设置样式
            span.style.top = t + 'px'
        }, 20)
        // console.log(222);
    }, 1000)
}
// 键盘事件
window.onkeyup = function() {
    var e = window.event
    var keycode = e.keyCode || e.which
    var word = String.fromCharCode(keycode).toLowerCase()
    // 遍历数组
    for(var i=0; i<spanArr.length; i++) {
        // 每个字符中的内容跟当前敲击的内容是否相等
        if(spanArr[i].innerText === word) {
            // 清除跟当前字符相等的span的定时器
            clearInterval(spanArr[i].timerId)
            // 从body中将span删除
            document.body.removeChild(spanArr[i])
            // 让分数+1
            spanArr.splice(i, 1)
            console.log(spanArr);
            // 获取原来分数
            var score = document.querySelector('b').innerText-0
            // 分数+1
            score++
            // 放到b中
            document.querySelector('b').innerText = score
            break
        }
    }
    // 从数组中删除这个span
    // for(var i=spanArr.length-1; i>=0; i--) {
    //     spanArr.splice(i, 1)
    // }
}
文件类型检测

 

最后通过判断验证 

字符串两段去除空白

 

 

表单验证

 

 

插件做轮播图
<style>
    .swiper {
        width: 600px;
        height: 300px;
    }  
</style>
<body>
<div class="swiper">
    <div class="swiper-wrapper">
        <div class="swiper-slide" style="">Slide 1</div>
        <div class="swiper-slide" style="">Slide 2</div>
        <div class="swiper-slide" style="">Slide 3</div>
    </div>
    <!-- 如果需要分页器 -->
    <div class="swiper-pagination"></div>

    <!-- 如果需要导航按钮 -->
    <div class="swiper-button-prev"></div>
    <div class="swiper-button-next"></div>

    <!-- 如果需要滚动条 -->
    <!-- <div class="swiper-scrollbar"></div> -->
</div>
</body>
<script src="./js/swiper-bundle.min.js"></script>
<script>
// js插件:swiper - 专业做轮播图的
var mySwiper = new Swiper ('.swiper', {
    direction: 'horizontal', // 垂直切换选项
    loop: true, // 循环模式选项
    autoplay: {
        delay: 1000,
        stopOnLastSlide: false,
        disableOnInteraction: true,
    },
   
    // 如果需要分页器
    pagination: {
      el: '.swiper-pagination',
      clickable :true,
    },
   
    // 如果需要前进后退按钮
    navigation: {
      nextEl: '.swiper-button-next',
      prevEl: '.swiper-button-prev',
    },
   
    // 如果需要滚动条
    scrollbar: {
      el: '.swiper-scrollbar',
    },
})  
mySwiper.el.onmouseover=function(){
    mySwiper.autoplay.stop();
}
mySwiper.el.onmouseleave=function(){
    mySwiper.autoplay.start();
}
全选和单选
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<table border=1 width="500">
    <thead align="left">
        <tr>
            <th><input type="checkbox" name="selectAll">全选</th>
            <th>商品名称</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><input type="checkbox" name="selectOne"></td>
            <td>鞋子</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="selectOne"></td>
            <td>衬衫</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="selectOne"></td>
            <td>裤子</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="selectOne"></td>
            <td>袜子</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="selectOne"></td>
            <td>内衣</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <td><input type="checkbox" name="selectAll">全选</td>
        </tr>
    </tfoot>
</table>
</body>
<script>
// 获取两个全选
var selectAll = document.querySelectorAll('[name="selectAll"]');
// 获取所有单选
var selectOne = document.querySelectorAll('[name="selectOne"]');
// 点击事件
for(var i=0; i<selectAll.length; i++) {
    selectAll[i].onclick = function() {
        // 判断自己是否是选中状态 - 设置其他的单选
        // console.log(this.checked);
        // if(this.checked) {
        //     // 设置所有单选为true
        //     for(var j=0; j<selectOne.length; j++) {
        //         selectOne[j].checked = true
        //     }  
        //     for(var j=0; j<selectAll.length; j++) {
        //         selectAll[j].checked = true
        //     }  
        // } else {
        //     for(var j=0; j<selectOne.length; j++) {
        //         selectOne[j].checked = false
        //     }
        //     for(var j=0; j<selectAll.length; j++) {
        //         selectAll[j].checked = false
        //     }
        // }
        for(var j=0; j<selectOne.length; j++) {
            selectOne[j].checked = this.checked
        }
        for(var j=0; j<selectAll.length; j++) {
            selectAll[j].checked = this.checked
        }
    }
}

// 单选
for(var i=0; i<selectOne.length; i++) {
    selectOne[i].onclick = function() {
        // 判断是否所有的单选都是选中状态 - 设置两个全选
        var arr = [].slice.call(selectOne, 0) // 将伪数组转成数组
        var bool = arr.every(v => v.checked) // 调用数组方法判断是否全部选中
        // console.log(bool);
        // 根据结果设置两个全选
        for(var j=0; j<selectAll.length; j++) {
            selectAll[j].checked = bool
        }
    }
}
深拷贝和浅拷贝 深拷贝和浅拷贝-针对的是数组和对象

 

 深拷贝:

 

得到对象

 

 

 

递归 

 

 

 

 

posted on 2022-03-28 00:01  金子fa  阅读(169)  评论(0编辑  收藏  举报