博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
querySelector与getElementBy系列的区别
阅读量:5313 次
发布时间:2019-06-14

本文共 2910 字,大约阅读时间需要 9 分钟。

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代码:

  • 111
  • 222
  • 333
var ul=document.querySelector('ul'); var list=ul.querySelectorAll('li'); for(var i=0;i

反观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: 1781msconsole.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

 

转载于:https://www.cnblogs.com/amcy/p/10119308.html

你可能感兴趣的文章
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
Swagger简单介绍
查看>>
Python数据分析入门案例
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
Linux 中【./】和【/】和【.】之间有什么区别?
查看>>
内存地址对齐
查看>>
看门狗 (监控芯片)
查看>>
css背景样式
查看>>
JavaScript介绍
查看>>
开源网络漏洞扫描软件
查看>>
yum 命令跳过特定(指定)软件包升级方法
查看>>
创新课程管理系统数据库设计心得
查看>>
Hallo wolrd!
查看>>
16下学期进度条2
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
Chapter 3 Phenomenon——12
查看>>