DOM - 選取網頁元素 === 瞭解 document 的重要性 --- > *網頁瀏覽器在解析時,會先產生出document,document 裡有Element 的資料。 當需要選取元素時,就可以透過DOM 功能很友善的選取到內容。 當網頁一打開,就自動產生document (網頁一打開就解析好了) 。 網頁一解析完網頁內容後,會產生DOM tree (節點樹狀圖),產生各種節點來方便做讀取。* > 了解如何透過 JavaScript 去操控 DOM,就可以輕鬆地去執行網頁裡的節點。  當在 console 輸入 document,會回傳 “回傳整個文件的文本”,把整個內容都解析出來。  DOM 環境配置 --- ```javascript= <script src="all.js"></script>` ``` 以上這段程式碼可以放在`<head>`裡或`<body>`裡 但在DOM裡此段程式碼只能放在`</body>`前面 * 網頁一瀏覽器打開,HTML程式碼會一行一行執行,HTML標籤由上到下都解析成 DOM 節點,才可以使用 JavaScript 去抓取裡頭的內容。 若把`<script src="all.js"></script>`放在`<head>`裡,則無法讀取HTML節點(原因是HTML標籤節點還沒解析出來) querySelector 選擇器 --- 如何透過JavaScript程式語法抓取DOM裡面的網頁元素。 網頁一打開就會自動產生 DOM,document 是根節點,在此文件上就可做各種操作。 >document 為物件格式,裡面有許多方法及網頁元素就可讀取到。 ```javascript= // HTML 標籤 <h1>1234</h1> <a class="link" href="#">連結 link</a> ``` ### 先宣告const變數,變數名稱為el一個值為"DOM的節點",節點要抓取的元素位置在document文件資料裡,使用querySelector方法來選取網頁上的元素,網頁元素為h1標籤。 `const el = document.querySelector('h1'); // JS 部分` 程式碼拆解解釋 * document:在文件裡尋找 * querySelector:選取網頁上的元素 * CSS選擇器(如HTML標籤、CSS類別、id選擇器..等):尋找h1的HTML標籤 至「開發人員工具」查看`<h1> `標籤元素。  textContent 寫入文字資料 --- 學習對DOM裡的Element來動態修改裡面的文字內容。雖然網頁寫完了,還是可以透過JS來修改、新增、刪除網頁元素。 > textContent 文字節點 : 動態更改文字內容。 ```javascript= // HTML 部分 <h1>1234</h1> ``` ### 透過一個變數宣告起來,把變數指向到DOM網頁元素位置去。直接選取變數來更改網頁文字內容、並重新賦予值。 ```javascript= //JS部分 const el = document.querySelector('h1'); el.textContent = "hello world"; //寫法較簡潔 document.querySelector('h1').textContent = "333"; //寫法較冗長 ``` 前段寫法程式碼較簡短,不用每次都重新寫`document.querySelector('h1')`。 另外也可以在「開發人員工具」的console直接使用textContent修改文字。 innerHTML 插入 HTML 標籤 --- innerHTML : 增加網頁節點結構(放HTML標籤結構內容) innerHTML特性:會把原本選取的「網頁節點」**預設內容全部清空**,再放入自己新增的內容 字串頭尾可使用「反引號 ``」(ㄅ左邊) 或「雙引號 “ “」或「單引號 ’ ‘」包起來。 * 字串頭尾若使用「單引號 ’ ‘」包起來,內層的 class 屬性要使用「雙引號 “ “」,否則 JavaScript 無法判斷這是屬性還是字串會跳錯。 * 建議作法 : 字串頭尾若使用「反引號 ``」(ㄅ左邊)包起來,才不會與內層的**屬性或變數**有衝突。 ```javascript= // HTML <div class="main"> <p>hello!</p> </div> ``` 針對 `<div class="main">` 來新增` <h1> `標籤。 * 選取 `<div class="main">` 網頁元素,希望可以增加網頁結構,網頁結構為自己組出的字串資料。 ```javascript= // JavaScript const main = document.querySelector('.main'); console.log(main); // (如下左圖) 選取到 main 的元素 main.innerHTML = `<h1 class="header"> 標題 </h1>`; // (如下右圖) 放入字串格式資訊 ```  innerHTML 加入變數 --- ```javascript= // HTML <ul class="list"></ul> ``` 字串內可以帶變數 ```javascript= //javascript const list = document.querySelector(".list"); console.log(list); //先觀察是否有抓到list元素節點 ``` 確定有抓到list元素節點再往下加入HTML標籤和變數  ```javascript= let myLink = "https://www.google.com.tw " let myName = "阿武"; let content = `<li><a href="${myLink}">${myName}連結</a></li>`; list.innerHTML = content + content; //使用innerHTML插入contnet字串結構 ``` 萬一相同變數很多的時候,就變數做更改數值,增加效率。 textContent 與 innerHTML 運用差異 --- * innerHTML:可以產生出element裡的內容(元素、文字、屬性...等節點)。新增HTML標籤的網頁結構(重新編譯DOM節點)。 * textContent:只單純修改文字(變成文字節點)。 使用innerHTML來新增HTML標籤的網頁結構 ```javascript= main.textContent = `<h1>標題</h1>`; console.log(main); ```  * 使用textContent來修改文字 ```javascript= main.textContent = `<h1>標題</h1>`; console.log(main); ```  setAttribute 增加 HTML 標籤屬性 --- setAttribute("新增或修改的屬性","新增或修改的屬性內容"):設定HTML標籤裡的屬性,會帶兩個參數值。 ```htmlmixed= <a href="#">連結</a> <style> .red { color: red; } </style> ``` 更改`a連結`裡的屬性 ```javascript= const myLink = document.querySelector("a"); console.log(myLink); //先觀察是否有抓到myLink元素節點 ``` 對網頁上的`a連結`結構裡**修改**href屬性內容及裡**新增** class 屬性來改變顏色。 ```javascript= myLink.setAttribute("href", "https://www.google.com.tw"); myLink.setAttribute("class", "red"); ```  querySelectorAll 可重複選取多個元素 --- ```html= //html <a href="#">連結</a> <a href="#">連結</a> <style> .red { color: red; } .blue { color: blue; } </style> <script src="all.js"></script> ``` ### 語法`document.querySelector('')`只會抓網頁第一個DOM元素 ### 語法`document.querySelectorall('')` 抓取相同名稱的DOM元素。回傳"陣列",需使用陣列方法來選取DOM做操作。 ```javascript= const myLinks = document.querySelectorAll("a"); console.log(myLinks); //回傳一個節點列表,如下圖 ```  > *由此得知,myLinks 是一個陣列。* 選取陣列 myLinks 的第一筆網頁節點 DOM,新增屬性內容。 ```javascript= myLinks[0].setAttribute("href", "https://www.google.com.tw"); myLinks[0].setAttribute("class", "red"); ``` 選取陣列 myLinks 的第一筆網頁節點 DOM,修改屬性內容。 ```javascript= myLinks[1].setAttribute("href", "https://www.yahoo.com.tw"); myLinks[1].setAttribute("class", "blue"); ``` .innerHTML、.textContent、.getAttribute 取值方法 --- ```javascript= //HTML <a href="https://www.yahoo.com.tw" class="red"><span>連結</span></a> <style> .red { color: red;; } </style> <script src="all.js"></script> //javascript const myLink = document.querySelector('a'); console.log(myLink); //先觀察是否有抓取到myLink元素節點 ```  取出屬性 href 的內容 ```javascript= console.log(myLink.getAttribute("href")); console.log(myLink.getAttribute("class")); ```  使用 innerHTML 取出` <a> 標籤` 內的結構 ```javascript= console.log(myLink.innerHTML); let content = myLink.innerHTML; //把 myLink.innerHTML 結果指向給變數 content console.log(content); ```  使用textContent取出文字節點 ```javascript= console.log(myLink.textContent); ```  表單元素取值方式 --- 範例一: input ```html= // HTML <input type="text" class="txt" value="你好嗎?"> ``` 使用JavaScript來變更文字內容 ```javascript= //javascript const txt = document.querySelector(".txt"); txt.value = "你好喔!"; console.log(txt.value); ``` 範例二 : 「下拉式選單」 ```HTML= //HTML <select class="list"> <option value="高雄市">高雄市</option> <option value="台北市">台北市</option> </select> ``` 使用JavaScript來變更文字內容: ```javascript= //JavaScript const list = document.querySelector(".list"); list.value = "台北市"; console.log(list.value) ``` 
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.