我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS中 querySelector 与 getElementById 方法区别

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS中 querySelector 与 getElementById 方法区别

1. 概述

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

1.1 querySelector() 和 querySelectorAll() 的用法

querySelector() 方法

定义:querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素;

注意:uerySelector() 方法仅返回匹配指定选择器的第一个元素。如果你需要返回所有的元素,请用 querySelectorAll() 方法替代;

语法:document.querySelector(CSS selectors);

参数值:String  必须。指定一个或多个匹配元素的 CSS 选择器。使用它们的 id, 类, 类型, 属性, 属性值等来选取元素。
        对于多个选择器,使用逗号隔开,返回一个匹配的元素。
返回值:  匹配指定 CSS 选择器的第一个元素。 如果没有找到,返回 null。如果指定了非法选择器则 抛出 SYNTAX_ERR 异常。

querySelectorAll() 方法

定义:   querySelectorAll() 方法返回文档中匹配指定 CSS 选择器的所有元素,返回 NodeList 对象;
         NodeList 对象表示节点的集合。可以通过索引访问,索引值从 0 开始;

提示:    可使用 NodeList 对象的 length 属性来获取匹配选择器的元素属性,然后遍历所有元素,从而获取想要的信息;

语法:   elementList = document.querySelectorAll(selectors);
      elementList 是一个静态的 NodeList 类型的对象;
         selectors 是一个由逗号连接的包含一个或多个 CSS 选择器的字符串;

参数值:  String  必须。指定一个或多个匹配 CSS 选择器的元素。可以通过 id, class, 类型, 属性, 属性值等作为选择器来获取元素。
   多个选择器使用逗号(,)分隔。

返回值:   一个 NodeList 对象,表示文档中匹配指定 CSS 选择器的所有元素。 
   NodeList 是一个静态的 NodeList 类型的对象。如果指定的选择器不合法,则抛出一个 SYNTAX_ERR 异常。

1.2 getElement(s)Byxxxx 的用法

getElementById() 方法

定义:  getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用。
  如果没有指定 ID 的元素返回 null;
  如果存在多个指定 ID 的元素则返回第一个;
  如果需要查找到那些没有 ID 的元素,你可以考虑通过CSS选择器使用 querySelector();

语法: document.getElementById(elementID);

参数值: String 必须。元素ID属性值。
返回值:  元素对象 指定ID的元素

getElementsByTagName() 方法

定义:   getElementsByTagName() 方法可返回带有指定标签名的对象的集合;
提示:   参数值 "*" 返回文档的所有元素;
语法: document.getElementsByTagName(tagname)
参数: String 必须  要获取元素的标签名;
返回值: NodeList 对象 指定标签名的元素集合

getElementsByClassName() 方法

定义: getElementsByClassName() 方法返回文档中所有指定类名的元素集合,作为 NodeList 对象。
  NodeList 对象代表一个有顺序的节点列表。NodeList 对象 可通过节点列表中的节点索引号来访问表中的节点(索引号由0开始)。
提示:  可使用 NodeList 对象的 length 属性来确定指定类名的元素个数,并循环各个元素来获取需要的那个元素。
语法:  document.getElementsByClassName(classname)
参数:  String 必须 需要获取的元素类名。  多个类名使用空格分隔,如 "test demo";
返回值: NodeList 对象,表示指定类名的元素集合。元素在集合中的顺序以其在代码中的出现次序排序。

2. 区别

2.1 getElement(s)Byxxxx 获取的是动态集合,querySelector 获取的是静态集合

动态就是选出的元素会随文档改变,静态的不会 取出来之后就和文档的改变无关了。

示例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>

上述代码会陷入死循环,i < list.length 这个循环条件。
因为在第一次获取到里面的 3 个 li 后,每当往 ul 里添加了新元素后,list便会更新其值,重新获取ul里的所有li。
也就是 getElement(s)Byxxxx 获取的是动态集合,它总会随着 dom 结构的变化而变化。
也就是每一次调用 list 都会重新对文档进行查询,导致无限循环的问题。

示例1 修改:

将 for 循环条件修改为 i < 4,结果 在 ul 里新添加了4个元素,所有现在插入的 li 标签数量是7。


<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">
  var ul = document.getElementById('box');

  var list = ul.getElementsByTagName('li');
  for(var i = 0; i < 4; i++){
    ul.appendChild(document.createElement('li'));
  }
  console.log('list.length:',list.length);
</script>

JavaScriptquerySelector getElementById 方法的区别_javascript

示例2:

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


<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">
  var ul = document.querySelector('ul');

  var list = ul.querySelectorAll('li');
  for(var i = 0; i < list.length; i++){
    ul.appendChild(document.createElement('li'));
  }
  console.log('list.length:',list.length); //输出的结果仍然是 3,不是此时 li 的数量 6
</script>

JavaScriptquerySelector getElementById 方法的区别_javascript_02

为什么要这样设计呢?

在 W3C 规范中对 querySelectorAll 方法有明确规定:

The NodeList object returned by the querySelectorAll() method must be static ([DOM], section 8).

我们再看看在 Chrome 上面是个什么样的情况:


document.querySelectorAll('a').toString();    // return "[object NodeList]"
document.getElementsByTagName('a').toString();    // return "[object HTMLCollection]"

HTMLCollection 在 W3C 的定义如下:

An HTMLCollection is a list of nodes. An individual node may be accessed by either ordinal index or the node's name or id attributes.Note: Collections in the HTML DOM are assumed to be live meaning that they are automatically updated when the underlying document is changed.

实际上,HTMLCollection NodeList 十分相似,都是一个动态的元素集合,每次访问都需要重新对文档进行查询。
区别:HTMLCollection 属于 Document Object Model HTML 规范,而 NodeList 属于 Document Object Model Core 规范。

