在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1. 概述在看代码的时候发现基本上都是用 querySelector() 和 querySelectorAll() 来获取元素,疑惑为什么不用 getElementById()。 1.1 querySelector() 和 querySelectorAll() 的用法querySelector() 方法
querySelectorAll() 方法
1.2 getElement(s)Byxxxx 的用法getElementById() 方法
getElementsByTagName() 方法
getElementsByClassName() 方法
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 这个循环条件。 示例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> 示例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>
为什么要这样设计呢?
我们再看看在 Chrome 上面是个什么样的情况:
HTMLCollection 在 W3C 的定义如下:
实际上,HTMLCollection 和 NodeList 十分相似,都是一个动态的元素集合,每次访问都需要重新对文档进行查询。 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 对象会包含文档中的所有节点,如 Element、Text 和 Comment 等; 2.2 接收的参数不同querySelectorAll 方法接收的参数是一个 CSS 选择符; var c1 = document.querySelectorAll('.b1 .c'); var c2 = document.getElementsByClassName('c'); var c3 = document.getElementsByClassName('b2')[0].getElementsByClassName('c'); 注意:querySelectorAll 所接收的参数是必须严格符合 CSS 选择符规范的 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+ 支持 ; 2.4 querySelector 属于 W3C 中的 Selectors API 规范 ,而 getElementsBy 系列属于 W3C 的 DOM 规范参考文章 (侵删) 到此这篇关于JavaScript中 querySelector 与 getElementById 方法的区别的文章就介绍到这了,更多相关js中 querySelector 与 getElementById 方法内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论