03-JS-web API -节点-查-增-删-克隆-文本-时间戳-重绘和回流

180 阅读3分钟

03-JS-web API -节点-查-增-删-克隆-文本-时间戳-重绘和回流

1 节点操作

1 DOM节点

DOM树里每一个内容都称之为节点

2 节点类型
元素节点 (常用)

所有的标签 比如 body、 div ,span

可以更好的让我们理清标签元素之间的关系

html 是根节点

属性节点

所有的属性 比如 href src class

文本节点

所有的文本 , 标签里面的文字

1649247598021

2 查找节点

能够具备根据节点关系查找目标节点的能力

1 父节点- parentNode

parentNode 属性

返回最近一级的父节点 找不到返回为null

  <body>
    <div>
      <button>目标元素</button>
    </div>
    <script>
        // 先获取button 目标元素
      let button = document.querySelector('button');

      console.dir(button.parentNode); // 获取到父元素  div标签
      // 修改一下父元素的背景颜色
      button.parentNode.style.backgroundColor = 'red';

      button.parentNode.style.display = 'none';
    </script>
  </body>
2 子节点- children (重点) - childNodes (了解)

childNodes (少用)

获得所有子节点、包括文本节点(空格、换行)、注释节点等

children (常用)

仅获得所有元素节点

返回的还是一个伪数组

  <body>
    <ul>
      <li>a1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <ul>
      <li>b1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <ul>
      <li>c1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <script>
      /* 
      1 获取到所有的ul标签 数组
      2 遍历ul数组 挨个绑定点击事件
      3 点击事件触发了
        1 this = 当前被点击的ul标签 
        2 this.children 获取到 所有的ul的子元素 数组
        3 遍历 children 获取到中的每一个li标签
        4 li.style.display="none"
      
       */
      // let ul=document.querySelector("ul");

      // 获取ul标签下的 子节点
      // console.log(ul.children);

      // console.log(ul.childNodes);// 什么都那

      // 1 获取到所有的ul标签 数组
      let uls = document.querySelectorAll('ul');

      // 遍历ul数组 挨个绑定点击事件
      for (let index = 0; index < uls.length; index++) {
        // 3 点击事件触发了
        uls[index].addEventListener('click', function () {
          // 3.1 3.2 3.3  对被点击的ul的children 做遍历
          for (let j = 0; j < this.children.length; j++) {

            // this.children[j]  表示 每一个li标签
            this.children[j].style.display="none";

          }
        });
      }
    </script>
  </body>
3-1 兄弟节点-上个兄弟- previousElementSibling
3-2 兄弟节点-下个兄弟- nextElementSibling

给哪个标签设置了对应的兄弟节点 ,那么就能修改它对应的样式

  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
      <li>7</li>
      <li>8</li>
      <li>9</li>
      <li>10</li>
    </ul>
    <script>
      /* 
     1 获取所有的li标签 数组
     2 遍历 绑定点击事件
     3 事件触发了
       this.next
       this.previou 获取到对应的元素 设置他们的样式
      */

      //  1 获取所有的li标签 数组
      let lis = document.querySelectorAll('li');

      // 2 遍历 绑定点击事件
      for (let index = 0; index < lis.length; index++) {
        // 3 事件触发了
        lis[index].addEventListener('click', function () {
          // 上一个兄弟 设置 蓝色
          this.previousElementSibling.style.backgroundColor = 'blue';
          // 下一个兄弟 设置 绿色
          this.nextElementSibling.style.backgroundColor = 'green';
        });
      }
    </script>
  </body>

3 增加节点-createElement(创建)-appendChild(插入)- insertBefore-(指定插入)

一般情况下,我们新增节点,按照如下操作:

创建一个新的节点

1 创建节点

即创造出一个新的网页元素,再添加到网页内,一般先创建节点,然后插入节点

只创建节点,在网页中是看不见的,还要插入

创建元素节点方法:

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>

    <script>
        // 1 创建一个 li 标签 节点
        let li=document.createElement('li')
        console.log(li);

        // 要给插入li加样式
        li.innerHTML='这是JS创建的li'
        li.style.backgroundColor='red'

        // 2 吧 li 标签插入到  ul 标签中
        let ul=document.querySelector('ul')
        ul.appendChild(li)//把li标签插入到ul 中 父元素的底部 插入子元素
    </script>
