获取DOM元素方法小结

在开发中不可避免的需要操作DOM,现在就来总结一下原生的获取DOM的API。

getElementById()

该方法是最常用的通过元素的id属性来获取DOM元素的API,返回一个DOM元素

<body><div id="div">我是div</div><script type="text/javascript">var div = document.getElementById("div");console.log(div); // 打印一个DOM元素</script>    
</body>

getElementById() 只能在HTMLDocument类型的实例(document对象)上调用,并不能在元素上使用该方法。

<body><div id="div">我是div<p id="p">我是p</p></div><script type="text/javascript">var div = document.getElementById("div");var p = div.getElementById("p"); // 报错了 div上并没有getElementById方法</script>
</body>

其实仔细想来也可以理解,元素具有id属性的值在页面上是唯一的(符合标准的话,写多个相同id也拦不住),所以在document下查找具有该id的元素和在某个元素下查找具有该id的元素是一样的。

getElementsByTagName()

通过标签名获取DOM元素的一个集合,该集合的类型是HTMLCollection,并且该方法可以在DOM元素上调用

<body><div id="div"><p>我是p1</p><p>我是p2</p></div><script type="text/javascript">var div = document.getElementById("div");var pCol = document.getElementsByTagName("p"); // 返回具有两个p元素的HTMLCollection集合var pCol1 = div.getElementsByTagName("p"); // 返回具有两个p元素的HTMLCollection集合</script>
</body>

关于HTMLCollection:是一个元素的集合,是有生命的会呼吸的,该集合并不是一个快照,一个死的,它是会变化的。与之类似的较为熟悉的集合还有NodeList和NamedNodeMap。

<script type="text/javascript">for(var i = 0; i < pCol.length; i++){div.appendChild(document.createElement("p"));}
</script>

以上代码会出现无限循环。若pCol是当时的一个快照上面的循环应该只循环两次。因为pCol这个HTMLCollection集合是会变化的。当添加一个p元素到div元素中pCol元素集合就增加了一个元素,length也随之增加,这样永远不会满足 i >= pCol.length 的条件,所以出现了无限循环。

而是一个活的会呼吸的集合的不只有HTMLCollection一个,其中较为熟悉的有NodeList和NamedNodeMap。

注:可以使用一个变量存一下pCol.length就不会出现这种情况了。

getElementsByName()

该方法很少用,但是在操作表单的时候还是有用武之处的。通过元素名来获取DOM元素集合(NodeList类型 ),并且只能在document对象上调用

<body><form id="form"><input type="radio" name="sex" value="0"/><input type="radio" name="sex" value="1"/></form><script type="text/javascript">var input = document.getElementsByName("sex"); // 返回一个NodeList类型的集合有两个input标签</script>
</body>

注:高程上说该方法返回的HTMLCollection集合,但是通过chrome,Firefox,Safari测试返回的类型都是NodeList。

querySelector()和querySelectorAll()

querySelector()通过合法的CSS选择器来获取DOM元素(只会获取第一个匹配的元素),如果传入不合法的CSS选择符该方法会报错(包括下面的querySelectorAll()方法也会因为不正确的选择符报错),该方法可以在元素上调用

<body><div id="div"><p class="p" name="p">p1</p><p id="p" name="p">p2</p></div><script type="text/javascript">var div = document.querySelector("#div"); // 第一个一个id为div的div元素var p = document.querySelector("p"); // 第一个一个p元素var p1 = div.querySelector("p[name='p']"); // 第一个具有name属性,并且值为p的p元素</script>
</body>

querySelectorAll()同样通过合法的CSS选择器来获取元素,只是返回的是所有符合条件的元素,而不是第一个符合条件的元素,所以返回的是一个NodeList类型的DOM元素集合。但是这个NodeList集合和上面所说的活的,会呼吸的NodeList不一样,通过querySelectorAll()方法获取的只是一个快照,并不会动态改变。该方法同样可以在元素上调用

<script type="text/javascript">var ps = document.querySelectorAll("p");for(var i=0; i<ps.length; i++){document.body.appendChild(document.createElement("p"));}
</script>

上面只是在body末尾添加了两个p元素,并没有无限循环下去。

getElementsByClassName()

千呼万唤始出来的一个原生API,在这个API出来之前就被各种实现了,当然就性能上来说当然原生的好。

返回一个HTMLCollection的DOM元素集合,并且可以在元素上调用

<body><div id="div"><p class="p">p1</p><p class="p">p2</p></div><script type="text/javascript">var div = document.getElementById("div");var ps = div.getElementsByClassName("p"); // 返回 一个HTMLCollection集合</script>
</body>

