03-DOM- 节点操作

49 阅读5分钟

DOM- 节点操作

节点操作

初识节点

1.什么是节点?

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

2.节点的类型

  1. 元素节点
    • 所有的标签 比如 body、 div
    • html 是根节点
  2. 属性节点
    • 所有的属性 比如 href
  3. 文本节点
    • 所有的文本

1649246049328

查找节点

节点关系

  • 父节点
  • 子节点
  • 兄弟节点

父节点查找

子级可以通过parentNode 查找到最近的父级,并给父级修改属性。

  • parentNode 属性
  • 返回最近一级的父节点 找不到返回为null
语法

1649246174994

代码展示

<body>
    <div>
        <span></span>
    </div>
    <script>
        let span = document.querySelector('span')
        span.parentNode.innerText = '这是父级节点测试'
    </script>
</body>
案例

1.关闭单个淘宝二维码:通过点击子盒子,让父盒子隐藏

<body>
    <div>
        <img src="./image/1.png" alt="" class="img">
        <img src="./image/2.png" alt="">
    </div>
    <script>
        let img = document.querySelector('.img')
        img.addEventListener('click', function () {
            img.parentNode.style.display = 'none'
        })
    </script>
</body>

2.选择关闭多个二维码

<body>
    <div>1
        <img src="./image/1.png" alt="" class="img">
        <img src="./image/2.png" alt="" class="img2">
    </div>
    <div>2
        <img src="./image/1.png" alt="" class="img">
        <img src="./image/2.png" alt="" class="img2">
    </div>
    <div>3
        <img src=" ./image/1.png" alt="" class="img">
        <img src="./image/2.png" alt="" class="img2">
    </div>
    <div>4
        <img src=" ./image/1.png" alt="" class="img">
        <img src="./image/2.png" alt="" class="img2">
    </div>
    <script>
        let imgList = document.querySelectorAll('.img')
        // let imgList2 = document.querySelectorAll('img2')
        for (let index = 0; index < imgList.length; index++) {
            imgList[index].addEventListener('click', function () {
                imgList[index].parentNode.style.display = 'none'
                // this.parentNode.style.display = 'none'

            })

        }
    </script>
</body>

子节点查找

  • childNodes
    • 获得所有子节点、包括文本节点(空格、换行)、注释节点等
  • children (重点)
    • 仅获得所有元素节点
    • 返回的还是一个伪数组
语法

1649246634314

兄弟关系查找

  1. 下一个兄弟节点
    • nextElementSibling 属性
  2. 上一个兄弟节点
    • previousElementSibling 属性

增加节点

步骤

  • 创建一个新的节点
  • 把创建的新的节点放入到指定的元素内部

1.创建节点

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

  • 创建元素节点方法

    1649246774827

  • 创建文本节点

    document.createTextNode(data)
    

    data : 字符串值,可规定此节点的文本。

2.追加节点

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

  1. 插入到父元素中某个子元素的前面

    1649246893201

  2. 插入到父元素的最后一个子元素

1649246906566

案例

增加节点

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <script>
        // 增加节点li
        // let li = document.createComment('li')
        let li = document.createElement('li');
        li.innerText = "这个是新创建的li标签";

        // 插入
        let ul = document.querySelector('ul')
        // ul.appendChild(li)
        ul.appendChild(li);
    </script>
</body>

3.克隆节点

  • 特殊情况下,我们新增节点,按照如下操作:

    • 复制一个原有的节点
    • 把复制的节点放入到指定的元素内部
  • 克隆节点

    1649247110350

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

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

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

  • 默认为false

代码展示

    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: aqua;
            border: 1px solid black;
        }
    </style>
</head>

<body>
    <div>
        <button>点击</button>
    </div>
    <script>
        let div = document.querySelector('div')
        let newBox = div.cloneNode()
        let newBox2 = div.cloneNode(true)

        document.body.appendChild(newBox)   //浅克隆,不会克隆div中的子节点

        document.body.appendChild(newBox2) //深克隆,会将其中的所有节点克隆进去

    </script>
</body>

删除节点

  • 若一个节点在页面中已不需要时,可以删除它
  • 在 JavaScript 原生DOM操作中,要删除元素必须通过父元素删除

语法

1649292036084

代码展示

<body>
    <button>点击删除</button>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
    </ul>
    <script>
        let button = document.querySelector('button')
        let ul = document.querySelector('ul')

        button.addEventListener('click', function () {
            let li = document.querySelector('li:nth-child(1)');

            ul.removeChild(li)
            /* 父元素.removeChild(要删除的元素) */
            // button.remove()
            // 父元素.remove() 删除自己

        })
    </script>
</body>

注意

  • 如不存在父子关系则删除不成功
  • 删除节点和隐藏节点(display:none) 有区别的: 隐藏节点还是存在的,但是删除,则从html中删除节点

时间对象

  • 时间对象:用来表示时间的对象
  • 作用:可以得到当前系统时间

1.实例化

  • 在代码中发现了 new 关键字时,一般将这个操作称为实例化
  • 创建一个时间对象并获取时间