</body>
2 插入节点

注意:

appendChild ( ) 只能插入一个标签

父元素.appendChild( 标签 )

append ( ) 可以插入多个标签 括号里要用逗号隔开

 父元素.append( 标签1 ,  标签2  ,标签3)

2-1 appendChild- 插入到父元素的最后一个子元素

要想在界面看到,还得插入到某个父元素中

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>

    <script>
        // 1 创建一个 li 标签 节点
        let li=document.createElement('li')
        console.log(li);

        // 要给插入li加样式
        li.innerHTML='这是JS创建的li'
        li.style.backgroundColor='red'

        // 2 吧 li 标签插入到  ul 标签中
        let ul=document.querySelector('ul')
        ul.appendChild(li)//把li标签插入到ul 中 父元素的底部 插入子元素
    </script>
</body>

2-2 移动-剪切

appendChild 插入元素的功能 | 剪切

1 appendChild(元素) 如果该元素是已经存在网页中, appendChild作用类似 移动

2 appendChild(元素) 如果该元素新创建的, appendChild作用类似 简单的插入

  <body>
    <ul class="left">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
    </ul>
    <ul class="right"></ul>

    <script>
      // appendChild  插入元素的功能 |  剪切

      // appendChild(元素)  如果该元素是已经存在网页中, appendChild作用类似 移动 
      // appendChild(元素)  如果该元素新创建的, appendChild作用类似 简单的插入

      // 先获取左边的第一个li标签
      let li = document.querySelector('.left li:nth-child(1)');

      let rightUl = document.querySelector('.right');
      // 把li标签插入到右边的ul中
      rightUl.appendChild(li);
    </script>
  </body>
3 insertBefore-可以插入到指点元素位置

父元素.insertBefore(要插入的元素,哪个元素的上面)

insertBefore 也能插入元素 功能也类似 appendChild

1 如果要插入的元素 是已经存在的 那么insertBefore作用 移动

2 如果要插入的元素 是新创建的 insertBefore作用 仅仅 插入

1649249756454

1649249465595

  <body>
    <ul class="left">
      <li>a</li>
      <li>b</li>
      <li>c</li>
      <li>d</li>
    </ul>
    <ul class="right">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>

    <script>
      /* 
      insertBefore 也能插入元素 功能也类似 appendChild
      1 如果要插入的元素 是已经存在的  那么insertBefore作用 移动
      2 如果要插入的元素 是新创建的  insertBefore作用 仅仅 插入
      
       */
      let c = document.querySelector('.left li:nth-child(3)');
      let two = document.querySelector('.right li:nth-child(2)');
      let right = document.querySelector('.right');

      right.insertBefore(c,two);
      let li = document.createElement('li');
      li.innerText = '新创建的';
      right.insertBefore(li, two);

      // 父元素.insertBefore(要插入的元素,哪个元素的上面);
    </script>
  </body

4 克隆节点-cloneNode(克隆)

复制一个原有的节点

把复制的节点放入到指定的元素内部

语法:

元素 .cloneNode (布尔值)

cloneNode会克隆出一个跟原标签一样的元素,括号内传入布尔值

1 若为true,则代表克隆时会包含后代节点一起克隆 ---深克隆

2 若为false,则代表克隆时不包含后代节点 ---浅克隆

3 默认值为 false

<body>
    <div class='box'>
        <button>点击</button>
    </div>

    <script>
        // 1 来克隆这个节点 box
        let box=document.querySelector('.box')

        // 2 开始克隆
        //  cloneNode(false) 为浅克隆  不会把 div 的后代节点(所有元素)一起克隆
        // let newBox=box.cloneNode(false)

         // cloneNode(true) 为深克隆  会把 div 的后代节点(所有元素)一起克隆
        let newBox=box.cloneNode(true)

        // 3 插入到 body标签中
        document.body.appendChild(newBox)
    </script>
</body>

5 删除节点- removeChild

能够具备根据需求删除节点的能力

1 若一个节点在页面中已不需要时,可以删除它

