从Element.getElementsByTagName方法说起
一、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>
参考资料:
2.MDN
3.Difference between HTMLCollection, NodeLists, and arrays of objects
从Element.getElementsByTagName方法说起的更多相关文章
- getElementsByTagName() 方法
HTML DOM Document 对象 定义和用法 getElementsByTagName() 方法可返回带有指定标签名的对象的集合. 语法 document.getElementsByTagNa ...
- (三)学习JavaScript之getElementsByTagName方法
参考:http://www.w3school.com.cn/jsref/met_doc_getelementsbytagname.asp HTML DOM Document 对象 定义和用法 getE ...
- IE浏览器getElementsByTagName方法的兼容问题
今天发现了一个非常可笑的IE兼容问题,环境是IE8,调用getElementsByTagName方法搜索元素,结果集居然自动识别元素的id作为键名,去掉元素定义id才能按正常的数字索引返回. 因为网页 ...
- document.getElementsByTagName()方法的返回值
在阅读<JS DOM 编程一书>一书时,看到getElementByTagName函数返回值为数组,然后自己验证了下,发现不是数组,而是一个可遍历的HTMLCollection对象 HTM ...
- javascript 原生得到document.Element的方法
今天这里写这个博客的主要目的是记录一下javascript原生的选择dom的集中方法. 1.document.getElementById.这个方法接收1个参数,就是DOM元素的id(区分大小写),这 ...
- document,element,node方法
document方法: getElementById(id) 返回指定结点的引用 getElementsByTagName_r(name) ...
- LeetCode 169. Majority Element解题方法
题目: Given an array of size n, find the majority element. The majority element is the element that ap ...
- 玩转DOM遍历——用NodeIterator实现getElementById,getElementsByTagName方法
先声明一下DOM2中NodeIterator和TreeWalker这两类型真的只是用来玩玩的,因为性能不行遍历起来超级慢,在JS中基本用不到它们,除了<高程>上有两三页对它的讲解外,谷歌的 ...
- Python+Selenium之cannot focus element 解决方法
有时候刚进入页面输入第一个值时脚本会报错:cannot focus element 贴下我的脚本和解决办法供大家参考 我原本的脚本是: WebDriverWait(driver,15,0.5).unt ...
随机推荐
- oracle 11g GRID 中 关于 OLR 须要知道的一些内容
oracle 11g GRID 中 关于 OLR 须要知道的一些内容 1.检查olr 的状态: [root@vmrac1 ~]# ocrcheck -local Status of Oracle ...
- JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中
处理JSON字符串时,一直出错,写个样例后发现原来是没有弄清楚数据的格式问题. 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News package lyx.ent ...
- 2014阿里巴巴WEB前端实习生在线笔试题
2014年3月31日晚,我怀着稍微忐忑的心情(第一次在线笔试^_^!!)进行了笔试.阿里巴巴的笔试题共同拥有10道,差点儿包括了Web前端开发的各个方面,有程序题.有叙述题.时间很紧张,仅仅完毕了大概 ...
- JavaScript基础 -- DOM
一.DOM全称 文档对象模型(Document Object Model) 二.DOM是什么 DOM可以说是制作动态页面的强有力工具.DOM不是JavaScript语言的一部分,而是内置在浏览器中的一 ...
- ReSharper warns: “Static field in generic type”
http://stackoverflow.com/questions/9647641/resharper-warns-static-field-in-generic-type It's fine to ...
- Killer Problem(暴力)
题意: 给定一个序列,每次询问l到r之间两个数差的绝对值的最小值. 分析: 开始以为是线段树离线处理,实际暴力就好! #include <map> #include <set> ...
- [ACM]2013山东省“浪潮杯”省赛 解题报告
题目地址:http://acm.upc.edu.cn/problemset.php?page=13 2217~2226 A.Rescue The Princess 一个等边三角形告诉前2个点,求逆时 ...
- Java多线程系列五——列表类
参考资料: http://xxgblog.com/2016/04/02/traverse-list-thread-safe/ 一些列表类及其特性 类 线程安全 Iterator 特性 说明 Vect ...
- Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我
前言 相比于 Django 的 ORM ,SQLAlchemy "不依靠外键进行跨表联查" 的解决方案就比较多. 没啥好说的,只能怪自己学艺不精.. _(:з」∠)_ 解决办法 ...
- codechef : TREDEG , Trees and Degrees
其实有原题,生成树计数 然鹅这题里面是两道题, 50pts 可以用上面那题的做法直接过掉,另外 50pts 要推推式子,搞出 O n 的做法才行(毕竟多项式常数之大您是知道的) 虽说这道题里面是没有 ...