iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
Modern Web

想轉職的鯊魚從零基礎開始學習JavaScript系列 第 4

想轉職的鯊魚從零基礎開始學習JavaScript Day-04 DOM(文件物件模型)(一)

  • 分享至 

  • xImage
  •  

前言 DOM在哪?

在開始一切之前,先來看下面這張圖,
BOM-DOM關係
這是常見的BOM跟DOM的關係圖,

這樣你能懂什麼是DOM嗎?DOM就是BOM的一部分,也是「網頁」的節點與內容,

很好懂對不對! 一定是充滿困惑吧!

但是如果是放在瀏覽器上面來看(如下圖)
BOM-DOM實際關係
淺黃色的部分就是DOM,就能很明確的知道瀏覽器中跟網頁相關的部分就是DOM。

DOM(Document Object Model,文件物件模型)

從上面的關係圖我們可以知道,DOM的基礎是document,

而document是BOM下面的一個物件,可以從console控制台去窺探他的真身
document的真身
有沒有發現,document即是html文檔,而這個文檔又被稱為節點樹

每一個標籤、id、classname都是一個節點,就像CSS一樣

如果要渲染指定的目標就必須從這節點樹中找到你的目標

在DOM中尋找你的目標

首先先做一個簡易的網頁,這網頁裡面含有各種常用的要素,

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="nikihypocrite">
  <meta name="description" content="DOM實作教學">
  <title>DOM實作教學</title>
</head>
<body>
  <header class="header">
    <h1 id="h1">2022鐵人賽</h1>
  </header>
  <main>
    <div class="parent">
      這是父母層
      <p class="brother child">這是沒有輸的大哥</p>
      <p class="you child">這是你</p>
      <p class="shark child">這是鯊魚</p>
      <a href="#" class="link child">這是連結</a>
    </div>
  </main>
</body>
</html>

記得先前說過的,這是一個節點樹,任何一個elemnet、id、classname都是一個節點,

而我們要依據目標節點的特性,選擇適當的工具把他揪出來,才能做進一步的動作

而查找的工具就有兩個系列:

分別是單一類別的getElement系列及可以跨類別的querySelector系列

getElement系列

依查找的類別可以分成以下幾類:

  • 查找唯一id的 document.getElementById("id")

因為id是唯一的所以她輸出的結果也跟別人不太一樣,

因為是唯一所以回傳的值就是一個Element,而其他的getElementsByXXX,

礙於數量不固定,所以會先用一個陣列將它包裝之後再回傳。

如果是對上面的網頁的console使用document.getElementById("hi")

就可以找到<h1 id="h1">2022鐵人賽</h1>這個Element,

還可以以這為基底更進一步可以讀取/修改細部的資訊

像是抓出h1這行程式碼的內文

document.getElementById("h1").textContent
//'2022鐵人賽'

或是修改h1這行程式碼的內文,都是可以輕易做到的

document.getElementById("h1").textContent='鐵人賽2022'

小細節注意:因為id是唯一所以她的查找工具中的Element是沒有象徵複數的"s"

  • 查找非唯一的標籤的 document.getElementsByXXX("Name")

眾多節點都並非唯一,有可能會有很多同樣名稱的節點存在,

就像是一個網頁就不知道會有多少個<div>,所以從這找出來的東西

就會是一個集合體,並透過陣列做包裝,

有趣的事即使只有一個結果也會被包進陣列裡面,

要呼叫的時候還需要依陣列索引去做呼叫才能叫出你要的目標。
try it

document.getElementsByClassName("parent")
//HTMLCollection [div.parent]
document.getElementsByClassName("parent")[0]
//<div class= "parent"> … </div>
//一定要透過陣列索引才能找到你要的目標
類別 使用方式
id getElementById()
classname getElementsByClassName()
elemnet getElementsByTagName()

querySelector系列

一個可以跨類別查找的神奇工具

querySelector系列有還可以細分

  • 只回傳第一個符合條件的querySelector()
  • 回傳所有符合條件的querySelectorAll()

這個語法的使用基本上是跟getElement系列差不多

querySelector()回傳的結果跟id一樣只有一個值

querySelectorAll()回傳的結果就跟其他的getElements一樣是一個集合體,

而這個集合體一個是HTMLCollection另一個NodeList,都可以用陣列索引去呼叫他們。

getElement跟querySelector最大的差別即是查找所用的關鍵字。

getElement只能使用同一類別或同一層的名稱做關鍵字。

querySelector可以跟CSS的使用一樣,可以逐層進入你要的位子,

所以他的關鍵字的用法就跟CSS的一樣,id前面要加"#"、classname前面要加"."等

try it

document.querySelector("h1#h1")
//<h1 id="h1">2022鐵人賽</h1>
document.querySelector(".parent .brother.child")
//<p class="brother child">這是沒有輸的大哥</p>

是不是就像在使用CSS的選擇器一樣,這麼巧我也這麼覺得。

結語

現在,你有了基礎的火力,也有了基礎的導引能力,

可以使用JavaScript對網頁做基本的更動了

接下來便是逐步的充實自己的內涵(火力)

當然DOM不是只有這樣,不過現階段先這樣就好,後面等基礎都打好,

再回來深入了解他們。

鯊語錄


上一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-03 變數、宣告與賦值
下一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-05 型別 Primitive type及string字串淺談
系列文
想轉職的鯊魚從零基礎開始學習JavaScript31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言