getElementBy系列

  • document.getElementsByTagName('tag');

  • document.getElementById('id');

  • document.getElementsByClassName('class');

常见的获取元素的方法有3种,分别是通过元素ID、通过标签名字和通过类名字来获取。
getElementById方法,这个方法将返回一个与之对应id属性的节点对象,它是document对象特有的函数,只能通过其来调用该方法,使用方法如下:document.getElementById('idName');

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

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

querySelector和querySelectorAll

querySelector() 方法返回匹配指定 CSS 选择器元素的第一个子元素 。 该方法只返回匹配指定选择器的第一个元素。

如果要返回所有匹配元素,需要使用 querySelectorAll() 方法替代.

不同的是 querySelector返回的是一个对象,querySelectorAll返回的一个集合(NodeList)。

querySelector和querySelectorAll的参数必须是符合 css selector 的字符串:它传入的字符串中第一个字符不能是数字.

代码实例:

document.querySelector("body");  //返回body节点
document.querySelector("#k");  //返回id为k的节点
document.querySelector("#k span");  //返回id为k的节点下的第一个span节点
document.querySelector("#k").querySelector("span");  //返回id为k的节点下的第一个span节点 document.querySelectorAll("li");  //返回所用tagName为li的节点集合(NodeList)
document.querySelectorAll("div .li");  //返回class为li的div

性能对比

原理

querySelectorAll比getElementBy系列速度慢
因为querySelectorAll返回一个静态的NodeList(深克隆)
getElementBy系列返回一个动态的实时变化的NodeList(HTMLCollection)(浅克隆,每次都返回一个指针)
所以querySelectorAll会降低性能
什么叫静态的?
意思是指选出的所有元素的数组,不会随着文档操作而改变。

用querySelector操作元素示例如下:
HTML代码:

    <ul>
<li>111</li>
<li>222</li>
<li>333</li>
</ul>
var ul=document.querySelector('ul');
var list=ul.querySelectorAll('li');
for(var i=0;i<list.length;i++){
ul.appendChild(document.createElement('li'));
}//这个时候就创建了3个新的li,添加在ul列表上。
console.log(list.length) //输出的结果仍然是3,不是此时li的数量6

反观getElement方法

        var ul=document.getElementsByTagName('ul')[0];
var list=ul.getElementsByTagName('li');
for(var i=0;i<5;i++){
ul.appendChild(document.createElement('li'));
}
console.log(list.length)//此时输出的结果就是3+5=8

所以我们现在应该可以很直观的分别出两者的区别,当然本身两种方法还有兼容性方面的区别。另外这两种方法都不能查找伪类元素。

测试结果

测试得到节点集合的数据:

console.time('querySelectorAll');
for (var i = 0; i < 10000; i++) {
document.querySelectorAll(".menu-top");
}
console.timeEnd('querySelectorAll');
//querySelectorAll: 1781ms console.time('getElementsByClassName');
for (var i = 0; i < 10000; i++) {
document.getElementsByClassName("menu-top");
}
console.timeEnd('getElementsByClassName');
//getElementsByClassName: 54ms

得到集合时间对比相差巨大。可是现在主流框架,比如jquery,手机上的框架jqmobi等内部实现查找元都是使用的querySelector等方法,性能低的方法被使用唯一理由就是它用着方便

总结

在使用的时候getElement这种方法性能比较好,query选择符则比较方便.

  • 得到的元素不是需要很麻烦的多次getElementBy..的话,尽量使用getElementBy..,因为他快些。
  • 得到的元素需要很麻烦的多次getElementBy..组合才能得到的话使用querySelector,方便。
  • 看实际情况,你决定方便优先还是性能优先,

参考:

https://blog.csdn.net/levinhax/article/details/71274456

https://www.imooc.com/article/13027

https://www.jianshu.com/p/421f6d0a9419

https://blog.csdn.net/hualimeme/article/details/44410895