属性

除了通过以上的方法获取DOM元素或元素集合外还可以通过DOM元素的属性来获取DOM元素和元素集合。

childNodes // NodeList类型
childdren // HTMLCollection类型
firstChild
lastChild
previousSibling
nextSibling
previousElementSibling
nextElementSibling
firstElementChild
lastElementChild

以下集合都是HTMLCollection类型

document.images 所有的img标签集合
document.anchors 所有具有name特性的a标签集合
document.links 所有具有link特性的a标签集合
document.forms 所有form标签集合

NodeList和HTMLCollection的区别

我的理解很简单就是NodeList是节点的集合HTMLCollection是元素节点的集合。NodeList中可能包含HTML元素之外的节点比如文本节点,但是HTMLCollection只会包含HTML元素节点。

HTMLCollection有NamedItem() 方法而NodeList没有

<body><div id="div"><p>p1</p><p>p2</p><p>p3</p></div><script type="text/javascript">var div = document.querySelector("#div");var childs = div.childNodes; // 一个NodeList集合console.log(childs);for(var i = 0, len = childs.length; i < len; i++){console.log(childs[i].nodeType, childs[i].nodeName) // 会打印出 3 “#text” 表示是文本节点}var children = div.children; // 一个HTMLCollection集合console.log(children);for(var i = 0, len = children.length; i < len; i++){console.log(children[i].nodeType, children[i].nodeName) // 并没有打印出 3 “#text” 只出现了 1 “P” 元素节点}</script>
</body>

但是上面的结论也有疑惑的地方比如querySelectorAll()只能返回HTML元素,但是他的类型确是NodeList,还有getElementsByName()明显返回的也是HTML元素但是同样类型是NodeList类型。

想进一步了解两者之间的区别和联系可以看看知乎上的这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐:个人时间跟踪工具 ManicTime

在《个人管理 &#xff0d; 目标管理之前&#xff0c;你会时间管理吗》中我介绍的时间管理三阶段之一“对时间的实际去处进行记录”时说过现在有很多时间管理工具&#xff0c;也有人希望我介绍一下我使用的工具&#xff0c;那么我就利用中午休息时间&#xff0c;马上给大家介绍…

Java和甜蜜的科学

当您使用Java进行开发已有15年并且同事要求您帮助他们调试空指针异常时&#xff0c;您不会感到惊讶。 通常&#xff0c;很明显什么是null&#xff0c;唯一要做的就是找出原因。 有时会有些困难&#xff0c;因为有人创建了一系列取消引用的对象。 前几天&#xff0c;我遇到了一…

SQL Server 2005怎样进行性能排错

很少会有偶然的性能下降。设计不良的数据库或工作负载配置不正确的系统会经常导致性能问题。管理员需要能预先阻止或最小化问题的影响&#xff0c;当管理员遇到问题时&#xff0c;应该诊断问题并采取正确操作来修复问题。本文提供了按部就班的指导&#xff0c;通过使用可用的工…

AcWing 207. 球形空间产生器 (高斯消元)打卡

有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。 现在&#xff0c;你被困在了这个n维球体中&#xff0c;你只知道球面上n1个点的坐标&#xff0c;你需要以最快的速度确定这个n维球体的球心坐标&#xff0c;以便于摧毁这个球形空间产生器。 输入格式 第一行是一个整数…

jQuery中的ready

基于jQuery v1.8.3 在js与DOM交互之前要确保DOM已经加载构建完成&#xff0c;在jQuery中都是使用 (fn)或者(document).ready(fn)来确保自己写的代码在DOM构建完成之后执行。 那么jQuery的ready事件内部怎么实现的呢&#xff1f; 通过阅读源码&#xff08;line:842 ~ 898&…

JVM PermGen –您在哪里?

这篇文章介绍了JVM内存结构的一些基础知识&#xff0c;并快速窥视了PermGen&#xff0c;以了解自Java SE 8出现以来它已消失的地方。 裸基础 JVM只是系统上运行的另一个进程&#xff0c;魔术始于java命令。 像任何OS进程一样&#xff0c;它需要内存才能运行。 记住– JVM本身是…

vue 开发过程中遇到的问题

1. gitlab团队协作开发 2. element ui 问题集锦 3. 使用vue和ElementUI快速开发后台管理系统 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

python6-函数

转载于:https://www.cnblogs.com/WIU1905/p/11101249.html

Windows Phone 7.1 “芒果” SDK Beta 下载地址