这样说有点难理解,看看下面的例子会比较好理解:


var ul = document.getElementsByTagName('ul')[0],
    lis1 = ul.childNodes,
    lis2 = ul.children;
console.log(lis1.toString(), lis1.length);    // "[object NodeList]" 11
console.log(lis2.toString(), lis2.length);    // "[object HTMLCollection]" 4

NodeList 对象会包含文档中的所有节点,如 ElementText Comment 等;
HTMLCollection 对象只会包含文档中的 Element 节点;
另外,HTMLCollection 对象比 NodeList 对象 多提供了一个 namedItem 方法;
因此在浏览器中,querySelectorAll 的返回值是一个静态的 NodeList 对象,而 getElementsBy 系列的返回值实际上是一个 HTMLCollection 对象 。

2.2 接收的参数不同

querySelectorAll 方法接收的参数是一个 CSS 选择符;
getElementsBy 系列接收的参数只能是单一的 classNametagName name


var c1 = document.querySelectorAll('.b1 .c');
var c2 = document.getElementsByClassName('c');
var c3 = document.getElementsByClassName('b2')[0].getElementsByClassName('c');

注意:querySelectorAll 所接收的参数是必须严格符合 CSS 选择符规范的
下面这种写法,将会抛出异常(CSS 选择器中的元素名,类和 ID 均不能以数字为开头)。


try {
  var e1 = document.getElementsByClassName('1a2b3c');
  var e2 = document.querySelectorAll('.1a2b3c');
} catch (e) {
  console.error(e.message);
}
console.log(e1 && e1[0].className);
console.log(e2 && e2[0].className);

2.3 浏览器兼容不同

querySelectorAll 已被 IE 8+、FF 3.5+、Safari 3.1+、Chrome 和 Opera 10+ 支持 ;
getElementsBy 系列,以最迟添加规范中的 getElementsByClassName 为例,IE 9+、FF 3 +、Safari 3.1+、Chrome 和 Opera 9+ 都已经支持;

到此这篇关于JavaScript中 querySelector 与 getElementById 方法区别的文章就介绍到这了,更多相关JavaScript中 querySelector 与 getElementById 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS中 querySelector 与 getElementById 方法区别

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript中querySelector与getElementById方法的区别是什么

这篇文章主要介绍“JavaScript中querySelector与getElementById方法的区别是什么”,在日常操作中,相信很多人在JavaScript中querySelector与getElementById方法的区别是什么问题
2023-06-25

java中类与方法的区别

什么是类?类是对象的模子,具有相同属性和方法的一组对象的集合,类是不存在的,是用来描述对象信息。在计算机的世界里面,计算机关注的事数据信息,我们描述数据信息的时候一定要要描述数据类型,对象就是具体的数据信息,类是信息的数据类型。什么是方法?在java中,方法就
java中类与方法的区别
2014-06-01

JS中Require与Import区别是什么

本篇内容主要讲解“JS中Require与Import区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS中Require与Import区别是什么”吧!require 和 import对比
2023-07-05

java中类方法与对象方法的区别

类方法和对象方法的区别如下:1、对象方法必须用对象调用,类方法必须用类来调用2、对象方法中可以直接访问属性(成员变量),类方法中不可以直接访问属性(成员变量)3、类方法和对象方法可以进行相互调用3.1对象方法中可以直接调用类方法3.2类方法中间接调用对象方法
java中类方法与对象方法的区别
2021-04-22

java中类方法与实例方法的区别

一、类方法类方法是静态方法,前面需要有static修饰符修饰。类方法内不能涉及有关变量的内容。1、不能调用类的对象方法2、不能引用对象变量3、类方法不能被重写(覆盖)4、类方法不能使用super, this关键字二、实例方法1、可以调用类的对象方法2、可以引用
java中类方法与实例方法的区别
2020-02-10

js中prompt与window.prompt的区别是什么

在JavaScript中,`prompt`和`window.prompt`是相同的,都是用于显示一个对话框,让用户输入一段文本并返回输入的值。`window.prompt`是`prompt`方法的全局方法。所以,`prompt`和`wind
2023-08-19

js中slice与splice的区别是什么

在JavaScript中,slice()和splice()是两个数组方法,它们有不同的功能和用法。1. slice()方法:- slice()方法返回一个新的数组,包含从原数组中选择的元素。- 它接受两个参数,分别是起始索引和结束索引(可选
2023-08-08

在js中prompt与window.prompt有什么区别

在JavaScript中,prompt和window.prompt是相同的。window.prompt是window对象的一个方法,而prompt是window.prompt的简写形式。两者都用于显示一个对话框,提示用户输入信息,并返回用户
2023-08-21

JS中call(),apply(),bind()函数的区别与用法详解

这篇文章主要介绍了JS中call(),apply(),bind()函数的高级用法详解,需要的朋友可以参考下
2022-12-10

JS中Require与Import区别对比分析

这篇文章主要为大家介绍了JS中Require与Import区别对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-02

java中静态方法与实例方法的区别

静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。 静态方法在访问本类的成员时,只允许访问静态成员(即静态
java中静态方法与实例方法的区别
2021-03-20

java中方法引用与方法调用的区别

方法引用:方法引用返回的是接口的实现 。 private static Iterable itToIterable(Stream stream) { return stream::iterator; //编译通过此处返回的是Iterable
java中方法引用与方法调用的区别
2018-03-02

java中start方法与run方法有什么区别

本篇文章给大家分享的是有关java中start方法与run方法有什么区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、Li
2023-06-14

thinkphp中m方法与d方法有哪些区别

本篇内容介绍了“thinkphp中m方法与d方法有哪些区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!thinkphp中m方法与d方法的区
2023-06-22

编程热搜

目录