querySelector与getElementBy系列的区别的更多相关文章

  1. querySelector与getElementBy等的区别

    获取元素DOM对象有很多种方法,以前一直在用getElementById和getElementsByTagName等,现在对这些方法和querySelector做一个总结. 常见的获取元素的方法有3种 ...

  2. getElementBy系列和querySelector系列的区别

    querySelector和querySelectorAll的用法和getElementBy大致一样,获取的时候带上符号,getElementBy获取的是元素的动态集合,querySelector获取 ...

  3. querySelectorAll 方法相比 getElementsBy 系列方法区别

    最近有人问到querySelectorAll 方法相比 getElementsBy 系列方法区别,一时没想起来说些什么,今天查下文档,总结一下它们的区别,以便自己理解. 1. W3C 标准queryS ...

  4. 8、16、32-BIT系列单片机区别与特点

    一.8位单片机 8031/8051/8751是Intel公司早期的产品 1.8031的特点 8031片内不带程序存储器ROM,使用时用户需外接程序存储器和一片逻辑电路373,外接的程序存储器多为EPR ...

  5. getElementsBy 系列方法相比querySelector系列的区别

    最近在做的项目中,使用querySelectorAll获取了同class名的元素后,绑定onmouseover事件和onmouseout后,多次在几个元素上移入移出操作时,控制台出现了报错的问题,最后 ...

  6. querySelector与getElementBy的区别

    1,querySelector() 方法返回匹配指定 CSS 选择器元素的第一个子元素 . 该方法只返回匹配指定选择器的第一个元素.如果要返回所有匹配元素,需要使用 querySelectorAll( ...

  7. querySelector和getElementById方法的区别

    一.querySelector() 的定义 querySelector() 方法选择指定 CSS 选择器的第一个元素 querySelectorAll() 方法选择指定的所有元素 二.与 getEle ...

  8. querySelector和getElementById之间的区别

    一.概述 今天在看js的时候发现里面的代码基本上都是用querySelector()和querySelectorAll()来获取元素,就有点疑惑为什么不用getElementById(),可能也是因为 ...

  9. 浅谈querySelector和getElementById之间的区别

    前言: 最近学到前端一些知识,看到很多视频上许多老师都用的是querySelector而部分老师用的是getElementById,我就很疑惑,这两有啥区别,都是选择器,于是百度了一下明白了,quer ...

随机推荐

  1. redis String 命令

    今天在虚拟机的Ubuntu上装了一个redis,学习redis的一些基本东西,在数据类型的时候,看到redis的,String,hash,set list zset,对String的setbit命令一 ...

  2. iOS 更新日志 - 持续更新中

    本文只是为了简单记录一下每个正式版本发布时间和更新内容,只有这个初衷,从2019年9月25日开始,将会持续更新. iOS 13.1 - 2019年9月25日 iOS 13.1 iOS 13.1 包括错 ...

  3. Redis集群搭建详细过程整理备忘

    三.安装配置 1.环境 使用2台centos服务器,每台机器上部署3个实例,集群为三个主节点与三个从节点: 192.168.5.144:6380 192.168.5.144:6381 192.168. ...

  4. Java中将字符串转为驼峰格式

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:Java中将字符串转为驼峰格式: 使用CaseUtils 对Java字符串进行转换为驼峰格式: CaseUtils.toCamelCas ...

  5. sshd配置文件详解

    [root@test ~]# cat /etc/ssh/sshd_config # $OpenBSD: sshd_config,v // :: reyk Exp $ # This is the ssh ...

  6. 最小费用最大流——EK+SPFA

    终于把最小费用最大流学会了啊-- 各种奇奇怪怪的解释我已经看多了,但在某些大佬的指点下,我终于会了. 原来是个好水的东西. 最小费用最大流是什么? 不可能不知道网络流吧?如果不知道,自行百度去-- 费 ...

  7. Python开发利器Pycharm

    可以新建项目的时候,在下面的小扳手那里创建虚拟化环境.若想安装包,直接file->setting里面找到对应项目,然后添加新的包即可.   视频地址:http://edu.51cto.com/c ...

  8. CF1140F - Extending Set of Points

    题意:对于点集S,定义函数F(S)为对S不断扩展到不能扩展时S的点数.一次扩展定义为如果有一个平行于坐标轴的矩形的三个点在S中,则第四个点加入S. 动态在S中加点删点,每次操作完后求F(S)的值. 解 ...

  9. 用 vue 脚手架 vue-cli 初始化(新建)项目

    前提:已经安装 node.js 和 git 1.在需要创建的文件夹中,右击 -> Git  Bush Here ,然后输入命令 vue init webpack "文件名"( ...

  10. 【MFC学习笔记】菜单和工具栏

    1 菜单栏 1.1 在对话框中加入菜单: 打开Resource View资源视图, *.rc文件—Add Resources —Menu,即可加入菜单. 注:①菜单项中含有“...”表示点击后会弹出对 ...