获取元素的几种方式以及注意事项、className和classList的差异和某种错误的尝试分析解决

770 阅读3分钟

获取元素的方式

document.querySelector()和doucument.querySelectorAll()的区别

作用:

document.querySelector()获取文档中满足条件的第一个元素节点,返回的是整个标签

例:

获取第一个满足条件id节点document.querySelector('#id')
获取第一个满足条件class节点document.querySelector('.class')
获取第一个满足条件tag节点document.querySelector('tag')

document.querySelectorAll()获取文档中满足条件的所有元素节点,返回的是伪数组,获取的是伪数组,无法直接操作,必须通过下标才能操作,所以我们对伪数组进行遍历for和forEach

例:

获取所有满足条件id节点document.querySelectorAll('#id')
获取所有满足条件class节点document.querySelectorAll('.class')
获取所有满足条件tag节点document.querySelectorAll('tag')

区别:

一、

  1. document.querySelector()返回的是整个标签
  2. document.querySelectorAll()返回的是伪数组

二、

  1. document.querySelector()获取的元素可以直接操作
  2. document.querySelectorAll()获取的元素是一个伪数组,需要遍历进行操作

三、

  1. document.querySelector()获取不到的元素返回null
  2. document.querySelectorAll()获取不到元素返回一个空伪数组 注意:常见的报错

1、document.querySelector()获取元素不成功

image.png

image.png

不能够 读取 属性 使用 null 读取 style, 一般就是因为元素获取不成功,返回了null

2、

image.png

image.png

Cannot set properties of undefined (setting 'color'):不能使用undefined设置属性color, 因为document.querySelectorAll()返回的是伪数组它是一个对象,当你.style相等于访问里style当中的元素,如果找不到就返回undefined,然后你再用undefined设置属性color就会报错。

总结

  1. 访问一个未定义的对象: *** is not defined
  2. 访问一个对象不存在的属性,返回undefined

其他获取元素的方法

  1. document.getElementById()获取符合条件的第一个id元素
  2. document.getElementsByTagName()获取符合条件的tag标签,以伪数组的方式返回
  3. document.getElementsByClassName()获取符合条件的class,以伪数组的方式返回

属性的分类

一般来说属性有两种:内置属性、自定义属性

常规标签内置属性

  1. div p span: id class name style
  2. a: href
  3. img: src alt title
  4. input: type max min maxlength value id name class

设置和修改元素内容innerText和innerHTML

作用:

  1. innerText: 只关注内容, 不关注标签
  2. innerHTML:可以解析标签

使用场所:

  1. 如果要解析标签内容,就使用innerHTML,动态渲染、富文本框
  2. 不明确数据的安全性的情况下, 使用innerText

注意: innerText和innerHTML为标签设置标签之间的内容,针对于双标签而言

className和calssList的区别

一、className:会覆盖掉原来的类名 二、classList中有四种方法:

  1. add(在当前类添加一个或多个类名)
  2. remove(移除元素节点中的特定类名)
  3. toggle(元素节点中类名切换)
  4. contains(判断元素节点中类名是否存在,存在就返回true,否则返回false);

className用于单类名修改和移除,如果有多类名在其中不推荐使用,因为会覆盖掉原来因有的类名从而造成样式破坏。

classList就比较灵活比较符合日常开发需求。

例如:

html和js

<body>
    <button>添加一个字体大小样式</button>
    <button class="second">移除一个字体大小样式</button>
    <button>切换一个字体大小样式</button>
    <button>判断元素是否有某个样式</button>
    <p class="red">我是百变p元素</p>

    <script>
      let p = document.querySelector('p')

      let btn1 = document.querySelector('button')
      let btn2 = document.querySelector('.second')
      let btn3 = document.querySelector('button:nth-of-type(3)')
      let btn4 = document.querySelectorAll('button')[3]

      btn1.addEventListener('click', function() {
        // classList.add:在经之前的样式的基础之上新增一个新的样式类名,“不影响”元素之前的样式
        // p.classList.add('新样式类名')
        // 参数不用再添加.标记了,因为它只能对类名样式进行处理
        p.classList.add('size50', 'underline')
      })

      btn2.addEventListener('click', function() {
        // classList.remove:移除指定名称的样式,不影响元素其它的样式类名
        p.classList.remove('size50')
      })

      btn3.addEventListener('click', function() {
        // classList.toggle:切换元素的样式,如果没有就添加,如果有就移除
        p.classList.toggle('size50')
      })

      btn4.addEventListener('click', function() {
        // classList.contains:判断当前元素是否包含某个指定名称的样式,如果有就返回true,如果没有返回false
        let flag = p.classList.contains('size50')
        console.log(flag)
      })
    </script>
  </body>

css

 <style>
      .red {
        color: red;
      }
      .size50 {
        font-size: 50px;
      }
      .underline {
        text-decoration: underline;
      }
    </style>

小案例

随机点名.gif

半成品轮播图

轮播图半成品小案例.gif

全选和单选案例三种方法

全选和反选案例.gif

详细代码:juejin.cn/post/705486…