javaScript 05 API中DOM

简介: DOM概念、DOM常见用法、定时器的使用

一、DOM概念:

捡起来我们在 JS 01 学的知识


48979ac38920b2dfa1e4dd0b75bd4b0e.png

1.1什么是DOM

  • DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API
  • 大白话:DOM是浏览器提供的一套专门用来 操作网页内容 的功能

1.2DOM树介绍

9fd75e8dd9ed4e12b982084e7b000379.png

  • DOM树直观的体现了标签与标签之间的关系
  • DOM树本质是一个对象

二、DOM对象的获取

2.1 DOM对象

浏览器根据html标签生成的 JS对象

2.1.1 DOM对象的核心思想

  • 把网页内容当做对象来处理
  • 所有的HTML标签属性都可以在这个对象上面找到
  • 修改这个对象的属性会自动映射到标签身上

2.2 document对象

  • 是 DOM 里提供的一个对象
  • 所以它提供的属性和方法都是用来访问和操作网页内容的
  • 例:document.write()
  • 网页所有内容都在document对象里面

2.3 获取DOM对象

2.3.1获取第一个DOM对象

const 变量 = document.querySelector('css选择器')

点击超链接查看官方的定义    document.querySelector

参数:包含一个或多个有效的CSS选择器 字符串

返回值:

  • 获取成功 CSS选择器匹配的第一个元素,一个 HTMLElement对象
  • 获取失败 null

注意点:

类选择器 记得加 .  id选择器 记得加 #

const 变量名 = document.querySelectorAll('css选择器')

举个例子

0ba8795bf6224dfd85c3ef084f098f31.png

控制台查看(注意看是只有第一个div)

97370679e9ba414abcea7b7f99a9ad94.png

2.3.2获取多个DOM对象

const 变量名 = document.querySelectorAll('css选择器')

点击超链接查看官方的定义    document.querySelectorAll

参数:包含一个或多个有效的CSS选择器 字符串

返回值:

获取成功 得到 一个 伪数组(后面会介绍) 数组元素是 dom 对象

  • 获取失败 空数组

注意点:

  • 类选择器 记得加 .
  • id选择器 记得加 #

举个例子

2a418492098444d3ac72240f7c0d3b89.png

控制台查看

16578a273d71438d8e800fa80ccffefc.png

以下是DOM获取多个元素的源码

<!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>
</head>
<body>
  <div>001</div>
  <div>002</div>
  <div>003</div>
  <script>
    // 获取成功
    // 注意点:选择器里面不是写变量
    const divs = document.querySelectorAll('div')
    console.log(divs);
  // 访问里面的元素
    for(let i=0;i<divs.length;i++){
console.log(divs[i]);
    }
  </script>
</body>
</html>

2.4 拓展 伪数组介绍

伪数组具有数组的样子,有数组的长度属性。不可以对数组进行追加/删除等等操作

三、innerHTML与innerText的区别

innerHTML可解析标签

d29ef3021cc3496a94571551d09acf7f.png

innerText无法解析标签纯文本显示

87d4165d3de8433ab866f7e171293832.png

针对上述知识的综合案例

年会抽奖

<!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>
    .wrapper {
      width: 840px;
      height: 420px;
      background: url(./images/bg01.jpg) no-repeat center / cover;
      padding: 100px 250px;
      box-sizing: border-box;
    }
  </style>
</head>
<body>
  <div class="wrapper">
    <strong>年会抽奖</strong>
    <h1>一等奖:<span id="one">???</span></h1>
    <h3>二等奖:<span id="two">???</span></h3>
    <h5>三等奖:<span id="three">???</span></h5>
  </div>
  <script>
const arr = ['张飞','赵云','刘备','关羽','马超']
const spans =document.querySelectorAll('span')
// console.log(index);
for(let i =0;i<spans.length;i++){
  const index =getRandom(0,arr.length-1)
  // const Res=arr[index] 错误
  // 与spans产生关联
  spans[i].innerHTML=arr[index]
  arr.splice(index,1)
}
// 随机函数
function getRandom(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
}
  </script>
</body>
</html>

四、className与classList的区别

3.1 className(一次只能修改一个,会覆盖)

const 变量 = dom对象.className
dom对象.className = '新的值'
// 比如:
dom对象.className = 'aa'  // 将元素的class修改为 aa
dom对象.className = 'aa bb'  // 将元素的class属性修改为 aa bb

3.2 className(可以解决会覆盖的问题)

常用三种方法:

3.2.1 添加类名

dom对象.classList.add('类名')

3.2.2 删除类名

dom对象.classList.remove('类名')

2.2.3 切换类名(如果标签里面没有这个类名就添加,有则移除)

