Web前端入门第 70 问:JavaScript DOM 节点查找常用方法
虽然目前的开发场景基本都是使用 React/Vue/Angular 等框架,但是对于一些基础的 DOM 操作,还是需要了解学习。
曾经我们讨论过这样一个问题:Vue 这些开发框架,用它们渲染页面,真的就比不用开发框架快吗?
其实这个问题很好回答的,开发框架只是优化了项目的开发效率,对于浏览器的渲染速度,其实并没有想象中的那么快。
目前的前后端分离的开发模式,大致分为两种:一是浏览器端运行 Vue 等单页应用框架,由前端发起接口请求渲染页面从而实现前后端分离;二是在服务端运行 node.js ,由 node.js 发起接口请求渲染页面,从而实现前后端分离。这两种开发模式都绕不开的一个问题是:都要请求一次接口,http 通信都是很耗时的,相比于古老的后端渲染来说,其实已经算很慢了。
那么就有一个问题:为何 node.js 不直接写 SQL 查询数据库?嘿。。这个问题嘛就涉及到方方面面了,比如全栈开发和前端开发的价格那可不一样,会 JS 的前端和会 SQL 的前端又不一样了,前端踩过线去干后端的事这就矛盾来了...
废话太多了,咱们进入正题~~
DOM 查询
DOM 查询就是要找到 HTML 中的某个节点,方便对这个节点干一些不可描述的事~~
比如说给这个 HTML 元素加点小料,给 HTML 元素换个皮肤,让 HTML 元素动起来啥的。要干这些事的前提是要找对 HTML 元素,找错了就乱套了~~
/*
通过 ID 选择
查找页面上 id="header" 的第一个元素
比如:
<div id="header"></div>
<section id="header"></section>
<header id="header"></header>
只要是 ID 为 header 的元素,都能选择,但是只会找第一个
*/
const header = document.getElementById("header");
/*
通过类名选择(返回动态集合)
查找页面上 class="btn" 的所有元素
比如:
<button class="btn"></button>
<a class="btn"></a>
<div class="btn"></div>
*/
const buttons = document.getElementsByClassName("btn");
/*
通过标签名选择
与 getElementsByClassName 类似,只是选择页面上所有的 img 元素
*/
const images = document.getElementsByTagName("img");
/*
通过 CSS 选择器(静态集合)
此方法可以使用 CSS 选择器来获取页面上的元素
比如可以使用 .item:nth-child(3) 选择页面上 class="item" 的第三个元素
*/
const firstButton = document.querySelector(".btn:first-child");
const allButtons = document.querySelectorAll(".btn");
动态集合 vs 静态集合
顾名思义,动态集合就是会根据 HTML 内容变化而变化,而静态集合就是不管 HTML 怎么变,都是选择器方法执行的那一瞬间就确定了他的样子。
<ul class="list">
<li class="item">1</li>
<li class="item">2</li>
<li class="item">3</li>
<li class="item">4</li>
<li class="item">5</li>
</ul>
<script>
const item1 = document.querySelectorAll('.item')
const item2 = document.getElementsByClassName('item')
// 创建一个新的 li 元素
const li = document.createElement('li')
li.classList.add('item')
// list 元素中新增一个 li 元素
document.querySelector('.list').appendChild(li)
console.log(' ~ item2:', item1); // NodeList(5)
console.log(' ~ item:', item2); // HTMLCollection(6)
</script>
节点关系
除了直接查找节点的方法外,还能通过获取到的节点关系属性,取到相对于的节点,比如:
parentNode 用于选择父节点。
childNodes 用于选择所有子节点,包括所有的子内容(比如:注释、空格、文本内容等)。
children 仅选择元素节点内容。
firstChild 选择第一个子内容,可以是注释、文本内容、换行符等。
lastChild 选择最后一个子内容,可以是注释、文本内容、换行符等。
firstElementChild 选择第一个元素节点。
lastElementChild 选择最后一个元素节点。
nextSibling 选择当前节点后一个内容,可以是注释、文本内容、换行符等。
previousSibling 选择当前节点前一个内容,可以是注释、文本内容、换行符等。
nextElementSibling 选择当前节点后一个元素节点。
previousElementSibling 选择当前节点前一个元素节点。
<ul class="list">1122
<!-- 注释 -->
<li class="item">1</li>
<li class="item">2</li>
321<li class="item">3</li>123
<li class="item">4</li>
<li class="item">5</li>
</ul>
<script>
const parentNode = document.querySelector('.item:nth-child(3)').parentNode
console.log(' ~ parentNode:', parentNode); // 获得 ul.list
const childNodes = document.querySelector('.list').childNodes
console.log(' ~ childNodes:', childNodes); // 获得所有的子内容 [text, comment, text, li.item, text, li.item, text, li.item, text, li.item, text, li.item, text]
const children = document.querySelector('.list').children
console.log(' ~ children:', children); // 获取所有的 .item 元素 [li.item, li.item, li.item, li.item, li.item]
const firstChild = document.querySelector('.list').firstChild
console.log(' ~ firstChild:', firstChild); // 获得文本 11122
const lastChild = document.querySelector('.list').lastChild
console.log(' ~ lastChild:', lastChild); // 获得最后的换行符 \n
const firstElementChild = document.querySelector('.list').firstElementChild
console.log(' ~ firstElementChild:', firstElementChild); // 获得第一个 li.item
const lastElementChild = document.querySelector('.list').lastElementChild
console.log(' ~ lastElementChild:', lastElementChild); // 获最后一个 li.item
const nextSibling = document.querySelector('.item:nth-child(3)').nextSibling
console.log(' ~ nextSibling:', nextSibling); // 获得文本 123
const previousSibling = document.querySelector('.item:nth-child(3)').previousSibling
console.log(' ~ previousSibling:', previousSibling); // 获得文本 321
const nextElementSibling = document.querySelector('.item:nth-child(3)').nextElementSibling
console.log(' ~ nextElementSibling:', nextElementSibling); // 获得第四个 li.item
const previousElementSibling = document.querySelector('.item:nth-child(3)').previousElementSibling
console.log(' ~ previousElementSibling:', previousElementSibling); // 获得第二个 li.item
</script>
写在最后
常用的 DOM 查找方法基本就这些,还有些不太常用的方法本文就不一一列举,有兴趣可以查看 MDN 文档 https://developer.mozilla.org/zh-CN/docs/Web/API/Element。
Web前端入门第 70 问:JavaScript DOM 节点查找常用方法的更多相关文章
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】
http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...
- web前端(13)—— 了解JavaScript,JavaScript的引入方式
从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...
- Web前端基础怎么学? JavaScript、html、css知识架构图
以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...
- WEB前端工程师整理的原生JavaScript经典百例
一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...
- web前端学习之HTML CSS/javascript之一
前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...
- Android零基础入门第70节:ViewPager轻松完成TabHost效果
上一期学习了ViewPager的简单使用,本期一起来学习ViewPager的更多用法. 相信很多同学都使用过今日头条APP吧,一打开主界面就可以看到顶部有很多Tab,然后通过左右滑动来切换,就可以通过 ...
- Web前端性能优化教程06:减少DNS查找、避免重定向
本文是Web前端性能优化系列文章中的第六篇,主要讲述内容:减少DNS查找.避免重定向.完整教程可查看: 一.减少DNS查找 基础知识 DNS(Domain Name System): 负责将域名UR ...
- javascript DOM 节点 第18节
<html> <head> <title>DOM对象</title> </head><body><div >DOM对 ...
- JavaScript DOM–节点操作
节点 节点至少拥有nodeType(节点类型).nodeName(节点名称)和nodeValue(节点值)这三个基本属性. 元素节点 nodeType 为1 属性节点 nodeType 为2 文本 ...
随机推荐
- 关于DevExpress VCL汉化方法
用法1:在工程中加入控件cxLocalizer; 在程序中加入如下语句: Localizer.LoadFromFile('DevLocal.ini'); Localizer.Language := ' ...
- Git分支命名规范总结
Git分支命名规范总结 在Git分支命名规范中,通常通过前缀明确区分需求(功能开发)和Bug修复,以下是具体规则及示例: 一.命名规范区分原则 需求分支(Feature) 前缀:feature/ 或 ...
- 一句话秒建公网站!AI边缘计算颠覆传统开发
一句话就能让 AI 搭建一个公网可访问的完整网站: 短短几秒钟内,AI 便能完成所有构建操作: 这或许是目前全球最简便的建站方案: 本文使用的 AI 工具为腾讯云的 EdgeOne Pages MCP ...
- 如何在 MySQL 中监控和优化慢 SQL?
如何在 MySQL 中监控和优化慢 SQL? 在 MySQL 中,慢 SQL 查询是指那些执行时间较长的查询,通常会影响数据库的性能和响应时间.通过监控和优化这些慢 SQL 查询,可以提高数据库的效率 ...
- robotframework:运用JavaScript进行定位元素以及页面操作
在ui自动化时,有些特殊情况需要用到js操作,在进行js操作前要先进行js元素定位.一.js元素定位 1.id定位 document.getElementById("id") 2. ...
- mac系统安装GNU-sed
经过网上查资料,发现 由于 mac 系统与 linux 系统的差异,mac自带的sed命令,因为其是基于bsd,所以与常用的gnu不一样,安装gnu-sed 可正常使用: 1.brew install ...
- 话说神奇的content="IE=edge,chrome=1"的meta标签内容
这是个是IE8的专用标记,用来指定IE8浏览器去模拟某个特定版本的IE浏览器的渲染方式(比如人见人烦的IE6),以此来解决部分兼容问题,例如模拟IE7的具体方式如下: < meta http-e ...
- c#实现 正弦sin、反正弦arcsin,正切tan、反正切arctan:求角度值
1 #region 三角函数和反三角函数 2 3 using System; 4 using System.Collections.Generic; 5 using System.IO; 6 usin ...
- C#——基于CancellationTokenSource实现Task的取消
参照:第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常. - Yaopengfei - 博客园 (cnblogs.com) ...
- Nacos简介—3.Nacos的配置简介
大纲 1.Nacos生产集群Web端口与数据库配置 2.Nacos生产集群的Distro协议核心参数 3.Nacos打通CMDB实现跨机房的就近访问 4.Nacos基于SPI动态扩展机制来获取CMDB ...