目的: V120202B- 了解畫面 DOM的結構 – sub_panel2
2023年7月3日 星期一
V120202B - 了解畫面 DOM的結構 – sub_panel2 -append - $
2022年8月30日 星期二
DOM -0 DOM解析 - How Browser Work
目的: DOM的解析及取得元件
處理說明: 1> Browser 如何解析 HTML 成 DOM
原始參考網址 : https://ithelp.ithome.com.tw/articles/10191765
透過 DOM API 查找節點
當一個網頁被載入到瀏覽器時,瀏覽器會先分析這個 HTML 檔案,然後會依照這份 HTML 的內容解析成「DOM」 (Document Object Model,文件物件模型)。
DOM 是 W3C 制定的一個規範,它是獨立於平台與語言的標準。 換言之,只要遵守這樣的規範實作,不管是什麼平台或者是什麼語言開發,都可以透過 DOM 提供的 API 來操作 DOM 的內容、結構與樣式。
所以說,DOM 是網頁的根本,懂得 控制籃板球的人就能控制整場比賽 控制 DOM 就可以控制整個網頁,做出良好的互動體驗。
那麼在今天的分享中,我們就繼續來介紹 DOM API 查找節點的方法吧。
1><script> </script>放在 </body>之前 , HELLO 正常顯示
當瀏覽器在 <head> ... </head>
之間遇到 <script>
標籤時,就會暫停解析網頁,並且「立即」執行 <script>
裡的內容,直到 script 執行完畢後再繼續解析網頁。發在 <head> ... </head>
裡的 <script>
想要嘗試去尋找 <div id="hello">
這個標籤,但因為還沒解析到網頁本體,所以也無從取得。
document
物件是 「DOM tree」 的根節點,所以當我們要存取 HTML 時,都從 document 物件開始。 而 DOM 的節點類型除了 「HTML 元素節點」 (element nodes) 外,還有「文字節點」 (text nodes)、「註解節點」 (comment nodes) 等。document.querySelector
與 document.querySelectorAll
可以用 「CSS 選擇器」 (CSS Selectors) 來取得「第一個」或「所有」符合條件的元素集合 (NodeList)。
document.getElementById
以及 document.querySelector
document.getElementsBy**
(注意,有個 s) 以及 document.querySelectorAll
DOM -1 Event 的處理機制 - bubble -catch -eventflow
目的: 了解 Web DOM的 event 處理 機制
處理說明: 1> catch 時, 由上而下 (Document --> html --> body --> table --> tr --> td --> div)
2> bubble時, 由下而上(div-->td--> tr--> table --> body --> html --> Document)
--> DOM 兩種機制 (catch/bubble) 均有, 可分別設定 catch / bubble 的 event handler
參考原始網址: https://ithelp.ithome.com.tw/articles/10191970
而事件流程 (Event Flow) 指的就是「網頁元素接收事件的順序」。
事件流程可以分成兩種機制:
- 事件冒泡 (Event Bubbling)
- 事件捕獲 (Event Capturing)
假設現在的事件是點擊上圖中藍色的 <td>
。
那麼當 td 的 click
事件發生時,會先走紅色的 「capture phase」:
Document
<html>
<body>
<table>
<tbody>
<tr>
<td>
(實際被點擊的元素)
由上而下依序觸發它們的 click
事件。
然後再繼續執行綠色的 「bubble phase」,反方向由 <td>
一路往上傳至 Document
,整個事件流程到此結束。
Ex: DOM的實作案例
<div><div id="parent">父元素
</div>
</div>
當我點擊的是「子元素」的時候,透過 console.log
可以觀察到事件觸發的順序為:
"Parent Capturing"
"Child Capturing"
"Child Bubbling"
"Parent Bubbling"
由此可知,點擊子元素的時候,父層的 Capturing
會先被觸發,然後再到子層內部的 Capturing
或 Bubbling
事件。 最後才又回到父層的 Bubbling
結束。
子層的 Capturing
或 Bubbling
誰先誰後呢?
要看你程式碼的順序而定。
子層若是 Capturing
在 Bubbling
前面:
addEventListener()
基本上有三個參數,分別是「事件名稱」、「事件的處理器」(事件觸發時執行的 function
),以及一個「Boolean」值,由這個 Boolean 決定事件是以「捕獲」或「冒泡」機制執行,若不指定則預設為「冒泡」。