• querySelector和getElementById之间的区别


    一、概述

      今天在看js的时候发现里面的代码基本上都是用querySelector()和querySelectorAll()来获取元素,就有点疑惑为什么不用getElementById(),可能也是因为自己没用过那两个,所以并不清楚原因所在。

      参考手册上写querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素,并且其语法document.querySelector(CSS selectors)接收的参数,可以指定一个或多个匹配元素的 CSS 选择器,可以使用它们的 id, 类, 类型, 属性, 属性值等来选取元素,对于多个选择器,使用逗号隔开,返回一个匹配的元素。

      而且既然都可以实现元素的获取,而且都可以通过id、类等等来获取,为什么我们时常用的都是getElementById(),getElementsByClassName()而非那两个?

    二、有关getElement(s)Byxxxx的用法

      (1)getElementById()

      该方法将返回一个与之对应id属性的节点对象,它是document对象特有的函数,只能通过其来调用该方法。

       (2)getElementsByTagName()

      该方法返回一个对象数组(是HTMLCollection集合),返回元素的顺序是它们在文档中的顺序,传递给 getElementsByTagName() 方法的字符串可以不区分大小写。
      如下:

    (3)getElementsByClassName()

      该方法来获取指定class名的元素,该方法返回文档中所有指定类名的元素集合,作为 NodeList 对象。NodeList 对象代表一个有顺序的节点列表。NodeList 对象 我们可通过节点列表中的节点索引号来访问列表中的节点(索引号由0开始), 所以有时使用时要指定下标。

    三、有关querySelector()和querySelectorAll()的用法

    (一)querySelector()

      方法返回匹配指定 CSS 选择器元素的第一个子元素 。 返回指定元素节点的子树中匹配选择器的集合中的第一个元素,如果没有匹配返回null。如果要返回所有匹配元素,需要使用 querySelectorAll() 方法替代.
      由于querySelector是按css规范来实现的,所以它传入的字符串中第一个字符不能是数字。

    (二)querySelectorAll()

      按文档顺序返回指定元素节点的子树中匹配选择器的元素集合(NodeList),如果没有匹配返回空集合。
      如下:

    四、两者区别及相应示例代码

      一般说的都是getElement(s)Byxxxx获取的是动态集合,querySelector获取的是静态集合。不知道别人对这句话是不是看了就明白它们的区别,我是在写了相关代码才get到。

      示例:(1)

    <body>
    <ul id="box">
        <li class="a">测试1</li>
        <li class="a">测试2</li>
        <li class="a">测试3</li>
    </ul>
    </body>
    <script type="text/javascript">
    //获取到ul,为了之后动态的添加li
        var ul = document.getElementById('box');
    //获取到现有ul里面的li
        var list = ul.getElementsByTagName('li');
         for(var i =0;i<list.length;i++){
            ul.appendChild(document.createElement('li')); //动态追加li
        }
    </script>

      上述代码会陷入死循环,主要是红色背景的那个循环条件,因为在第一次获取到里面的3个li后,每当你往ul里添加了新元素后,list便会更新其值,从新获取ul里的所有li。也就是getElement(s)Byxxxx获取的是动态集合,它总会随着dom结构的变化而变化。

      也就是说每一次调用list都会重新对文档进行查询,导致无限循环的问题

      示例:(1)修改

    一般说的都是getElement(s)Byxxxx获取的是动态集合,querySelector获取的是静态集合。不知道别人对这句话是不是看了就明白它们的区别,我是在写了相关代码才get到。
    <body>
    <ul id="box">
        <li class="a">测试1</li>
        <li class="a">测试2</li>
        <li class="a">测试3</li>
    </ul>
    </body>
    <script type="text/javascript">
    //获取到ul,为了之后动态的添加li
        var ul = document.getElementById('box');
    //获取到现有ul里面的li
        var list = ul.getElementsByTagName('li');
         for(var i =0;i<4;i++){
            ul.appendChild(document.createElement('li')); //动态追加li
        }
    console.log(list.length); //7
    </script>

      将for循环条件修改后,新在ul里添加了4个元素,所有现在打印出来的长度为7。

    示例:(2) 

    <body>
    <ul id="box">
        <li class="a">测试1</li>
        <li class="a">测试2</li>
        <li class="a">测试3</li>
    </ul>
    </body>
    <script type="text/javascript">
    //获取到ul,为了之后动态的添加li
         var ul = document.querySelector('ul');
    //获取到现有ul里面的所有li
         var list = ul.querySelectorAll('li');
         for(var i = 0;i<list.length;i++){
             ul.appendChild(document.createElement('li'));//动态追加li
         }
    console.log(list.length); //输出的结果仍然是3,不是此时li的数量6
    </script>

      上述代码静态集合体现在.querySelectorAll('li')获取到ul里所有li后,不管后续再动态添加了多少li,都是不会对其参数影响。

    五、浏览器兼容性及两者的性能

    (待补....)

    
    
  • 相关阅读:
    python全栈闯关--16-匿名函数
    python全栈闯关--15-内置函数
    python全栈闯关--14-生成器进阶
    示例库
    MySQL的远程连接
    前后端传输编码方式
    后端接收前端时间参数
    控制器接参的空值问题
    MyBatis模糊查询的几种方式
    MySQL常用函数
  • 原文地址:https://www.cnblogs.com/songForU/p/10913649.html
Copyright © 2020-2023  润新知