視覺化講解DOM構建過程
前言
最近在看 _Secrets of the JavaScript Ninja_, 書中第二章講到 DOM 的構建流程.
記得我之前也為理解 DOM 構建流程查閱過數次資料, 雖然每次查閱完都覺得 DOM 構建流程很簡單, 看完便懂, 但是懂了又忘還是讓人有些頭疼.
為了給自己加深印象, 也為了為大家提供一個視覺化的理解 DOM 構建過程的方式, 筆者製作了一個簡單的網頁來動態演示 DOM 構建過程. 希望能給大家帶來一些幫助.
效果
線上檢視
前進, 後退
網頁展示了一個簡單的 HTML 頁面的 DOM 渲染過程. 使用者點選前進,後退按鈕時, 頁面左側會顯示出當前的 HTML 程式碼, 右側則會顯示出實時的 DOM 結構圖:
自動播放
點選 Auto Play
按鈕, 頁面會自動播放頁面的整個構建過程:
DOM 構建過程
DOM 元素的作用 & 基本構建過程:
這裡直接引用一下原文:
The goal of this page-building phase is to set up the UI of a web application, and this is done in two distinct steps:
1 Parsing the HTML and building the Document Object Model (DOM)
2 Executing JavaScript code
Step 1 is performed when the browser is processing HTML nodes, and step 2 is > performed whenever a special type of HTML element—the script element (that > contains or
refers to JavaScript code)—is encountered. During the page-building phase, the browser
can switch between these two steps as many times as necessary.
瀏覽器 頁面構建 步驟的目的是為 UI 渲染做準備, 頁面構建是由下面兩部分購成的:
- 解析 HTML 節點, 並且構建 DOM 元素
- 執行 JavaScript 程式碼
其中第一步在瀏覽器解析到 HTML 節點時執行, 第二步在解析到 script 標籤時執行. 在頁面構建的過程中, 以上兩步可以無數次的交替執行.
It’s important to emphasize that, although the HTML and the DOM are closely
linked, with the DOM being constructed from HTML, they aren’t one and the same.
You should think of the HTML code as a blueprint the browser follows when > constructing the initial DOM—the UI—of the page. The browser can even fix > problems that it finds with this blueprint in order to create a valid DOM.
需要注意的是, 雖然 HTML 和 DOM 兩者關係緊密(DOM 是由 HTML 檔案構建而來), 但他們並不是相同的. 你應該將 HTML 看作是瀏覽器用來渲染 DOM 元素(頁面 UI) 的藍圖. 瀏覽器甚至可以可以修復這個藍圖(HTML)中的問題, 並構建出有效的 DOM.
下面用視覺化講解中的步驟依次講解:
首先看看我們想要渲染的 HTML 程式碼:
<!DOCTYPE html>
<html>
<head>
<title>Web app lifecycle</title>
<style>
#list { color: green;}
#second { color: red;}
</style>
</head>
<body>
<h1>head one</h1>
<ul id="list"></ul>
<script>
var liElement = document.createElement("li");
liElement.textContent = `I am a li`;
document.getElementById(`list`).appendChild(liElement);
</script>
</body>
</html>
接下來按照瀏覽器的構建順序來看:
首先瀏覽器遇到下面這段程式碼, 解析出 html 節點作為 DOM 的根節點:
<!DOCTYPE html>
<html>
接下來是 <head>
標籤, 將其放置在 html 節點下:
繼續解析, 遇到 <title>
標籤, 因為其是 <head>
的子標籤, 故將其放置在 head 節點下.
然後是 <style>
標籤, 類似的, 放在 head 節點下:
<style>
#list { color: green;}
#second { color: red;}
</style>
接下來解析到 <body>
標籤, 因其為 <html>
的子標籤, 故將其放置在 html 節點下:
然後是 <h1>
標籤, 放置在 body 節點下:
繼續, <ul>
標籤, 同樣的, 放置在 body 節點下:
接下來, 瀏覽器遇到了 <script>
標籤, 根據前面的知識我們知道, 瀏覽器會停下來並執行<script>
中的程式碼. 所以下面這段程式碼會被立即執行:
<script>
var liElement = document.createElement("li");
liElement.textContent = `I am a li`;
document.getElementById(`list`).appendChild(liElement);
</script>
這段程式碼的邏輯是: 向 id 為 list 的 DOM 節點新增一個 li 作為子元素, 故執行完成後 DOM 樹會是這樣:
最後, 瀏覽器會解析到 <body/></html>
等標籤, 結束解析過程. 最終我們得到的 DOM 結構如圖:
後記
預計我會將 Secrets of the JavaScript Ninja 後續章節中的一些知識點也通過類似的方式進行視覺化.
如果你也有希望能做成視覺化講解的: 知識點, 演算法, 技術原理, 歡迎在下面留言與我交流, 期待大家的反饋 ?
演示頁面用到的技術為: Vue, D3.js, 歡迎 fork & star
Github 地址
想繼續瞭解 D3.js
這裡是我的 D3.js 、 資料視覺化 相關部落格的 github 地址, 歡迎 fork & star :tada:
如果覺得不錯的話, 不妨點選下面的連結關注一下 : )
相關文章
- 視覺化 Keras 訓練過程視覺化Keras
- 視覺化監控搭建過程視覺化
- Stages — 研發過程視覺化建模和管理平臺視覺化
- 利用Tensorboard視覺化模型、資料和訓練過程ORB視覺化模型
- 圖解大頂堆的構建、排序過程圖解排序
- 視覺化搭建內建 API視覺化API
- vue-design 桌面端頁面視覺化構建程式Vue視覺化
- 複雜SQL查詢和視覺化報表構建SQL視覺化
- ASP.NET Core之OpenTelemetry、SEQ構建視覺化日誌ASP.NET視覺化
- 在pytorch上基於tensorboard的訓練過程的視覺化PyTorchORB視覺化
- 智慧物流 3D 視覺化——構建一體化監管平臺3D視覺化
- ASP.NET Core之Serilog、SEQ、ILogger構建視覺化日誌ASP.NET視覺化
- Pytorch網路結構視覺化PyTorch視覺化
- 揭秘Vue從Virtual DOM生成真實DOM的過程Vue
- 資料分析 | 資料視覺化圖表,BI工具構建邏輯視覺化
- Python繪製六種視覺化圖表詳解(建議收藏)Python視覺化
- WebKit Inside: DOM樹的構建WebKitIDE
- vue-cli 3.0 使用全過程講解Vue
- vue-cli3.0使用全過程講解Vue
- springcloud架構-HongHucommon-service專案構建過程SpringGCCloud架構
- 小紅書廣告智慧創意能力構建過程詳解
- 執行時的頁面構建過程
- 影片講解如何構建surging微服務呼叫微服務
- docker 入門講解 - 構建本地環境Docker
- 超詳細講解頁面載入過程
- 【拖拽視覺化大屏】全流程講解用python的pyecharts庫實現拖拽視覺化大屏的背後原理,簡單粗暴!視覺化PythonEcharts
- Langchain-ChatGLM原始碼解讀(二)-文件embedding以及構建faiss過程LangChain原始碼
- 多卡聚合路由器在視訊視覺化指揮排程的解決方案路由器視覺化
- 智慧黨建雲展廳三維視覺化視覺化
- DOM在Ahooks中的處理過程Hook
- 視覺化視覺化
- 元宇宙進軍電網市場,視覺化助力構建新能源中樞元宇宙視覺化
- Android 原始碼分析(一)專案構建過程Android原始碼
- EasyPack - 視覺化 Webpack 構建工具 1.0.3 更新視覺化Web
- Pytorch使用Tensorboard視覺化網路結構PyTorchORB視覺化
- 透過結構化資料構建頁面
- AndroidStudio資料夾結構檢視講解Android
- SpringIOC初始化過程--詳解Spring