dom对象.classList.toggle('类名')

来个综合案例:轮播图刷新

需求:1. 刷新浏览器 随机显示 图片

<!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>
    * {
      box-sizing: border-box;
    }
    .slider {
      width: 560px;
      height: 400px;
      overflow: hidden;
    }
    .slider-wrapper {
      width: 100%;
      height: 320px;
    }
    .slider-wrapper img {
      width: 100%;
      height: 100%;
      display: block;
    }
    .slider-footer {
      height: 80px;
      background-color: rgb(100, 67, 68);
      padding: 12px 12px 0 12px;
      position: relative;
    }
    .slider-footer .toggle {
      position: absolute;
      right: 0;
      top: 12px;
      display: flex;
    }
    .slider-footer .toggle button {
      margin-right: 12px;
      width: 28px;
      height: 28px;
      appearance: none;
      border: none;
      background: rgba(255, 255, 255, 0.1);
      color: #fff;
      border-radius: 4px;
      cursor: pointer;
    }
    .slider-footer .toggle button:hover {
      background: rgba(255, 255, 255, 0.2);
    }
    .slider-footer p {
      margin: 0;
      color: #fff;
      font-size: 18px;
      margin-bottom: 10px;
    }
    .slider-indicator {
      margin: 0;
      padding: 0;
      list-style: none;
      display: flex;
      align-items: center;
    }
    .slider-indicator li {
      width: 8px;
      height: 8px;
      margin: 4px;
      border-radius: 50%;
      background: #fff;
      opacity: 0.4;
      cursor: pointer;
    }
    .slider-indicator li.active {
      width: 12px;
      height: 12px;
      opacity: 1;
    }
  </style>
</head>
<body>
  <div class="slider">
    <div class="slider-wrapper">
      <img src="./images/slider01.jpg" alt="" />
    </div>
    <div class="slider-footer">
      <p>对人类来说会不会太超前了?</p>
      <ul class="slider-indicator">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
      </ul>
      <div class="toggle">
        <button class="prev">&lt;</button>
        <button class="next">&gt;</button>
      </div>
    </div>
  </div>
  <script>
    // 1. 初始数据
    const sliderData = [
      { url: './images/slider01.jpg', title: '对人类来说会不会太超前了?', color: 'rgb(100, 67, 68)' },
      { url: './images/slider02.jpg', title: '开启剑与雪的黑暗传说!', color: 'rgb(43, 35, 26)' },
      { url: './images/slider03.jpg', title: '真正的jo厨出现了!', color: 'rgb(36, 31, 33)' },
      { url: './images/slider04.jpg', title: '李玉刚:让世界通过B站看到东方大国文化', color: 'rgb(139, 98, 66)' },
      { url: './images/slider05.jpg', title: '快来分享你的寒假日常吧~', color: 'rgb(67, 90, 92)' },
      { url: './images/slider06.jpg', title: '哔哩哔哩小年YEAH', color: 'rgb(166, 131, 143)' },
      { url: './images/slider07.jpg', title: '一站式解决你的电脑配置问题!!!', color: 'rgb(53, 29, 25)' },
      { url: './images/slider08.jpg', title: '谁不想和小猫咪贴贴呢!', color: 'rgb(99, 72, 114)' },
    ]
    // 1. 刷新浏览器 随机显示 图片
    // 1.1 准备随机函数
    // 1.2 将数组的 0下标作为 随机数的最小值 将数组的最大下标作为 随机数的最大值
    // 1.3 根据下标获取数组里面的元素
    // 1.4 获取对应的url属性 
    // 1.5 获取目标元素 img 标签
    // 1.6 给 img 的 src 属性赋值
    // 1.2 将数组的 0下标作为 随机数的最小值 将数组的最大下标作为 随机数的最大
    const index = getRandom(0, sliderData.length - 1)
    // 1.3 根据下标获取数组里面的元素
    const obj = sliderData[index]
        // 1.4 获取对应的url属性 
    const url = obj.url
        // 1.5 获取目标元素 img 标签
    // 1.6 给 img 的 src 属性赋值
    document.querySelector('img').src = url
    // 颜色属性
const color = obj.color
const footer=document.querySelector('.slider-footer')
// dom对象.style.属性
footer.style.backgroundColor=color
//字
const words =obj.title
//  获取p标签
const p =document.querySelector('p')
// 往p标签中写入新的内容用innerHTML
p.innerHTML=words
//不可
// console.log(P.innerHTML);
// 添加小圆点
const lis = document.querySelectorAll('li')
// 这个index的随机性共同作用在url与小圆点中,随机的下标都是一样的
lis[index].classList.add('active')
    // 随机函数
    function getRandom(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
    }
  </script>
</body>
</html>

