雖然目前的開發(fā)場景基本都是使用 React/Vue/Angular 等框架,但是對于一些基礎的 DOM 操作,還是需要了解學習。
曾經(jīng)我們討論過這樣一個問題:Vue 這些開發(fā)框架,用它們渲染頁面,真的就比不用開發(fā)框架快嗎?
其實這個問題很好回答的,開發(fā)框架只是優(yōu)化了項目的開發(fā)效率,對于瀏覽器的渲染速度,其實并沒有想象中的那么快。
目前的前后端分離的開發(fā)模式,大致分為兩種:一是瀏覽器端運行 Vue 等單頁應用框架,由前端發(fā)起接口請求渲染頁面從而實現(xiàn)前后端分離;二是在服務端運行 node.js ,由 node.js 發(fā)起接口請求渲染頁面,從而實現(xiàn)前后端分離。這兩種開發(fā)模式都繞不開的一個問題是:都要請求一次接口,http 通信都是很耗時的,相比于古老的后端渲染來說,其實已經(jīng)算很慢了。
那么就有一個問題:為何 node.js 不直接寫 SQL 查詢數(shù)據(jù)庫?嘿。。這個問題嘛就涉及到方方面面了,比如全棧開發(fā)和前端開發(fā)的價格那可不一樣,會 JS 的前端和會 SQL 的前端又不一樣了,前端踩過線去干后端的事這就矛盾來了...
廢話太多了,咱們進入正題~~
DOM 查詢
DOM 查詢就是要找到 HTML 中的某個節(jié)點,方便對這個節(jié)點干一些不可描述的事~~
比如說給這個 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");
動態(tài)集合 vs 靜態(tài)集合
顧名思義,動態(tài)集合就是會根據(jù) HTML 內容變化而變化,而靜態(tài)集合就是不管 HTML 怎么變,都是選擇器方法執(zhí)行的那一瞬間就確定了他的樣子。
<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>
節(jié)點關系
除了直接查找節(jié)點的方法外,還能通過獲取到的節(jié)點關系屬性,取到相對于的節(jié)點,比如:
parentNode
用于選擇父節(jié)點。
childNodes
用于選擇所有子節(jié)點,包括所有的子內容(比如:注釋、空格、文本內容等)。
children
僅選擇元素節(jié)點內容。
firstChild
選擇第一個子內容,可以是注釋、文本內容、換行符等。
lastChild
選擇最后一個子內容,可以是注釋、文本內容、換行符等。
firstElementChild
選擇第一個元素節(jié)點。
lastElementChild
選擇最后一個元素節(jié)點。
nextSibling
選擇當前節(jié)點后一個內容,可以是注釋、文本內容、換行符等。
previousSibling
選擇當前節(jié)點前一個內容,可以是注釋、文本內容、換行符等。
nextElementSibling
選擇當前節(jié)點后一個元素節(jié)點。
previousElementSibling
選擇當前節(jié)點前一個元素節(jié)點。
<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 編輯過