Web APIs实用案例

本文通过一系列实战案例,详细介绍了如何使用Web APIs进行DOM操作,包括查找父节点、关闭二维码、查找子节点、追加与删除节点等。同时,还探讨了时间对象的使用,如页面显示时间、倒计时功能,并提供了学成在线案例的重构及微博发布功能的实现。
摘要由CSDN通过智能技术生成

01-查找父节点

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>查找父节点</title>
    <style>
        .father {
            width: 300px;
            height: 300px;
            background-color: red;
        }
        
        .son {
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="son">儿子</div>
    </div>
    <script>
        let son = document.querySelector('.son');
        // console.log(son.parentNode); 得到它的父亲
        son.addEventListener('click', function() { //点击儿子,父亲关闭
            son.parentNode.style.display = 'none';
        })
    </script>
</body>

</html>

02-关闭二维码案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>关闭二维码案例</title>
    <style>
        div {
            position: relative;
            left: 800px;
            top: 100px;
            width: 160px;
            height: 160px;
        }
        
        div i {
            position: absolute;
            left: -15px;
            top: -5px;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div>
        <img src="code.png" alt="">
        <i class="close_btn">X</i>
    </div>
    <script>
        let i = document.querySelector('i');
        i.addEventListener('click', function() {
            this.parentNode.style.display = 'none';
        })
    </script>
</body>

</html>

效果展示

在这里插入图片描述

03-关闭多个二维码案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>关闭多个二维码案例</title>
    <style>
        .erweima {
            width: 149px;
            height: 152px;
            border: 1px solid #000;
            background: url(./images/456.png) no-repeat;
            position: relative;
        }
        
        .close {
            position: absolute;
            right: -52px;
            top: -1px;
            width: 50px;
            height: 50px;
            background: url(./images/bgs.png) no-repeat -159px -102px;
            cursor: pointer;
            border: 1px solid #000;
        }
    </style>
</head>

<body>
    <div class="erweima">
        <span class="close"></span>
    </div>
    <div class="erweima">
        <span class="close"></span>
    </div>
    <div class="erweima">
        <span class="close"></span>
    </div>
    <div class="erweima">
        <span class="close"></span>
    </div>
    <div class="erweima">
        <span class="close"></span>
    </div>
    <script>
        // 1.获取元素
        let sons = document.querySelectorAll('.close');
        // 2.依次添加多个点击事件
        for (let i = 0; i < sons.length; i++) {
            sons[i].addEventListener('click', function() {
                //3.关闭当前的那个二维码,点击谁,关闭谁的父级
                //this.parentNode.style.display = 'none';//隐藏后不保留位置
                this.parentNode.style.visibility = 'hidden'; //隐藏后保留位置

            })
        }
    </script>

</body>

</html>

效果展示

在这里插入图片描述

04-查找子节点

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>查找子节点</title>
    <style></style>
</head>

<body>
    <button>点击</button>
    <ul>
        <li>我是孩子</li>
        <li>我是孩子</li>
        <li>我是孩子</li>
        <li>我是孩子</li>
        <li>我是孩子</li>
        <li>我是孩子</li>

    </ul>
    <script>
        let btn = document.querySelector('button');
        let ul = document.querySelector('ul');
        btn.addEventListener('click', function() {
            // console.log(ul.children);
            // 点击按钮,让ul所有的孩子变红色
            for (let i = 0; i < ul.children.length; i++) {
                ul.children[i].style.color = 'red';
            }
            ul.children[0].style.color = 'green';
        })
    </script>
</body>

</html>

05-查找兄弟节点

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>查找兄弟节点</title>
</head>

<body>
    <button>点击</button>
    <ul>
        <li>第1个</li>
        <li class="test">第2个</li>
        <li>第3个</li>
        <li>第4个</li>
    </ul>
    <script>
        let btn = document.querySelector('button');
        let two = document.querySelector('.test');
        btn.addEventListener('click', function() {
            //two.style.color = 'red'; 点击按钮,第二个变红色
            two.nextElementSibling.style.color = 'green'; //点击按钮,让第二个的下一个元素也就是第三个变绿色
            two.previousElementSibling.style.color = 'yellow'; //点击按钮,让第二个的上一个元素也就是第一个变黄色
        })
    </script>
</body>

</html>

06-追加节点

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>增加节点</title>
</head>

<body>
    <ul>
        <li>我是大毛</li>
        <li class="two">我是二毛</li>

    </ul>
    <script>
        // 1.创建新的标签节点
        // let div = document.createElement('div');
        // div.className = 'current';
        let li = document.createElement('li');
        // 往小li里添加内容
        li.innerHTML = '我是小明';

        // 2.插入到父元素的最后一个位置  父元素.appendChild(子元素)
        // (1)先获取父元素
        // let ul = document.querySelector('ul');
        // ul.appendChild(li); //li不需要加引号,因为li已经是个变量了

        // 3.插入到父元素中某个子元素的前面  父元素.insertBefore(要插入的元素,在哪个元素前面)
        // (1)先获取父元素
        // (2)二毛是 ul.children[1]
        let ul = document.querySelector('ul');
        ul.insertBefore(li, ul.children[1]);
    </script>
</body>


</html>

07-克隆节点

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>克隆节点</title>
</head>

<body>
    <ul>
        <li>我是内容</li>
    </ul>
    <script>
        // 1.克隆节点
        let ul = document.querySelector('ul');
        // 括号为空,则默认为false,不克隆里面的子节点。如果为true,则克隆里面的子节点
        let newUL = ul.cloneNode(true);
        // 追加
        document.body.appendChild(newUL);
    </script>
</body>

</html>

08-删除节点

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>删除节点</title>
</head>

<body>
    <button>点击 </button>
    <ul>
        <li>我是内容</li>
    </ul>
    <script>
        // 需求:点击按钮,删除小li 
        let btn = document.querySelector('button');
        let ul = document.querySelector('ul');
        //let li = document.querySelector('li'); 不用获取小li

        btn.addEventListener('click', function() {
            //删除的语法  父元素.removeChild(子元素)
            ul.removeChild(ul.children[0]); //ul.children[0]是第一个小li
        })
    </script>
</body>

</html>

09-时间对象

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>时间对象</title>
</head>

<body>
    <script>
        // let arr = [];
        // let arr = new Array();
        // let obj = {};
        // let obj = new Object();


        //new实例化 时间对象
        //let date = new Date(); // 小括号为空,获得当前时间    
        //  console.log(date); //Tue Mar 01 2022 14:41:23
        //获得指定的时间
        let date = new Date('2022-12-2 18:50:10'); //小括号有时间,获得指定的时间
        console.log(date);
    </script>
</body>

</html>

10-时间对象常用方法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>时间对象常用方法</title>
</head>

<body>
    <script>
        // 获得当前的年份
        let date = new Date(); // 小括号为空,获得当前时间    
        console.log(date.getFullYear());
        // 获得当前的月份(0~11)
        console.log(date.getMonth() + 1);
        // 获得月份中的每一天
        console.log(date.getDate());

        // 获得当前的小时
        console.log(date.getHours());
        // 获得当前的分钟
        console.log(date.getMinutes());
        // 获得当前的秒数
        console.log(date.getSeconds());
        //获得星期 (0~6) 星期日是0
        console.log(date.getDay());
    </script>
</body>

</html>

11-页面显示时间案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>页面显示时间案例</title>
    <style>
        div {
            width: 400px;
            height: 50px;
            background-color: pink;
            text-align: center;
            line-height: 50px;
        }
    </style>
</head>

<body>
    <div></div>
    <script>
        let arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
        let div = document.querySelector('div');

        getTime(); //先调用,就省去了一秒的空白期

        setInterval(getTime, 1000);

        function getTime() {

            // 先实例化时间对象
            let date = new Date();
            let year = date.getFullYear();
            let month = date.getMonth() + 1;
            let date1 = date.getDate();
            let hour = date.getHours();
            let minute = date.getMinutes();
            let second = date.getSeconds();
            //星期
            let day = date.getDay();

            div.innerHTML = '今天是:' + year + '年' + month + '月' + date1 + '日' + hour + ':' + minute + ':' + second + arr[day];

        }
    </script>
</body>

</html>

效果展示

在这里插入图片描述

12-时间戳

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>时间戳</title>
</head>

<body>
    <script>
        // 时间戳是总的毫秒数 是独一无二的
        // 计算倒计时核心思想:将来时间有一个时间戳200000(举例),现在时间有一个时间戳100000 
        // 可以利用将来的时间戳减去现在的时间戳就是剩余的时间毫秒数
        // 转换为时分秒就是剩余的时间了


        // 方法1获取时间戳 getTime()
        //let date = new Date();
        // console.log(date.getTime());

        // 方法2获取时间戳 +new date()
        console.log(+new Date()); //获取当前时间的时间戳
        console.log(+new Date('2022-3-3 12:00:00')); //获取指定时间的时间戳


        // 方法3获取时间戳 Date().now() 无需实例化 只能得到当前的时间戳,不能获取指定时间的时间戳
        //console.log(Date.now());
    </script>
</body>

</html>

13-下班倒计时案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>下班倒计时案例</title>
    <style>
        .countdown {
            width: 240px;
            height: 305px;
            text-align: center;
            line-height: 1;
            color: #fff;
            background-color: brown;
            /* background-size: 240px; */
            /* float: left; */
            overflow: hidden;
        }
        
        .countdown .next {
            font-size: 16px;
            margin: 25px 0 14px;
        }
        
        .countdown .title {
            font-size: 33px;
        }
        
        .countdown .tips {
            margin-top: 80px;
            font-size: 23px;
        }
        
        .countdown small {
            font-size: 17px;
        }
        
        .countdown .clock {
            width: 142px;
            margin: 18px auto 0;
            overflow: hidden;
        }
        
        .countdown .clock span,
        .countdown .clock i {
            display: block;
            text-align: center;
            line-height: 34px;
            font-size: 23px;
            float: left;
        }
        
        .countdown .clock span {
            width: 34px;
            height: 34px;
            border-radius: 2px;
            background-color: #303430;
        }
        
        .countdown .clock i {
            width: 20px;
            font-style: normal;
        }
    </style>
</head>

<body>
    <div class="countdown">
        <p class="next">今天是2022年3月17日</p>
        <p class="title">下班倒计时</p>
        <p class="clock">
            <span id="hour">00</span>
            <i>:</i>
            <span id="minutes">25</span>
            <i>:</i>
            <span id="scond">20</span>
        </p>
        <p class="tips">
            现在是18:30:00
        </p>
    </div>
    <script>
        let hour = document.querySelector('#hour');
        let minute = document.querySelector('#minutes');
        let second = document.querySelector('#scond');
        let p = document.querySelector('.tips');


        time();

        setInterval(time, 1000)

        function time() {
            // 1.得到现在的时间戳
            let now = +new Date();
            // 2.得到指定时间的时间戳
            let last = +new Date('2022-3-17 18:30:00')
                // 3.(计算剩余的毫秒数)/1000 ===剩余的秒数
            let count = (last - now) / 1000;
            // 4.转换为时分秒 转换公式如下:
            // d=parseInt(总秒数/60/60/24);
            // h = parseInt(总秒数 / 60 / 60 % 24);
            // m = parseInt(总秒数 / 60 % 60);
            // s = parseInt(总秒数 % 60);
            let h = parseInt(count / 60 / 60 % 24);
            h = h < 10 ? '0' + h : h;
            let m = parseInt(count / 60 % 60);
            m = m < 10 ? '0' + m : m;
            let s = parseInt(count % 60);
            s = s < 10 ? '0' + s : s;
            // console.log(h, m, s);
            hour.innerHTML = h;
            minute.innerHTML = m;
            second.innerHTML = s;

            // 最后一行内容变化
            let date = new Date();
            let hour1 = date.getHours();
            let minute1 = date.getMinutes();
            let second1 = date.getSeconds();
            p.innerHTML = '现在是' + hour1 + ':' + minute1 + ':' + second1;
        }
    </script>
</body>

</html>

效果展示

在这里插入图片描述

14-学成在线案例重构

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>学车在线首页</title>
    <link rel="stylesheet" href="style.css">
    <style>

    </style>
</head>

<body>

    <!-- 4. box核心内容区域开始 -->
    <div class="box w">
        <div class="box-hd">
            <h3>精品推荐</h3>
            <a href="#">查看全部</a>
        </div>
        <div class="box-bd">
            <ul class="clearfix">
                <!-- <li>
                    <img src="./images/course01.png" alt="">
                    <h4>
                        Think PHP 5.0 博客系统实战项目演练
                    </h4>
                    <div class="info">
                        <span>高级</span> • <span> 1125</span>人在学习
                    </div>
                </li> -->
            </ul>
        </div>
    </div>
    <script>
        let data = [{
            src: 'images/course01.png',
            title: 'Think PHP 5.0 博客系统实战项目演练',
            num: 1125
        }, {
            src: 'images/course02.png',
            title: 'Android 网络动态图片加载实战',
            num: 357
        }, {
            src: 'images/course03.png',
            title: 'Angular2 大前端商城实战项目演练',
            num: 22250
        }, {
            src: 'images/course04.png',
            title: 'Android APP 实战项目演练',
            num: 389
        }, {
            src: 'images/course05.png',
            title: 'UGUI 源码深度分析案例',
            num: 124
        }, {
            src: 'images/course06.png',
            title: 'Kami2首页界面切换效果实战演练',
            num: 432
        }, {
            src: 'images/course07.png',
            title: 'UNITY 从入门到精通实战案例',
            num: 888
        }, {
            src: 'images/course08.png',
            title: '我会变,你呢?',
            num: 590
        }, {
            src: 'images/course08.png',
            title: '我会变,你呢?',
            num: 590
        }]
        let ul = document.querySelector('ul');
        // 1.根据数据的个数,决定小li的个数
        for (let i = 0; i < data.length; i++) {
            // 2.创建小li
            let li = document.createElement('li');
            // 先准备好内容,再追加
            li.innerHTML = `  <img src=${data[i].src} alt="">
                    <h4>
                        ${data[i].title}
                    </h4>
                    <div class="info">
                        <span>高级</span> • <span> ${data[i].num}</span>人在学习
                    </div>`
                // console.log(li);
            console.log(data.length);
            // 3.追加给父亲
            ul.appendChild(li);

        }
    </script>
</body>

</html>

style.css

* {
    margin: 0;
    padding: 0;
}
.w {
    width: 1200px;
    margin: auto;
}
body {
    background-color: #f3f5f7;
}
li {
    list-style: none;
}
a {
    text-decoration: none;
}
.clearfix:before,.clearfix:after {
    content:"";
    display:table; 
  }
  .clearfix:after {
    clear:both;
  }
  .clearfix {
     *zoom:1;
  }   
 
.header {
    height: 42px;
    /* background-color: pink; */
    /* 注意此地方会层叠 w 里面的margin */
    margin: 30px auto;
}
.logo {
    float: left;
    width: 198px;
    height: 42px;
}
.nav {
    float: left;
    margin-left: 60px;
}
.nav ul li {
    float: left;
    margin: 0 15px;
}
.nav ul li a {
    display: block;
    height: 42px;
    padding: 0 10px;
    line-height: 42px;
    font-size: 18px;
    color: #050505;   
}
.nav ul li a:hover {
    border-bottom: 2px solid #00a4ff;
    color: #00a4ff;
}
/* search搜索模块 */
.search {
    float: left;
    width: 412px;
    height: 42px;
    margin-left: 70px;
}
.search input {
    float: left;
    width: 345px;
    height: 40px;
    border: 1px solid #00a4ff;
    border-right: 0;
    color: #bfbfbf;
    font-size: 14px;
    padding-left: 15px;
}
.search button {
    float: left;
    width: 50px;
    height: 42px;
    /* 按钮button默认有个边框需要我们手动去掉 */
    border: 0;
    background: url(images/btn.png);
}
.user {
    float: right;
    line-height: 42px;
    margin-right: 30px;
    font-size: 14px;
    color: #666;
}
/* banner区域 */
.banner {
    height: 421px;
    background-color: #1c036c;
}
.banner .w {
    height: 421px;
    background: url(images/banner2.png) no-repeat top center;
}
.subnav {
    float: left;
    width: 190px;
    height: 421px;
    background: rgba(0,0,0, 0.3);
}
.subnav ul li {
    height: 45px;
    line-height: 45px;
    padding: 0 20px;
}
.subnav ul li a {
    font-size: 14px;
    color: #fff;
}
.subnav ul li a span {
    float: right;
}
.subnav ul li a:hover {
    color: #00a4ff;
}
.course {
    float: right;
    width: 230px;
    height: 300px;
    background-color: #fff;
    /* 浮动的盒子不会有外边距合并的问题 */
    margin-top: 50px;
}
.course h2 {
    height: 48px;
    background-color: #9bceea;
    text-align: center;
    line-height: 48px;
    font-size: 18px;
    color: #fff;
}
.bd {
    padding: 0 20px;
}
.bd ul li {
    padding: 14px 0;
    border-bottom: 1px solid #ccc;
}
.bd ul li h4 {
    font-size: 16px;
    color: #4e4e4e;
}
.bd ul li p {
    font-size: 12px;
    color: #a5a5a5;
}
.bd .more {
    display: block;
    height: 38px;
    border: 1px solid #00a4ff;
    margin-top: 5px;
    text-align: center;
    line-height: 38px;
    color: #00a4ff;
    font-size: 16px;
    font-weight: 700;
}
/* 精品推荐模块 */
.goods {
    height: 60px;
    background-color: #fff;
    margin-top: 10px;
    box-shadow: 0 2px 3px 3px rgba(0,0,0, 0.1);
    /* 行高会继承, 会继承给3个孩子 */
    line-height: 60px;
}
.goods h3 {
    float: left;
    margin-left: 30px;
    font-size: 16px;
    color: #00a4ff;
}
.goods ul {
    float: left;
    margin-left: 30px;
}
.goods ul li {
    float: left;
}
.goods ul li a {
    padding: 0 30px;
    font-size: 16px;
    color: #050505;
    border-left: 1px solid #ccc;
}
.mod {
    float: right;
    margin-right: 30px;
    font-size: 14px;
    color: #00a4ff;
}
.box {
    margin-top: 30px;
}
.box-hd {
    height: 45px;
}
.box-hd h3 {
    float: left;
    font-size: 20px;
    color: #494949;
}
.box-hd a {
    float: right;
    font-size: 12px;
    color: #a5a5a5;
    margin-top: 10px;
    margin-right: 30px;
}
/* 把li 的父亲ul 修改的足够宽一行能装开5个盒子就不会换行了 */
.box-bd ul {
    width: 1225px;
}
.box-bd ul li {
    position: relative;
    top: 0;
    float: left;
    width: 228px;
    height: 270px;
    background-color: #fff;
    margin-right: 15px;
    margin-bottom: 15px;
    transition: all .3s;
   
}
.box-bd ul li:hover {
    top: -8px;
    box-shadow: 2px 2px 2px 2px rgba(0,0,0,.3);
}
.box-bd ul li img {
    width: 100%;
}
.box-bd ul li h4 {
    margin: 20px 20px 20px 25px;
    font-size: 14px;
    color: #050505;
    font-weight: 400;
}
.box-bd .info {
    margin: 0 20px 0 25px;
    font-size: 12px;
    color: #999;
}
.box-bd .info span {
    color: #ff7c2d;
}
/* footer 模块 */
.footer {
    height: 415px;
    background-color: #fff;
}
.footer .w {
    padding-top: 35px;
}
.copyright {
    float: left;
}
.copyright p {
    font-size: 12px;
    color: #666;
    margin: 20px 0 15px 0;
}
.copyright .app {
    display: block;
    width: 118px;
    height: 33px;
    border: 1px solid #00a4ff;
    text-align: center;
    line-height: 33px;
    color: #00a4ff;
    font-size: 16px;
}
.links {
    float: right;
}
.links dl {
    float: left;
    margin-left: 100px;
}
.links dl dt {
    font-size: 16px;
    color: #333;
    margin-bottom: 5px;
}
.links dl dd a {
    color: #333;
    font-size: 12px;
}

效果展示

在这里插入图片描述

15-微博发布案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>微博发布</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        ul {
            list-style: none;
        }
        
        .w {
            width: 900px;
            margin: 0 auto;
        }
        
        .controls textarea {
            width: 878px;
            height: 100px;
            resize: none;
            border-radius: 10px;
            outline: none;
            padding-left: 20px;
            padding-top: 10px;
            font-size: 18px;
        }
        
        .controls {
            overflow: hidden;
        }
        
        .controls div {
            float: right;
        }
        
        .controls div span {
            color: #666;
        }
        
        .controls div .useCount {
            color: red;
        }
        
        .controls div button {
            width: 100px;
            outline: none;
            border: none;
            background: rgb(0, 132, 255);
            height: 30px;
            cursor: pointer;
            color: #fff;
            font: bold 14px '宋体';
            transition: all 0.5s;
        }
        
        .controls div button:hover {
            background: rgb(0, 225, 255);
        }
        
        .controls div button:disabled {
            background: rgba(0, 225, 255, 0.5);
        }
        
        .contentList {
            margin-top: 50px;
        }
        
        .contentList li {
            padding: 20px 0;
            border-bottom: 1px dashed #ccc;
            position: relative;
        }
        
        .contentList li .info {
            position: relative;
        }
        
        .contentList li .info span {
            position: absolute;
            top: 15px;
            left: 100px;
            font: bold 16px '宋体';
        }
        
        .contentList li .info p {
            position: absolute;
            top: 40px;
            left: 100px;
            color: #aaa;
            font-size: 12px;
        }
        
        .contentList img {
            width: 80px;
            border-radius: 50%;
        }
        
        .contentList li .content {
            padding-left: 100px;
            color: #666;
            word-break: break-all;
        }
        
        .contentList li .the_del {
            position: absolute;
            right: 0;
            top: 0;
            font-size: 28px;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="w">
        <!-- 操作的界面 -->
        <div class="controls">
            <img src="./images/9.6/tip.png" alt="" /><br />
            <!-- maxlength 可以用来限制表单输入的内容长度 -->
            <textarea placeholder="说点什么吧..." id="area" cols="30" rows="10" maxlength="200"></textarea>
            <div>
                <span class="useCount" id="useCount">0</span>
                <span>/</span>
                <span>200</span>
                <button id="send">发布</button>
            </div>
        </div>
        <!-- 微博内容列表 -->
        <div class="contentList">
            <ul id="list"></ul>
        </div>
    </div>

    <!-- 添加了hidden属性元素会直接隐藏掉 -->
    <li hidden>
        <div class="info">
            <img class="userpic" src="./images/9.6/03.jpg" />
            <span class="username">死数据:百里守约</span>
            <p class="send-time">死数据:发布于 2020年12月05日 00:07:54</p>
        </div>
        <div class="content">死数据:111</div>
        <span class="the_del">X</span>
    </li>

    <script>
        // maxlength 是一个表单属性, 作用是给表单设置一个最大长度

        // 模拟数据
        let dataArr = [{
            uname: '司马懿',
            imgSrc: './images/9.5/01.jpg'
        }, {
            uname: '女娲',
            imgSrc: './images/9.5/02.jpg'
        }, {
            uname: '百里守约',
            imgSrc: './images/9.5/03.jpg'
        }, {
            uname: '亚瑟',
            imgSrc: './images/9.5/04.jpg'
        }, {
            uname: '虞姬',
            imgSrc: './images/9.5/05.jpg'
        }, {
            uname: '张良',
            imgSrc: './images/9.5/06.jpg'
        }, {
            uname: '安其拉',
            imgSrc: './images/9.5/07.jpg'
        }, {
            uname: '李白',
            imgSrc: './images/9.5/08.jpg'
        }, {
            uname: '阿珂',
            imgSrc: './images/9.5/09.jpg'
        }, {
            uname: '墨子',
            imgSrc: './images/9.5/10.jpg'
        }, {
            uname: '鲁班',
            imgSrc: './images/9.5/11.jpg'
        }, {
            uname: '嬴政',
            imgSrc: './images/9.5/12.jpg'
        }, {
            uname: '孙膑',
            imgSrc: './images/9.5/13.jpg'
        }, {
            uname: '周瑜',
            imgSrc: './images/9.5/14.jpg'
        }, {
            uname: '老夫子',
            imgSrc: './images/9.5/15.jpg'
        }, {
            uname: '狄仁杰',
            imgSrc: './images/9.5/16.jpg'
        }, {
            uname: '扁鹊',
            imgSrc: './images/9.5/17.jpg'
        }, {
            uname: '马可波罗',
            imgSrc: './images/9.5/18.jpg'
        }, {
            uname: '露娜',
            imgSrc: './images/9.5/19.jpg'
        }, {
            uname: '孙悟空',
            imgSrc: './images/9.5/20.jpg'
        }, {
            uname: '黄忠',
            imgSrc: './images/9.5/21.jpg'
        }, {
            uname: '百里玄策',
            imgSrc: './images/9.5/22.jpg'
        }, ]

        // 需求1:检测用户输入字数
        //   1. 注册input事件
        //   2. 将文本的内容的长度赋值给对应的数值
        //   3. 表单的maxlength属性可以直接限制在200个数之间
        // 1.获取元素
        let textarea = document.querySelector('textarea');
        let useCount = document.querySelector('.useCount');
        //获取发布按钮
        let send = document.querySelector('#send');
        // 获取ul
        let ul = document.querySelector('ul');
        // 2.注册input事件
        textarea.addEventListener('input', function() {
            //console.log(textarea.value.length);
            useCount.innerHTML = textarea.value.length;
        })


        // 需求2: 输入不能为空
        //   点击button之后判断
        //   判断如果内容为空,则提示不能输入为空, 并且直接return 不能为空
        //   防止输入无意义空格, 使用字符串.trim()去掉首尾空格  '  str'.trim
        // console.log('  str');
        // console.log('  str'.trim());
        //   并将表单的value值设置为空字符串
        //   同时下面红色为设置为0
        send.addEventListener('click', function() {
            if (textarea.value.trim() === '') { //textarea.value是字符串 
                //   并将表单的value值设置为空字符串
                textarea.value = ''; //表单的值设为空
                //   同时下面红色为设置为0
                useCount.innerHTML = 0;
                return alert('内容不能为空');
            }
            //随机函数
            function getRandom(min, max) {
                return Math.floor(Math.random() * (max - min + 1)) + min
            }
            let random = getRandom(0, dataArr.length - 1)
                // 需求3:   新增留言  写到send 的里面
                // 创建一个小li,然后里面通过innerHTML追加数据
            let li = document.createElement('li') //写在里面 点击一次新建一个小li
                // 随机获取数据数组里面的内容, 替换newNode的图片和名字以及留言内容
                //单标签不写/也可以,避免出错
            li.innerHTML = ` <div class="info">
            <img class="userpic" src=${dataArr[random].imgSrc}>
              <span class="username">${dataArr[random].uname}</span>
        <p class="send-time"> ${new Date().toLocaleString()} </p>
      </div>
        <div class="content">${textarea.value}</div>
        <span class="the_del">X</span>`


            // 需求4:删除留言  放到追加的前面
            // 在事件处理函数里面获取点击按钮, 注册点击事件
            //   (易错点: 必须在事件里面获取, 外面获取不到)
            // 删除对应的元素(通过this获取对应的那条需要删除的元素)
            let del = li.querySelector('.the_del'); //li还没插入,用document.querySelector()获取不到
            del.addEventListener('click', function() {
                    //删除操作 点击的是x号 删除的是小li 父元素.removeChild(子元素)
                    ul.removeChild(li);

                })
                // 教你一招: 放到追加进ul的前面,这样创建元素的同时顺便绑定了事件,赞~~
                // 点击发布之后才有x号,才可以获取x号,只要一点发布就绑定点击事件



            // 把li追加给ul,永远放在ul第一个小li前面    用父元素.insertBefore(子元素,哪个元素的前面)
            ul.insertBefore(li, ul.children[0]);
            // 需求5:重置
            // 将表单域内容重置为空
            // 将userCount里面的内容重置为0
            textarea.value = '';
            //同时下面红色设置为0
            useCount.innerHTML = 0;
        })
    </script>
</body>

</html>

效果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值