js: WebAPI+DOM+定时器

133 阅读4分钟

Web API 基本认知

作用: 就是使用 JS 去操作 html 和浏览器

分类:DOM (文档对象模型)、BOM(浏览器对象模型)

1649257181697

DOM

DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API。

白话文:DOM是浏览器提供的一套专门用来 操作网页内容 的功能

DOM作用: 开发网页内容特效和实现用户交互。

DOM树

  1. 将 HTML 文档以树状结构直观的表现出来,我们称之为文档树或 DOM 树

  2. 描述网页内容关系的名词

  3. 作用:文档树直观的体现了标签与标签之间的关系

1649257440608

DOM对象

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

  1. 所有的标签属性都可以在这个对象上面找到

  2. 修改这个对象的属性会自动映射到标签身上

DOM的核心思想:把网页内容当做对象来处理

document 对象:

  1. 是 DOM 里提供的一个对象

  2. 所以它提供的属性和方法都是用来访问和操作网页内容的

    例:document.write()

  3. 网页所有内容都在document里面

获取dom对象

根据CSS选择器来获取DOM元素

选择匹配的第一个元素

语法:

document.querySelecto('css选择器')

参数:

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

返回值:

css选择器匹配的第一个元素,一个HTMLElement对象

如果没有匹配到,则返回null.

选择匹配的多个元素

语法:

document.querySelectorAll('css选择器')

参数:

包含一个或多个有效的css选择器 字符串

返回值:

css选择器匹配的NodeList 对象集合

例如:

document.querySelectorAll('ul li')

得到的是一个伪数组

  1. 有长度有索引号的数组
  2. 但是没有 pop() push()等数组方法

想要得到里面的每一个对象,则需要遍历(如for)的方式获得

其他获取DOM元素方法

1649380057623

修改DOM元素内容

DOM对象都是根据标签生成的,所以操作标签,本质上就是操作DOM对象。就是操作对象使用的语法。

document.write()

只能将文本内容追加到 前面的位置 文本中包含的标签会被解析

1649381063161

元素.innerText 属性

将文本内容添加/更新到任意标签位置 文本中包含的标签不会被解析

1649381126635

元素.innerHTML 属性

将文本内容添加/更新到任意标签位置 文本中包含的标签会被解析

1649381185522

修改元素属性

修改元素常用属性

  1. 还可以通过 JS 设置/修改标签元素属性,比如通过 src更换 图片
  2. 最常见的属性比如: href、title、src 等

语法:

1649381271745

举例:

1649381965139

页面刷新,图片随机更换案例

<!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>
    <h2> <img src="./images/1.jpg" alt=""></h2>
    <script>
        let name = ['./images/1.jpg', './images/2.jpg', './images/3.jpg', './images/4.png'],
            world = document.querySelector('img');


        let a = Math.round(Math.random() * (name.length - 1) + 0);
        world.src = name[a];
    </script>
</body>

</html>

修改元素样式属性

还可以通过 JS 设置/修改标签元素的样式属性。

  1. 比如通过 轮播图小圆点自动更换颜色样式
  2. 点击按钮可以滚动图片,这是移动的图片的位置 left 等等

1.通过 style 属性操作CSS

语法:

1649382292719

        let a = document.querySelector('div');
        a.style.backgroundColor = 'red';
        a.style.height = '100px';
        a.style.width = '100px';
        a.style.fontSize = '30px';
        a.style.textAlign = 'center';
        a.style.lineHeight = '100px'

注意:

  1. 修改样式通过style属性引出
  2. 如果属性有-连接符,需要转换为小驼峰命名法
  3. 赋值的时候,需要的时候不要忘记加css单位

2.操作类名(className) 操作CSS

如果修改的样式比较多,直接通过style属性修改比较繁琐,我们可以通过借助于css类名的形式。

语法:

<!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>
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }
        
        .color {
            height: 200px;
            width: 200px;
            background-color: #4A00E0;
            margin: 100px auto;
        }
        
        .fz {
            font-size: 28px;
            color: red;
            text-align: center;
            line-height: 200px;
            border-radius: 50%;
        }
    </style>
</head>

<body>
    <div>123</div>
    <script>
        let a = document.querySelector('div');
        //增加类名,改变样式,会覆盖div原有样式
        a.className = 'color fz'
    </script>
</body>

</html>

注意:

  1. 由于class是关键字, 所以使用className去代替
  2. className是使用新值换旧值, 如果需要添加一个类,需要保留之前的类名

3.通过 classList 操作类控制CSS

为了解决className 容易覆盖以前的类名,我们可以通过classList方式追加和删除类名

<!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>
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }
        
        .d1 {
            width: 300px;
            background-color: blue;
        }
        
        .d2 {
            height: 300px;
            background-color: skyblue;
        }
        
        .d3 {
            border-radius: 50px;
            background-color: red;
        }
        
        .d4 {
            margin: 100px auto;
            text-align: center;
        }
    </style>
</head>

<body>
    <div>456</div>
    <script>
        let a = document.querySelector('div');
        //增加类名
        a.classList.add('d1', 'd2', 'd3', 'd4');
        //删除类名
        a.classList.remove('d1');
        //切换类名
        a.classList.toggle('d1')
    </script>
</body>

</html>

修改 表单元素 属性

表单很多情况,也需要修改属性,比如点击眼睛,可以看到密码,本质是把表单类型转换为文本框

正常的有属性有取值的 跟其他的标签属性没有任何区别

  1. 获取: DOM对象.属性名
  2. 设置: DOM对象.属性名 = 新值

1649418606079

<!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>
    input表单:<input type="text" class="input"> 复选框:<input type="checkbox" class="check">
    <button>选中</button>
    <select>
    <option>北京</option>
    <option>广州</option>
    <option>重庆</option>
    <option class="option">上海</option>
</select>
    <script>
        let ip = document.querySelector('.input');
        //修改表单的值
        ip.value = 'ok';

        let checkbox = document.querySelector('.check');
        //复选框的选中为 对象.属性=true,取消选中 对象.属性=false
        checkbox.checked = true;

        let btn = document.querySelector('button');
        //按钮禁用:对象.属性=true,启用:对象.属性=false
        btn.disabled = false;

        let option = document.querySelector('.option');
        //下拉菜单启用:对象.selected=true,禁用:对象.selected=false
        option.selected = true;
    </script>
</body>

</html>

定时器

开启定时器

1649419200015

作用:每隔一段时间调用这个函数

间隔时间单位是毫秒

   setInterval(function name(params) {
            console.log('hello');
        }, 1000);

关闭定时器

1649419320682

注意:

函数名字不需要加括号

定时器返回的是一个id数字

60秒倒计时案例

 	let i = 60;
        let timeId = setInterval(function() {
            document.body.innerHTML = `${i}`
            i--
            if (i === -1) {
                i = 60
            }
        }, 1000)