五、定时器setInterval & clearInterval

每隔一段时间需要自动执行一段代码,不需要我们手动去触发,比如倒计时功能

setInterva开启方法:

setInterval(执行的程序, 间隔的时间)

写法1

5e62c481211f4afd8302c1dccdc1d884.png

控制台查看

bcf930a292f8418fa9409411c4e05361.png

写法2(了解)

05fb63cd7e684353aa5f6a9a176362c7.png

注意点:

  • 执行的程序,一般要用一个函数
  • 间隔的时间,单位是毫秒  (1秒 = 1000毫秒)
  • 注意:如果执行的程序是具名函数,不要加小括号,直接写函数名

 clearInterval关闭方法:

let intervalID = setInterval(执行的程序, 间隔的时间)
clearInterval(intervalID)

返回值:intervalID 是一个非零数值,用来标识通过 setInterval() 创建的定时器,这个值可以用来作为 clearInterval() 的参数来清除对应的定时器

571739a2e678407696f7aa0c6040503b.png

开启后就看到了计时器停止了

f01f285ab2cc40ab985bb02e34d4f6f9.png



相关文章
|
10天前
|
缓存 JavaScript 前端开发
深入浅出:使用Node.js构建RESTful API
【9月更文挑战第3天】在数字化浪潮中,后端开发如同搭建一座连接用户与数据的桥梁。本文将带领读者从零开始,一步步用Node.js搭建一个功能完备的RESTful API。我们将探索如何设计API的结构、处理HTTP请求以及实现数据的CRUD操作,最终通过一个简单的实例,展示如何在真实世界中应用这些知识。无论你是初学者还是有一定经验的开发者,这篇文章都会为你揭示后端开发的奥秘,让你轻松入门并掌握这一技能。
32 3
|
14天前
|
JavaScript 前端开发
JavaScript 与 DOM 交互
【9月更文挑战第01天】
16 2
|
14天前
|
JavaScript NoSQL API
深入浅出:使用Node.js构建RESTful API
【8月更文挑战第31天】本文将引导读者了解如何利用Node.js搭建一个高效、易于扩展的RESTful API。通过简单易懂的语言和逐步深入的内容组织,我们将一起探索Node.js在后端开发中的实际应用,包括环境配置、路由设计、数据处理与连接数据库等关键步骤。文章末尾,你将获得完整的项目代码示例,助你快速启动自己的API项目。
|
14天前
|
JavaScript 前端开发 API
深入浅出:使用Node.js搭建RESTful API的实践之旅
【8月更文挑战第31天】本文将带你踏上一次Node.js的探险之旅,通过实际动手构建一个RESTful API,我们将探索Node.js的强大功能和灵活性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的实践经验和深刻的技术洞见。
|
20天前
|
编解码 JavaScript 前端开发
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
39 1
|
21天前
|
JavaScript 前端开发 中间件
深入浅出Node.js:从零开始构建RESTful API
【8月更文挑战第24天】在数字化时代的浪潮中,后端开发作为支撑现代网络服务的骨架,扮演着至关重要的角色。本文将通过Node.js这一高效灵活的JavaScript运行环境,引领你步入后端开发的神秘世界。我们将从基础概念出发,逐步深入到实战操作,最终构建一个功能完备的RESTful API。无论你是编程新手还是前端开发者,这篇文章都将为你揭示后端开发的奥秘,让你轻松掌握使用Node.js进行API开发的实用技巧。
|
24天前
|
JSON JavaScript 前端开发
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
|
1月前
|
存储 JavaScript API
Node.js中的异步API
【8月更文挑战第16天】
26 1
|
12天前
|
JSON JavaScript 中间件
深入浅出Node.js: 从零开始构建RESTful API
【8月更文挑战第34天】 在数字时代的浪潮中,掌握如何构建高效、可靠的后端服务是每一位开发者的必备技能。本文将通过浅显易懂的语言和实际代码示例,带领初学者走进Node.js的世界,一步步搭建起自己的RESTful API。无论你是编程新手,还是想扩展技术栈的老手,这篇文章都将是你的良师益友。让我们一起探索Node.js的魅力,开启后端开发之旅!
|
14天前
|
JSON JavaScript 中间件
深入浅出Node.js: 从零开始构建RESTful API
【8月更文挑战第31天】 在数字时代的浪潮中,掌握如何构建高效、可靠的后端服务是每一位开发者的必备技能。本文将通过浅显易懂的语言和实际代码示例,带领初学者走进Node.js的世界,一步步搭建起自己的RESTful API。无论你是编程新手,还是想扩展技术栈的老手,这篇文章都将是你的良师益友。让我们一起探索Node.js的魅力,开启后端开发之旅!