2 在JavaScript原生DOM操作中,要删除元素必须通过父元素

语法:

父元素 .removeChild(要删除的元素)
<body>
    <button>删除ul中某一个li标签</button>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>

    <script>

        let button=document.querySelector('button')
        let ul=document.querySelector('ul')

        // 如果在外面定义了 li 就是ul中的第一个li 
        // 那么就只能删除第一个li,后续的li不受影响
        let li=document.querySelector('li:nth-child(1)')

        button.addEventListener('click',function(){
            //每点击一次就 删除ul中的第一个li
            // let li=document.querySelector('li:nth-child(1)')
            ul.removeChild(li)

            // 删除自己
            // ul.remove()
            // button.remove()
        })
    </script>
</body

注意:

如果不存在父子关系则删除不成功

删除节点和隐藏节点 (display:none) 有区别的: 隐藏节点还是存在的,但是删除,则从HTML中删除节点

拓展:

removeChild --是父元素删除子元素

remove ---则是删除自己

元素.remove     //给自己添加,就会删除自己

6 文本节点-(创建与插入)

语法:

        // 添加文字节点
		//声明一个变量 = 创建文本属性  ('文本内容')
          let tex1=document.createTextNode('•')
          let tex2=document.createTextNode('人在学习')

再把变量插入到对应的标签 前 或 后

              div.appendChild(span1)
              div.appendChild(tex1)
              div.appendChild(span2)
              div.appendChild(tex2)

7 数组和伪数组的区别

相同点:都可以使用 for 循环

而伪数组对于好用的数组的方法是不支持的

filter
map
some
every
find
findlndex
reduce

使用 **document.querySelectorAll **获取的是伪数组

6 思维导图

1649249547134

1649386580888

8 时间戳

1 实例化

在代码中发现 new 关键字时, 一般将这个操作称之为 实例化

创建一个时间对象并获取时间

获取当前时间

    <script>
      // 1 实例化一个 时间对象 new
      let date = new Date();

    console.log(date);  //获取当前时间
    console.log(date.getTime());  //获取时间戳 方式一
    console.log(+new Date);  //获取时间戳 方式二
    console.log(Date.now());  //获取时间戳 方式三

      console.log(date.getFullYear()); //  输出当下是什么年份
      console.log(date.getMonth()); //  输出月份 0-12 都会自己 加一
      console.log(date.getDate()); //  几号
      console.log(date.getDay()); //  输出星期几 星期一 是 1 星期二  星期六 6 星期天 0
      console.log(date.getHours()); //  小时
      console.log(date.getMinutes());//  分钟
      console.log(date.getSeconds());//  秒
    </script>

2 时间对象方法(获取常见日期)

能够使用时间对象中的方法写出常见日期

因为

时间对象返回的数据我们不能直接使用,所以需要转换为实际开发中常用的格式

方法作用说明
getFullYear( )获得年份获取四位年份
getMonth( )获得月份取值为 0~11 (月份要自己加 1)
getDate( )获得月份中的每一天不同月份取值也不相同
getDay( )获取星期取值为 0~6 ( 0 为星期天 )
getHours( )获取小时取值为 0 ~ 23
getMinutes( )获取分钟取值为 0 ~ 59
getSeconds( )获取秒取值为 0 ~ 59

一般用于封装函数内,进行调用.用于时间要加上补 0

      // 封装一个函数 获取时间
      function grtTime(){
       let data=new Date;
       let year= data.getFullYear() //年
       let month= data.getMonth()+1//月
       let day= data.getDate()//日
       let hours= data.getHours()//时
       let minutes= data.getMinutes()//分
       let second= data.getSeconds()//秒
      //  时间补0
        month = month < 10 ? '0' + month : month;
        day = day < 10 ? '0' + day : day;
        hours = hours < 10 ? '0' + hours : hours;
        minutes = minutes < 10 ? '0' + minutes : minutes;
        second = second < 10 ? '0' + second : second;
        return `${year}-${month}-${day}-${hours}:${minutes}:${second}`
      }

3 时间戳

一般用于做 时间 或者 快速生成一个不会重复的数字

有三种获取时间戳方式:

