一、getElementsByTagName方法:

我们先看几个解释:
1)W3C:
getElementsByTagName() 方法可返回带有指定标签名的对象的集合。没有说明返回值的具体类型。
2)菜鸟教程:
getElementsByTagName() 方法可返回带有指定标签名的对象的集合。明确指出返回值的是一个NodeList 对象

3)MDN:
getElementsByTagName() 方法返回一个动态的包含所有指定标签名的元素的HTML集合 HTMLCollection

这里有个问题了,NodeList与HTMLCollection有什么区别,getElementsByTagName()方法返回的到底是什么?菜鸟教程和MDN的说法哪个准确(笑)

二、NodeList VS HTMLCollection

相同点:
1) 它们都有length属性
2) 都有元素的getter,叫做item,可以传入索引值取得元素。
3) 都是类数组
不同点:
(1)NodeList
一个节点的集合,既可以包含元素和其他节点(注释节点、文本节点等)。
(2)HTMLCollection
元素集合, 只有Element

除此之外,HTMLCollection还有一个nameItem()方法,可以返回集合中name属性和id属性值的元素。(部分浏览器也支持NodeList的nameItem()方法)
什么DOM方法返回NodeList,什么方法返回HTMLCollection?

三、2种方法由什么方法产生?
NodeList对象是由childNodes属性,querySelectorAll方法返回的一组节点的集合。由childNodes属性返回的NodeList对象是一个动态的集合(live collection), 而由querySelectorAll方法返回的则是一个静态的集合(static collection)。
HTMLCollection由getElementsByTagName等方法产生。HTMLCollection一组有序(in document order基于文档结构顺序)的动态集合。会随着DOM树的变化自动更新自身。

四、一道面试题:
MDN解释:
getElementsByTagName:指定的元素的子树会被搜索,不包括元素自己。返回的列表是动态的,这意味着它会随着DOM树的变化自动更新自身。所以,使用相同元素和相同参数时,没有必要多次的调用Element.getElementsByTagName() .
看一道面试题:

document.getElementsByTagName("td") 与 $("td")的共同点和区别?
1.他们返回的都是类数组对象,都可以通过for循环遍历。具体地说,前者返回一个HTMLCollection,后者$("td")是一个Jquery对象。
2.document.getElementsByTagName("td") 返回的是动态的DOM结构,DOM发生变化,结果也会变化;$("td")返回的是静态的,是jquery选择器方法执行时的结果。
关于第二点,可以写个例子:

<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script
src="https://code.jquery.com/jquery-2.2.4.js"
integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI="
crossorigin="anonymous"></script>
<script type="text/javascript">
var liHTMLCollection = document.getElementsByTagName('li');
var liJqueryObject = $('li');
console.log(liHTMLCollection);
console.log(liJqueryObject); window.setTimeout(()=>{
//移除第一个li
liJqueryObject[0].remove();
//再次打印
console.log(liHTMLCollection);//变成2个
console.log(liJqueryObject);//还是3个
},1000)
</script>
</body>

  

参考资料:

1.HTMLCollection与NodeList

2.MDN

3.Difference between HTMLCollection, NodeLists, and arrays of objects

最新文章

  1. 关于SQL注入和如何防止
  2. jQuery Ajax传递数组到asp.net web api参数为空
  3. iOS开发小技巧--即时通讯项目:消息发送框(UITextView)高度的变化; 以及UITextView光标复位的小技巧
  4. javascript对象模型和function对象
  5. 例题:计算运费。c#语言基础,比较简单。看代码输入格式和方法。同样方法可以做一个 出租车打车的程序
  6. 向html中添加节点
  7. 课堂所讲整理:HTML--7JavaScript的DOM操作
  8. 【Tomcat源码学习】-1.概述
  9. react 的五脏六腑ing~
  10. HDOJ2002-计算球体面积
  11. maven学习之三
  12. C++对象模型的那些事儿之一:对象模型(上)
  13. maven-assembly-plugin打包可执行的jar包
  14. 查看oracle当前的连接数
  15. C. Queen Codeforces Round #549 (Div. 2) (搜索)
  16. ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn&#39;t supported yet………
  17. 支持续传功能的ASP.NET WEB API文件下载服务
  18. webrtc学习: 部署stun和turn服务器
  19. python第二天 列表、元组
  20. Python itsdangerous 生成token和验证token

热门文章

  1. 本地调用jni之VC++无法导入问题
  2. (工具类)Linux笔记之终端日志记录工具script
  3. C++中使用Json的方法
  4. Linux环境部署(一)
  5. WEB安全实战(四)关于 Cookie
  6. JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法
  7. JBOSS和EJB学习一
  8. 第五课 Struts的控制器【续】Action类的execute()方法
  9. ubuntu tftp【转】
  10. 【NOIP 2016】初赛-完善程序 &amp; 参考答案