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



相关文章
|
4月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
25天前
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
43 10
|
3月前
|
JSON 缓存 JavaScript
深入浅出:使用Node.js构建RESTful API
在这个数字时代,API已成为软件开发的基石之一。本文旨在引导初学者通过Node.js和Express框架快速搭建一个功能完备的RESTful API。我们将从零开始,逐步深入,不仅涉及代码编写,还包括设计原则、最佳实践及调试技巧。无论你是初探后端开发,还是希望扩展你的技术栈,这篇文章都将是你的理想指南。
|
3月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
2月前
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
71 12
|
3月前
|
JavaScript 前端开发 API
Vue.js 3:深入探索组合式API的实践与应用
Vue.js 3:深入探索组合式API的实践与应用
|
3月前
|
JavaScript NoSQL API
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发如同一座灯塔,指引着数据的海洋。本文将带你航行在Node.js的海域,探索如何从一张白纸到完成一个功能完备的RESTful API。我们将一起学习如何搭建开发环境、设计API结构、处理数据请求与响应,以及实现数据库交互。准备好了吗?启航吧!
|
3月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
87 5
|
3月前
|
JavaScript 前端开发 API
Vue.js 3:探索组合式API带来的新变革
Vue.js 3:探索组合式API带来的新变革
|
3月前
|
JavaScript 前端开发 API
Vue.js 3中的Composition API:提升你的组件开发体验
Vue.js 3中的Composition API:提升你的组件开发体验