1 Date.now ( )

2 date.getTime ( )

3 +new Date ( )

+new Date()  //  可以使用 + 号将整个对象 转成 时间戳

转换时间公式:

1649432342206

是返回当前时间和 1970 年1 月 1 日 0 时 0 分 0 秒 之间毫秒数

    <script>
        let data=new Date
        console.log(data.getTime());//方式一

        // console.log(+new Date()); //方式二 只要日期对象  可以使用+ 将整个对象 转成 时间戳

        // console.log(Date.now()); //方式三
        
        // 来快速生成一个不会重复的数字  *随机数
    </script>

9 重绘和回流

浏览器是如何进行界面渲染的

1 解析(Parser)HTML,生成DOM树(DOM Tree)

2 同时解析(Parser) CSS,生成样式规则 (Style Rules)

3 根据DOM树和样式规则,生成渲染树(Render Tree)

4 进行布局 Layout(回流/重排):根据生成的渲染树,得到节点的几何信息(位置,大小)

5 进行绘制 Painting(重绘): 根据计算和获取的信息进行整个页面的绘制

6 Display: 展示在页面上

回流(重排)

当 Render Tree 中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档的过 程称为 回流。

会导致回流(重排)的操作:

​ 1 页面的首次刷新

​ 2 浏览器的窗口大小发生改变

​ 3 元素的大小或位置发生改变

​ 4 改变字体的大小

​ 5 内容的变化(如:input框的输入,图片的大小)

​ 6 激活css伪类 (如::hover)

​ 7 脚本操作DOM(添加或者删除可见的DOM元素)

简单理解影响到布局结构了,就会有回流

重绘

由于节点(元素)的样式的改变并不影响它在文档流中的位置和文档布局时(比如:color、background-color、 outline等), 称为重绘。

简单理解

修改了外观颜色 字体颜色 等等

注意:

重绘不一定引起回流,而回流一定会引起重绘。

1650085817924

案例示范:

1 appendChild -点击标签移动的案例
<!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>Document</title>
    <style>
        body{
            display: flex;
            justify-content: space-between;
        }
        .left{
            background-color: red;
            width: 300px;
            height: 120px;
        }
        .right{
            background-color: blue;
            width: 300px;
            height: 120px;
        }
    </style>
</head>
<body>
    <ul class="left">
        <li>龙虾</li>
        <li>鲍鱼</li>
        <li>荷兰豆</li>
        <li>皇帝蟹</li>
        <li></li>
    </ul>
    <ul class="right"></ul>

    <script>
         /* 
      1 获取到左侧所有的li标签
      2 遍历 绑定点击事件
        appendChild 
        父元素.appendChild(要插入的元素-点击了谁)
       */
        let li=document.querySelectorAll('.left li')
        let rightUl=document.querySelector('.right')

        for (let index = 0; index < li.length; index++) {
            li[index].addEventListener('click',function(){
                // li点击的时候,转到右边去
                rightUl.appendChild(li[index])
            })   
        }
    </script>
