虽然目前的开发场景基本都是使用 React/Vue/Angular 等框架,但是对于一些基础的 DOM 操作,还是需要了解学习。
曾经我们讨论过这样一个问题:Vue 这些开发框架,用它们渲染页面,真的就比不用开发框架快吗?
其实这个问题很好回答的,开发框架只是优化了项目的开发效率,对于浏览器的渲染速度,其实并没有想象中的那么快。
目前的前后端分离的开发模式,大致分为两种:一是浏览器端运行 Vue 等单页应用框架,由前端发起接口请求渲染页面从而实现前后端分离;二是在服务端运行 node.js ,由 node.js 发起接口请求渲染页面,从而实现前后端分离。这两种开发模式都绕不开的一个问题是:都要请求一次接口,http 通信都是很耗时的,相比于古老的后端渲染来说,其实已经算很慢了。
那么就有一个问题:为何 node.js 不直接写 SQL 查询数据库?嘿。。这个问题嘛就涉及到方方面面了,比如全栈开发和前端开发的价格那可不一样,会 JS 的前端和会 SQL 的前端又不一样了,前端踩过线去干后端的事这就矛盾来了...
废话太多了,咱们进入正题~~
DOM 查询
DOM 查询就是要找到 HTML 中的某个节点,方便对这个节点干一些不可描述的事~~
比如说给这个 HTML 元素加点小料,给 HTML 元素换个皮肤,让 HTML 元素动起来啥的。要干这些事的前提是要找对 HTML 元素,找错了就乱套了~~
const header = document.getElementById("header");
const buttons = document.getElementsByClassName("btn");
const images = document.getElementsByTagName("img");
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')
const li = document.createElement('li')
li.classList.add('item')
document.querySelector('.list').appendChild(li)
console.log('🚀 ~ item2:', item1);
console.log('🚀 ~ item:', item2);
</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);
const childNodes = document.querySelector('.list').childNodes
console.log('🚀 ~ childNodes:', childNodes);
const children = document.querySelector('.list').children
console.log('🚀 ~ children:', children);
const firstChild = document.querySelector('.list').firstChild
console.log('🚀 ~ firstChild:', firstChild);
const lastChild = document.querySelector('.list').lastChild
console.log('🚀 ~ lastChild:', lastChild);
const firstElementChild = document.querySelector('.list').firstElementChild
console.log('🚀 ~ firstElementChild:', firstElementChild);
const lastElementChild = document.querySelector('.list').lastElementChild
console.log('🚀 ~ lastElementChild:', lastElementChild);
const nextSibling = document.querySelector('.item:nth-child(3)').nextSibling
console.log('🚀 ~ nextSibling:', nextSibling);
const previousSibling = document.querySelector('.item:nth-child(3)').previousSibling
console.log('🚀 ~ previousSibling:', previousSibling);
const nextElementSibling = document.querySelector('.item:nth-child(3)').nextElementSibling
console.log('🚀 ~ nextElementSibling:', nextElementSibling);
const previousElementSibling = document.querySelector('.item:nth-child(3)').previousElementSibling
console.log('🚀 ~ previousElementSibling:', previousElementSibling);
</script>
转自https://www.cnblogs.com/linx/p/18947426
该文章在 2025/7/4 9:59:00 编辑过