从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 ...
随机推荐
- SpringMVC 学习笔记(五) 基于RESTful的CRUD
1.1. 概述 当提交的表单带有_method字段时,通过HiddenHttpMethodFilter 将 POST 请求转换成 DELETE.PUT请求,加上@PathVariable注解从而实现 ...
- Java 编码 UTF-8
近期在处理文件时发现了相同类型的文件使用的编码可能是不同的.所以想将文件的格式统一一下(由于UTF-8的通用性,决定往UTF-8统一),遇见的第一个问题是:怎样查看现有文件的编码方式. 文件编码问题集 ...
- LeetCode_Mysql_Second Highest Salary
176. Second Highest Salary 1. 问题描写叙述: 写一个sql语句从 Employee 表里获取第二高位的工资. 2. 解决思路: 这道题非常easy,就当热身了.首先用ma ...
- 基于OAS设计可扩展OpenAPI
前言 随着互联网行业的兴起,开发模式已逐步转换为微服务自治:小团队开发微服务,然后通过Restful接口相互调用.开发者们越来越渴望能够使用一种“官话”进行流畅的沟通,甚至实现多种编程语言系统的自动化 ...
- Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决
Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi 最近用E ...
- 今天要查一下,如果没有密保手机的号码在使用,怎么更换qq的密保手机
本来我是想是使用284来作为foxmail的一个记事本账号,但是需要验证130的手机,这是以前使用的手机,现在不能接受该短信了,得反馈下.
- luogu3941入阵曲
https://www.zybuluo.com/ysner/note/1301562 题面 统计在给出的\(n*m\)矩阵中,有多少个不同的子矩形中的数字之和是\(k\)的倍数? 解析 切不掉这道题是 ...
- linux shell 实例1
UI项目删除“UIL”文件中的无用字串: 脚本需要制定UIL文件目录位置&无用字串的txt文件,如删除海尔目录下的无用字串: ./delete_uil_string.sh ./haier/UI ...
- CentOS下实现Flask + Virtualenv + uWSGI + Nginx部署
一.项目简介 在本文中,将一步一步搭建一个简单的Flask + Virtualenv + uWSGI + Nginx 架构的Web服务,可以作为新手的学习也可作为记录备忘. 如果你安装好了环境并有一定 ...
- 14_传智播客iOS视频教程_OC的数据类型
对比一下OC和C差别,首先第一个是数据类型. C语言的数据类型分哪几类?C语言有哪些数据类型? 基本数据类型当然还包括int的一些修饰符.像short.long.long long.unsigned. ...