</body>
</html>
2 遍历数组-创建节点与插入节点-案例(渲染成在线)
<!-- 
  1 引入style.css
  2 引入 data.js
  3 根据data.js中的data数组 来遍历生成代码 
    最终让网页显示出来 data数组的数据
 -->
 <!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>Document</title>
   <link rel="stylesheet" href="./style.css">
 </head>
 <body>
  <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>
      <!-- 1 引入 要显示的数据 -->
      <script src="./data/data.js"></script>
      <!-- 2 在写自己的业务 -->
      <script>
        /* 
       1 获取到要渲染到页面中的数据  data 
       2 遍历data
        要求使用 createElement appendChild 来往ul中插入 li 元素 
        1 创建一个li标签
        2 创建一个图片便签 设置 src属性
        3 创建一个h4标签 设置文本内容
        4 创建一个div标签 添加一个class info
        5 创建两个span标签
          1个设置内容 高级 
          2个设置人数 1125 
  
        6 组装
          li标签要 插入 img
          li标签要 插入 h4
          li标签要 插入 div.info
          div.info 要插入两个span 
  
          ul插入 li 
  
      3 append可以插入多个元素  appendChild  只能插入一个元素 
        createTextNode 创建文件节点 
  
       
        */
        let ul=document.querySelector('.clearfix')

    //    遍历  data 数组
        for (let index = 0; index < data.length; index++) {
        //创建标签  以及添加标签内容 
           let li=document.createElement('li')
           
           let img=document.createElement('img')
            img.src=data[index].src
            // console.log(img);

           let h4=document.createElement('h4')
           h4.innerText=data[index].title

           let div=document.createElement('div')
           div.classList.add('info')
        //    console.log(div);

           let span1=document.createElement('span')
           span1.innerText='高级'
        //    console.log(span1);

           let span2=document.createElement('span')
           span2.innerText=data[index].num
        //    console.log(span2);
        // 添加文字节点
          let tex1=document.createTextNode('•')
          let tex2=document.createTextNode('人在学习')

        // 组装  li插入 img h4 div
 //  appendChild 只能插入单个标签 方法一

            // li.appendChild(img)
            // li.appendChild(h4)
            // li.appendChild(div)
        // div 插入 span1 tex1 span2 tex2

            //  div.appendChild(span1)
            //  div.appendChild(tex1)
            //  div.appendChild(span2)
            //  div.appendChild(tex2)

  // append  可以插入多个标签   方法二
            li.append(img,h4,div)
            div.append(span1,tex1,span2,tex2)
        // ul 插入 li
             ul.appendChild(li)
        }
   </script>
 </body>
 </html>
3 微博发布案例-点击生成-创建与插入-时间与文本同步
<!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>Document</title>
    <link rel="stylesheet" href="css/weibo.css" />
  </head>

  <body>
    <div class="w">
      <div class="controls">
        <img src="images/tip.png" alt="" /><br />
        <textarea
          placeholder="说点什么吧..."
          id="area"
          cols="30"
          rows="100"
          maxlength="200"
        ></textarea>
        <div>
          <span class="useCount">0</span>
          <span>/</span>
          <span>200</span>
          <button id="send">发布</button>
        </div>
      </div>
      <div class="contentList">
        <ul>
          <!-- <li>
            <div class="info">
              <img class="userpic" src="./images/9.5/06.jpg" />
              <span class="username">张良</span>
              <p class="send-time">发布于 2022-4-7 15:12:23</p>
            </div>
            <div class="content">sdfdf</div>
            <span class="the_del">X</span>
          </li> -->
        </ul>
      </div>
    </div>
    <script>
      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' },
      ];

      let tex=document.querySelector('textarea')
      let useCount=document.querySelector('.useCount')
      let send=document.querySelector('button')
      let ul=document.querySelector('ul')

      // 点击
      send.addEventListener('click',function(){
        // 生成li
        let li=document.createElement('li')
        // 生成li里面的三标签,添加类名
        let info=document.createElement('div')
        info.classList.add('info')
        // 第一个div里面再生成三个标签,添加类名
        // 声明一个变量,然后调用函数 随机数组下标
        let user=grtNum();
        // 头像
        let img=document.createElement('img')
        img.classList.add('userpic')
        img.src=user.imgSrc

        // 名字
        let username=document.createElement('span')
        username.classList.add('username')
        username.innerText=user.uname

        // 发布时间
        let sendTime=document.createElement('p')
        sendTime.classList.add('send-time')
        sendTime.innerText=`发布于 ${grtTime()}`

        // 文字内容
        let content=document.createElement('div')
        content.classList.add('content')
        content.innerText=tex.value

        // 删除
        let the_del=document.createElement('span')
        the_del.classList.add('the_del')
        the_del.innerText='X'

        // 第一个div插入里面的标签
        info.append(img,username,sendTime)

        // li里面插入三标签
        li.append(info,content,the_del)

        // ul插入li
        ul.appendChild(li)
        
        // 点击后文本域清0,底下数字也清0
        tex.value=''
        useCount.innerText=0

      })

      // w文本域 input事件
      tex.addEventListener('input',function(){
        useCount.innerText=tex.value.length
      })

      // 函数 随机数,调用图片 名字
       function grtNum(){
       // 随机公式 Math.round(Math.random()*(max-min)+min)
      let index=Math.round(Math.random()*dataArr.length-1);
      let user=dataArr[index];
      return user;
      // console.log(dataArr[index]);
      }

      // 封装一个函数 获取时间
      function grtTime(){
       let data=new Date;
       let year= data.getFullYear() //年
       let month= data.getMonth()+1//月
       let day= data.getDate()//日
       let hours= data.getHours()//时
       let minutes= data.getMinutes()//分
       let second= data.getSeconds()//秒
      //  时间补0
        month = month < 10 ? '0' + month : month;
        day = day < 10 ? '0' + day : day;
        hours = hours < 10 ? '0' + hours : hours;
        minutes = minutes < 10 ? '0' + minutes : minutes;
        second = second < 10 ? '0' + second : second;
        return `${year}-${month}-${day}-${hours}:${minutes}:${second}`
      }
 </script>
  </body>