Windows Phone 7.1 “芒果” SDK Beta 今天早上发布&#xff0c;第一时间下载体验。功能果然激动人心。 下载地址&#xff1a; 离线ISO请点我&#xff0c; 在线安装请点我。转载于:https://www.cnblogs.com/finehappy/archive/2011/05/25/2056849.html

Windows系统安装 ffmpeg

下载及解压 ffmpeg官方下载地址&#xff1a;https://ffmpeg.org/download.html 下载好后将其解压至你想保存的位置中。 环境变量设置 打开Windows设置&#xff0c;在搜索框输入&#xff1a;系统高级设置。 新建环境变量&#xff0c;并输入bin目录具体位置。 安装检查 按住 w…

基于webpack3.x从0开始搭建React开发环境

在开发react单页面的时候无可避免的要使用到webpack打包&#xff0c;今天就从零开始搭建一个react的开发环境。 需要实现的功能有&#xff1a; 使用Babel编译ES6编译.jsx文件实现热更新编译CSS预处理文件Less&#xff0c;CSS后处理文件PostCSS提取公共的CSS样式到一个公共的文…

死机简单配置

编写整个框架的目的是为了处理应用程序的配置。 我更喜欢一种简单的方法。 如果通过配置我们的意思是“ 部署之间可能有所不同的所有内容 ”&#xff0c;那么我们应该尝试使配置保持简单。 在Java中&#xff0c;最简单的选项是不起眼的属性文件。 属性文件的缺点是&#xff0c…

VMWARE虚拟机环境网卡3种模式介绍

NAT模式&#xff1a;相当于你的虚拟机通过你的宿主机上网 桥接模式&#xff1a;相当于你的虚拟机和宿主机同在一个局域网通过静态屁访问网络 仅主机模式&#xff1a;虚拟机只能和宿主机通信&#xff0c;但宿主机不会为虚拟机提供任何路由服务&#xff0c;不能连接到实际网络中转…

一个网站的诞生- MagicDict开发总结2 [ACCESS的烦恼]

说到数据库&#xff0c;有很多很多选择&#xff0c;除了MS-SQL&#xff0c;Oracle&#xff0c;SQLite&#xff0c;MySql&#xff0c;这些大家都非常熟悉的同学&#xff0c;还有DB2&#xff0c;IMSDB&#xff08;灰常灰常古老的数据库&#xff0c;用在OS390等Mainframe中&#x…

TS引用JS模块

为TypeScript引用的JS写声明文件 写TypeScript声明文件的时候会有三个困惑&#xff0c;一个是声明文件是什么&#xff1f;一个是声明文件怎么写&#xff1f;还有一个是TS依据什么规则找到我们的声明文件或者说模块。 第一个问题&#xff1a;按照我的理解声明文件就是告诉TS编…

angular模块

深入浅析AngularJS中的模块 模块是AngularJS应用程序的一个组成部分&#xff0c;模块可以是一个Controller、Service服务、Filter过滤器、directive指令&#xff0c;这些都属于模块。 大多数的应用程序都有一个函数入口main文件&#xff0c;用它来进行初始化&#xff0c;加载…

对象应该是不可变的

在面向对象的编程中&#xff0c;如果对象的状态在创建后无法修改&#xff0c;则该对象是不可变的 。 在Java中&#xff0c;不可变对象的一个​​很好的例子是String 。 创建完成后&#xff0c;我们将无法修改其状态。 我们可以要求它创建新的字符串&#xff0c;但是它自己的状…

开源GIS---.Net系列

NASA World WindNASA World Wind是使用.NET开发的一个Windows窗体系统&#xff0c;以地球外观看得角度提供全球定位功能&#xff0c;类似于Google Earth。它结合了美国国家航空航天局(NASA)从卫星拍摄的图像&#xff0c;这些图像应用于Blue Marble, Landsat 7, SRTM, MODIS 以及…

TypeScript中怎么用接口(interface)描述类(静态部分与实例部分)

TypeScript是JavaScript的超集 在看TypeScript官方文档的接口一节的时候对于类的静态部分与实例部分产生了疑问&#xff0c;通过努力得到自认为相对合理的解释&#xff0c;写下此文以记所得&#xff0c;如有谬误感谢指正。 文中大部分代码示例来自TypeScript官网 TS中的接口…

Java黑科技之源:JVMTI完全解读

Java生态中有一些非常规的技术&#xff0c;它们能达到一些特别的效果。这些技术的实现原理不去深究的话一般并不是广为人知。这种技术通常被称为黑科技。而这些黑科技中的绝大部分底层都是通过JVMTI实现的。 形象地说&#xff0c;JVMTI是Java虚拟机提供的一整套后门。通过这套后…