Web APIs---DOM-获取DOM元素、修改属性

137 阅读3分钟

Web API 基本认知

作用和分类

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

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

什么是DOM

DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API,也就是浏览器提供的一套专门用来 操作网页内容 的功能,作用是开发网页内容特效和实现用户交互

DOM树

将 HTML 文档以树状结构直观的表现出来,我们称之为文档树或 DOM 树,可以让我们更直观的了解标签与标签之间的关系

image-20220405131128957

DOM对象

浏览器根据html标签生成的 JS对象,所有的标签属性都可以在这个对象上面找到,当我们修改这个对象的属性时,会自动映射到标签身上

获取DOM对象

获取单个dom元素

  1. 语法
document.querySelector('css选择器')

//  只能获取第一个满足条件的标签
//  可以 css选择器 位置填写一个或多个有效的选择器 字符串
  1. 返回值

如果选择器找不到dom元素,querySelector 只会返回 null

获取多个dom元素

  1. 语法
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>
    <script>

        // 语法:document.querySelectorAll 获取所有的li标签,并返回一个数组
        let list = document.querySelectorAll('li')
        // 打印数组内容
        console.log(list);

        // 遍历数组
        for (let index = 0; index < list.length; index++) {
            // list[index] dom 元素

            // 文本
            list[index].innerText = '这个是' + index
        }
    </script>
</body>
  1. 返回值

如果选择器找不到dom元素,querySelectorAll 只会返回 一个空数组

  1. 思考:querySelectorAll() 方法获取到的元素能直接修改吗? 如果不能可以怎么做到修改?

不可以, 只能通过遍历的方式。依次给里面的元素做修改

设置/修改DOM元素内容

3种实现在标签中写动态设置文本写法及区别

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>

    <script>
     /* 
     1 document.write 只能在body标签中写,作用及功能较弱,只能显示

     2 innerText 只能设置文本,不能解析HTML字符串/标签

     3 innerHTML 既能设置文本又能解析HTML字符串/标签 
     */

     document.querySelector('li:nth-child(7)').innerText = '<button>随便改</button>' //原样输出<button>随便改</button>

     document.querySelector('li:nth-child(8)').innerHTML = '<button>随便改</button>' //生成按钮
    </script>
</body>

设置/修改DOM元素属性

常用属性

通过 JS 设置/修改标签元素属性,比如:href、title、src 等

<body>
    <a href="https://www.baidu.com/"></a>
    <img src="" alt="">
    <script>
    // 语法:对象.属性 = '需要修改的值'
    // 修改dom元素属性的方式:dom.属性名=属性值
    // 这里属性指的是  a标签里面的href img里面的src等等这些

    // 获取dom元素
    let aDom = document.querySelector('a')
    
    // 修改a标签的属性
    aDom.href = 'https://m.weibo.cn/'
    </script>
</body>

样式属性

  1. 通过 style 属性操作CSS
<body>
    <p>你过来呀</p>

    <script>
        // 语法;对象.tyle.css样式属性='属性值'
        // 获取dom元素
        let p = document.querySelector('p')
        // 修改
        // 赋值的时候,需要的时候不要忘记加css单位
        p.style.fontSize = '100px'

        p.style.color = 'red'

        // 如果属性有-连接符,需要转换为小驼峰命名法
        p.style.fontWeight = '700'

    </script>
</body>
  1. 操作类名(className) 操作CSS

如果修改的样式比较多,直接通过style属性修改比较繁琐,我们可以通过借助于css类名的形式。因为class在JS属于是关键字, 所以要使用className去代替

    <style>
        .box {
            width: 400px;
            height: 400px;
            margin: 100px auto;
            background-color: pink;
        }

        .top {
            border-radius: 50%;
            background-color: aqua;
        }
    </style>
</head>
<div></div>
<body>
    <script>
        /* 
        className 的特点
        会先清空这个dom的元素 旧的所有的类 然后再添加新的类

        如果想要添加多个 class 在两个类名之间用空格隔开即可
        */

        //用JS的方式来动态添加这个class
        let div = document.querySelector('div')
        div.className = 'box top'
    </script>
  1. 通过 classList 操作类控制CSS

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

    <style>
        .s1 {
            height: 500px;
            background-color: aqua;
        }
        .s2 {
            width: 800px;
        }

        .s3 {
            background-color: pink;
        }

        .s4 {
            border-radius: 50%;
        }
    </style>