</html>
3-1 微博案例-优化做法
<!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>Document</title>
    <link rel="stylesheet" href="css/weibo.css" />
  </head>

  <body>
    <div class="w">
      <div class="controls">
        <img src="images/tip.png" alt="" /><br />
        <textarea
          placeholder="说点什么吧..."
          id="area"
          cols="30"
          rows="100"
          maxlength="200"
        ></textarea>
        <div>
          <span class="useCount">0</span>
          <span>/</span>
          <span>200</span>
          <button id="send">发布</button>
        </div>
      </div>
      <div class="contentList">
        <ul>
          <!-- <li>
            <div class="info">
              <img class="userpic" src="./images/9.5/06.jpg" />
              <span class="username">张良</span>
              <p class="send-time">发布于 2022-4-7 15:12:23</p>
            </div>
            <div class="content">sdfdf</div>
            <span class="the_del">X</span>
          </li> -->
        </ul>
      </div>
    </div>
    <script>
      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 生成一个li标签
          1 给li添加属性和子元素 
          2 获取文本域的内容 设置到对应的标签中 
        2 插入到ul中 

      2 给文本域绑定 input事件 
        获取文字的长度 设置对应的标签上 文字个数标签上

      3 给删除标签 绑定点击事件
        1 获取它的父节点 parentNode 
        2 让它父节点 删除自己 remove()

       */
      // 获取元素 发布按钮
      let tex=document.querySelector('textarea')
      let useCount=document.querySelector('.useCount')
      let send=document.querySelector('button')
      let ul=document.querySelector('ul')

      // 点击
      send.addEventListener('click',function(){

        let user=grtNum();
        let liHtml=`
        <li>
            <div class="info">
              <img class="userpic" src="${user.imgSrc}" />
              <span class="username">${user.uname}</span>
              <p class="send-time">发布于 ${grtTime()}</p>
            </div>
            <div class="content">${tex.value}</div>
            <span class="the_del">X</span>
          </li>
        `;
        // 每次点击  在旧标签的基础上 拼接多一个标签
        ul.innerHTML+=liHtml;
        tex.value='';
        useCount.innerHTML=0
        
      })
      // 文本域,input事件
      tex.addEventListener('input',function(){
        useCount.innerHTML=tex.value.length
      })


            // 函数 随机数,调用图片 名字
       function grtNum(){
       // 随机公式 Math.round(Math.random()*(max-min)+min)
      let index=Math.round(Math.random()*dataArr.length-1);
      let user=dataArr[index];
      return user;
      // console.log(dataArr[index]);
      }
           // 封装一个函数 获取时间
           function grtTime(){
       let data=new Date;
       let year= data.getFullYear() //年
       let month= data.getMonth()+1//月
       let day= data.getDate()//日
       let hours= data.getHours()//时
       let minutes= data.getMinutes()//分
       let second= data.getSeconds()//秒
      //  时间补0
         month = month < 10 ? '0' + month : month;
        day = day < 10 ? '0' + day : day;
        hours = hours < 10 ? '0' + hours : hours;
        minutes = minutes < 10 ? '0' + minutes : minutes;
        second = second < 10 ? '0' + second : second;
        return `${year}-${month}-${day}-${hours}:${minutes}:${second}`
      }
    </script>
  </body>
</html>