获取当前时间

1649313259304

获取指定时间

1649313269853

2.时间对象方法

  • 因为时间对象返回的数据我们不能直接使用,所以需要转换为实际开发中常用的格式
格式
方法作用说明
getFullYear()获得年份获取四位年份
getMonth()获得月份取值为 0 ~ 11
getDate()获取月份中的每一天不同月份取值也不相同
getDay()获取星期取值为 0 ~ 6
getHours()获取小时取值为 0 ~ 23
getMinutes()获取分钟取值为 0 ~ 59
getSeconds()获取秒取值为 0 ~ 59
案例

需求:将当前时间以:YYYY-MM-DD HH:mm 形式显示在页面

分析:

  • ①:调用时间对象方法进行转换
  • ②:字符串拼接后,通过 innerText 给 标签

3.时间戳

定义

1.什么是时间戳

是指1970年01月01日00时00分00秒起至现在的毫秒数,它是一种特殊的计量时间的方式

语法

三种方式获取时间戳

  • 使用 getTime() 方法

    1649314860834

  • 简写 +new Date()

    1649314884595

  • 使用 Date.now()

    1649314905681

    • 无需实例化
    • 但是只能得到当前的时间戳, 而前面两种可以返回指定时间的时间戳

代码展示

    <script>
        // 获取时间戳的三种方式
        let date = new Date();
        console.log(date.getTime());   //方式一

        // 方式二
        console.log(+new Date());
        // 方式三
        console.log(Date.now());
    </script>

案例

在线时钟案例,在页面中显示年月日时分秒

<body>
    <h1></h1>
    <!-- 1.先写出当前的年月日
    2.再使用定时器,将数据包含 -->

    <script>
        let h1 = document.querySelector('h1')
        setInterval(() => {
            let date = new Date();

            let years = date.getFullYear();
            let month = date.getMonth() + 1;
            let dates = date.getDate();
            let hours = date.getHours();
            let minimum = date.getMinutes();
            let seconds = date.getSeconds();

            h1.innerText = `${years}-${month}-${dates} ${hours}:${minimum}:${seconds}`
        }, 1000);

    </script>
</body>

4.综合案例

发布微博案例

  • 需求1:检测用户输入字数\
    1. 注册input事件
    2. 将文本的内容的长度赋值给对应的数值
    3. 表单的maxlength属性可以直接限制在200个数之间
  • 需求2: 输入不能为空
    1. 表单的maxlength属性可以直接限制在200个数之间
    2. 防止输入无意义空格, 使用字符串.trim()去掉首尾空格 并将表单的value值设置为空字符串 同时下面红色为设置为0
  • 需求3: 新增留言
    1. 创建一个小li,然后里面通过innerHTML追加数据
    2. 随机获取数据数组里面的内容, 替换newNode的图片和名字以及留言内容
    3. 利用时间对象将时间动态化 new Date().toLocaleString()
    4. 追加给 ul
  • 需求4:删除留言
    1. 在事件处理函数里面获取点击按钮,注册点击事件
    2. (易错点: 必须在事件里面获取,外面获取不到)
    3. 删除对应的元素 (通过this获取对应的那条需要删除的元素)
    4. 教你一招: 放到追加进ul的前面,这样创建元素的同时顺便绑定了事件,赞~~
  • 需求5:重置
    1. 将表单域内容重置为空
    2. 将userCount里面的内容重置为0

案例成品

1649331944994

完整代码:

<!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 ul = document.querySelector('ul')
    let send = document.querySelector('#send')
    let useCount = document.querySelector('.useCount')

    send.addEventListener('click', function () {

      // 随机选择头像跟名字
      let index = Math.round(Math.random() * (dataArr.length - 1))
      let user = dataArr[index]





      //  构建架构
      let li = document.createElement('li')
      let info = document.createElement('div')
      info.classList.add('info')
      let userpic = document.createElement('img')
      userpic.classList.add('userpic')
      // userpic.src = "./images/9.5/06.jpg"
      userpic.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 = `发布于 ${getTime()}`
      // 包起来
      info.append(userpic, username, sendTime)

      let content = document.createElement('div')
      content.classList.add('content')
      content.innerText = area.value
      let theDel = document.createElement('span')
      theDel.classList.add('the_del')
      theDel.innerText = 'X'  //删除"X"标签
      theDel.addEventListener('click', function () {
        // theDel.parentNode.remove()
        this.parentNode.remove()
      })


      li.append(info, content, theDel)
      ul.appendChild(li)

      area.value = ''
      useCount.innerText = '0'




    })

    // Input事件
    area.addEventListener('input', function () {
      useCount.innerText = area.value.length;
    })

    function getTime() {
      let date = new Date();
      let years = date.getFullYear();
      let month = date.getMonth() + 1;
      let dates = date.getDate();
      let hours = date.getHours();
      let minimum = date.getMinutes();
      let seconds = date.getSeconds();

      return `${years}-${month}-${dates} ${hours}:${minimum}:${seconds}`

    }




  </script>
</body>

</html>