<body>

    <div class="s1"></div>
    <script>
        // 获取dom元素
        let div = document.querySelector('div')
        // 添加一个类class
        div.classList.add('s2')
        // 添加多个类
        div.classList.add('s2','s3','s4')

        // 单独制定移除一个class
        div.classList.remove('s4')

        // 切换  如果本来就有,那我就移除,如果本来没有,那我就添加
        div.classList.toggle('s3')
    </script>
</body>

表单元素属性

什么时候会用到修改表单元素属性?比如,输入密码的时候,输入时隐藏,点击眼睛时显示

语法及使用

<body>
    <input type="text" class="username" />
    是否同意协定
    <input type="checkbox" class="isarg" checked />

    <button class="code" disabled>发送验证码</button>

    <select class="sel">
      <option>去泰国</option>
      <option>去非洲</option>
      <option>去印度</option>
      <option>去啊富汗</option>
    </select>

    <!-- <textarea>  你好 </textarea> -->
    <textarea> </textarea>

    <script>
        // innerText/HTML 主要用来设置双标签的文本内容

        // 获取表单dom元素 类名username
        let username = document.querySelector('.username')
        // 设置文本内容
        // username.innerText = '我的用户名'; 这是无效的
        username.value = '我的用户名'  //正确写法

        // 复选框
        let isarg = document.querySelector('.isarg')
        isarg.checked = false //表示不选定  true 选定

        // 按钮
        let code = document.querySelector('.code')
        // 设置点击的禁用和启用  disabled
        code.disabled = false //表示不禁用

        // 下拉菜单 select
        let option = document.querySelector('option:nth-child(3)')
        // 注意 selected 的单词拼
        option.selected = true 

        // 文本域textarea
        // 属于表单元素,又是双标签
        let textarea = document.querySelector('textarea')

        // 获取文本域中的值
        console.log(textarea.value); //输出 <h1>你好</h1>
        console.log(textarea.innerText); //无法输出
        console.log(textarea.innerHTML); //输出&lt;h1&gt;你好&lt;/h1&gt;

        // value 和 innerHTML的区别
        // value 原样获取内容
        // innerHTML 获取的内容如果包含html 会转译代码
    </script>
</body>

定时器-间歇函数

定时器函数介绍

网页中经常会需要一种功能:每隔一段时间需要自动执行一段代码,而不需要我们手动去触发,例如:网页中的倒计时

image-20220405144613472

定时器函数基本使用

  1. 开启定时器
<body>
    <script>
        // 通常写法
      function name() {
          console.log('你的头发多');
      }  
      setInterval(name,2000)

    //   常用写法
        setInterval(function(){
            console.log('头发都没了');
        },1000)
    </script>
</body>
  1. 关闭/清楚定时器

一般不会刚创建就停止,而是满足一定条件再停止

<body>
    
    <script>
        // 开启了一个定时器会返回定时器ID 这个ID数是随机的 一般情况下不做理会
        let timeId = setInterval(function (params) {
            console.log('吃饭时间');
        },1000)

        // 清除定时器,一般需要根据某个条件来清除
        clearInterval(timeId)

        // 案例练习
            let index = 0
        let timeId1 =  setInterval(function () {
            index++
            console.log(`跑了${index}圈`);
            // 判断是否满足条件
            if (index === 20) {
                clearInterval(timeId)
            }

        },100)
    </script>
</body>

综合案例

倒计时

<body>
    <button></button>

    <script>

        let tiems = 60

        // 获取dom元素
        let btn = document.querySelector('button')

        setInterval(function () {
            // console.log(times);先输出打印看看是否达到我们想要的效果
            // 修改button里面的文本内容
            btn.innerText = times
            times--
            // 当times=0的时候  重新设置为60
            if (times === -1) {
                times = 60
            }
        },100)
    </script>

轮播图

<body>
    <img src="" alt="">
    <script>
        
        // 声明一个递增递减的变量
        let i = 1

        // 计时器
        setInterval(function () {
            // console.log(i);
            // 获取dom元素
            let img = document.querySelector('img')
            // 让src的图片,随着递增而变化
            img.src = `./images/b0${i}.jpg`
            i++
            // 判断条件
            if (i === 10) {
                // 如果i到了10,就让i倒回1,重新循环
                i = 1
            }
        },1000)
    </script>
</body>