【Web APIs】DOM节点

目录

1.节点操作

1.1DOM节点

1.2查找节点

1.2.1父节点查找

1.2.2子节点查找

1.2.3兄弟节点查找

1.3增加节点

1.4克隆节点

1.5删除节点

2.时间对象

2.1实例化

2.2时间对象方法

2.3时间戳

3.重绘和回流


1.节点操作

1.1DOM节点

DOM节点:DOM树中的每一个内容都称为节点

节点类型:

1️⃣元素节点:

  • 所有的标签:如body,div
  • html是根节点

2️⃣属性节点:

  • 所有的属性,如src,href

3️⃣文本节点:

  • 所有的文本

1.2查找节点

节点关系:

  1. 父节点
  2. 子节点
  3. 兄弟节点

1.2.1父节点查找

parentNode属性

语法:子元素.parentNode

作用:返回最近一级的父节点,找不到返回null

1.2.2子节点查找

语法:父元素.children

  • childNodes:获得所有子节点,包括文本节点(空格,换行),注释节点
  • children:仅获得所有元素节点,返回一个伪数组

1.2.3兄弟节点查找

下一个兄弟节点:nextElementSibling属性

上一个兄弟节点:previousElementSibling属性

1.3增加节点

增加节点步骤:

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

①创建节点

  • 语法:document.createElement('标签名')

②追加节点

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

  • 插入到父元素的最后一个子元素:父元素.appendChild(要插入的元素)
  • 插入到父元素中某个子元素的前面:父元素.insertBefore(要插入的元素,在哪个元素的前面)

1.4克隆节点

语法:元素.cloneNode(布尔值)

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

  • 若为true,则代表克隆时会包含后代节点一起克隆
  • 若为false,则代表克隆时不包含后代节点(默认为false)

1.5删除节点

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

语法:父元素.removeChild(要删除的元素)

📖Note:

  • 如果不存在父子关系则删除不成功
  • 删除节点和隐藏节点区别:隐藏节点还是存在的,删除之后节点就不存在了

2.时间对象

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

2.1实例化

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

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

获得指定时间

2.2时间对象方法

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

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

2.3时间戳

时间戳:从1970年1月1日(UTC/GMT的午夜)开始所经过的毫秒数,不考虑闰秒

倒计时核心思想:

将来某个时间的时间戳 - 现在时间的时间戳 = 毫秒数 ===> 转换成时分秒

案例:倒计时

<!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>
    .countdown {
      width: 240px;
      height: 305px;
      text-align: center;
      line-height: 1;
      color: #fff;
      background-color: brown;
      overflow: hidden;
    }

    .countdown .tips {
      font-size: 16px;
      margin: 25px 0 14px;
    }

    .countdown .title {
      font-size: 33px;
    }

    .countdown .over {
      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;
    }

    .countdown .now i {
      font-style: normal;
    }
  </style>
</head>

<body>
  <div class="countdown">
    <!-- 顶部日期提示 -->
    <p class="tips"></p>
    <p class="title">下班倒计时</p>
    <p class="clock">
      <span id="hour">00</span>
      <i>:</i>
      <span id="minute">00</span>
      <i>:</i>
      <span id="second">00</span>
    </p>
    <!-- 下班时间 -->
    <p class="over">下班时间是18:00:00</p>
  </div>

  <script>
    // 顶部日期提示
    let date = new Date()
    let year = date.getFullYear()
    let month = date.getMonth() + 1
    let day = date.getDate()

    let tip = document.querySelector('.tips')
    tip.innerHTML = `今天是${year}年${month}月${day}日`

    // 获取元素
    let hour = document.querySelector('#hour')
    let minute = document.querySelector('#minute')
    let second = document.querySelector('#second')
    
    time()
    setInterval(time, 1000)
  
    function time() {
      // 获得现在的时间戳
      let now = +new Date()
      // 得到指定时间的时间戳
      let last = +new Date('2024-3-24 18:00:00')
      // 计算时间戳之差 
      let count = (last - now) / 1000

      // 转换为时分秒
      // h = parseInt(总秒数 / 60 / 60 % 24)
      // m = parseInt(总秒数 / 60 % 60)
      // s = parseInt(总秒数 % 60)

      let h = parseInt(count / 60 / 60 % 24)
      // h补0
      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.innerText = h
      minute.innerHTML = m
      second.innerHTML = s

    }

  </script>

</body>

</html>

3.重绘和回流

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

  1. 解析(Parser)HTML,生成DOM树(DOM Tree)
  2. 同时解析(Parser)CSS,生成样式规则(Style Rules)
  3. 根据DOM树和样式规则,生成渲染树(Render Tree)
  4. 进行布局Layout(回流/重排):根据生成的渲染树,得到节点的几何信息(位置,大小)
  5. 进行绘制Painting(重绘):根据计算和获取的信息进行整个页面的绘制
  6. Display:展示在页面上

重绘和回流:

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

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

📖Note:

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

会导致回流的操作:

  • 页面的首次刷新
  • 浏览器的窗口大小发生改变
  • 元素的大小或位置发生改变
  • 改变字体的大小
  • 内容的变化(input框的输入,图片的大小等)
  • 激活CSS伪类(hover等)
  • 脚本操作DOM(添加或删除可见的DOM元素)

简单来说:影响到布局了,就会引起回流

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计一个webapis学生报名系统的代码步骤如下: 1. 数据库设计:首先确定需要存储的数据,例如学生的基本信息,课程信息等。根据需求设计数据库表结构,并创建相应的表。 2. 后端接口设计:根据系统需求,设计后端接口,包括学生信息的录入、查询、修改和删除等功能。使用合适的编程语言,如Java、Python等,实现这些接口。 3. 前端界面设计:设计一个用户友好的前端界面,包括学生报名表单和查询功能。使用HTML、CSS、JavaScript等技术实现界面的布局和交互,确保用户能够方便地输入和查询信息。 4. 前后端交互:通过AJAX或其他技术,实现前后端的数据交互。前端向后端发送请求,后端处理请求并返回相应的数据。 5. 学生信息录入:在前端界面设计好的报名表单中,用户输入个人信息,通过调用后端接口将数据传递到后台。后台接收并验证输入的数据,并将学生信息存储到数据库中。 6. 学生信息查询:在前端界面设计好的查询功能中,用户输入需要查询的条件,通过调用后端接口将查询条件传递到后台。后台根据查询条件在数据库中查找匹配的学生信息,并将查询结果返回给前端。 7. 学生信息修改和删除:在前端界面设计好的修改和删除功能中,用户选择需要修改或删除的学生信息,并通过调用后端接口将相应的操作请求传递到后台。后台根据请求进行相应的操作,更新或删除数据库中的对应数据。 8. 错误处理和数据校验:在整个系统设计过程中,需要考虑错误处理和数据校验。在后端接口中,对输入的数据进行合法性检查,确保输入的数据符合要求。在前端界面中,对用户的输入进行格式验证,及时反馈给用户。 9. 安全性保障:为了保障系统的安全性,可以采用身份认证、权限控制等机制,确保只有授权的用户能够进行报名和查询等操作。 10. 测试和部署:在完成系统开发后,进行系统的测试和调试。确保系统的正确性和稳定性。最后将系统部署到服务器上,供用户使用。 以上是一个简单的webapis学生报名系统代码步骤,具体实现还需要根据具体需求进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值