JavaScript 在網頁上的操作不外乎以下三種,而這章會談到改變介面跟事件監聽的部分。
兩個是不同的執行環境,所以能夠使用的語法也會有些微差異。
瀏覽器能做的是相對比較少一點,像是 Node.js 引入模組的 require
語法在瀏覽器上就無法使用。
DOM 全名為 Document Object Model
就是把 HTML 的標記( Document ) 轉換成物件( Object )。
JS 可以操作物件,但不能直接操作頁面上的標籤,所以 DOM 就是瀏覽器幫 object 轉換成 => HTML 對應的標記,進而讓 JS 可以改變到頁面的元素。
所以 DOM 可以說是 JS 跟 HTML 溝通的橋樑。
以下是幾種 JavaScript 選取 DOM 元素的方法,最推薦用 .querySelector()
。
querySelector
、querySelectorAll
#
、class 用 .
、 tag 用 <tag 本身>
、關係選擇器 > + ~
querySelector
只會回傳第一個元素,如果想要選取到所有匹配到的元素,可以改用 querySelectorAll
。element.closest()
最靠近的父層元素const header = document.getElementsByTagName("header"); // tag
const cotainerBody = document.getElementsByClassName("cotainerBody"); // class
const container = document.getElementById("container"); // id
const header_line_first = document.querySelector("#header p"); // 匹配到的第一個 #header p
const header_line_all = document.querySelectorAll("#header p"); // 所有匹配到的 #header p
注意:script 要放在元素後面,不然 JS 無法對元素操作
有一種做法是直接改 Dom 上面的 style
屬性:
element.style.background = 'red';
element.style.paddingTop = '10px';
element.style["padding-top"] = '10px';
但這種寫法很不彈性又非常累贅,所以一般來說都是寫好另外的 class,事件觸發時,再幫元素加上該狀態的 class:
<style>
.active {
background: red;
}
</style>
element.classList.add('active')
.classList.add("active")
.classList.remove("active")
.classList.toggle("active")
.classList.contains("active")
.innerText
element.innerText =
"content"
.innerHTML
innerText
一樣 )innerText
不同的是,可以寫入標籤element.innerHTML =
"<div>content</div>"
.outerHTML
element.outerHTML =
"<new-element>...<div>content</div>...<new-element>"
.appendChild()
在最後面加入元素.removeChild()
移除該元素const container = document.querySelector("#container");
const header_line_first = document.querySelector("#header p");
const newElement = document.createElement("div");
const newTextElement = document.createTextNode("123")
container.appendChild(header_line_first); // 加入其他位置的節點
container.appendChild(newElement); // 加入新節點
container.appendChild(newTextElement); // 加入文字節點
簡單來說就是指定畫面的某一元素,我們會監測當此元素發生 「什麼事」 、會再進行後續的處理,而我們可以要偵測指定「 事件 」是什麼、當它發生的這動作稱為 「觸發」。
最常見的應該是 click 點擊事件:
element.addEventListener('click', function(){
// ... callback => 當按鈕點擊時、要做的動作
});
所以上面這段程式碼可以解釋為:
element
綁定一個 click
事件element
,即觸發了element
的 click
事件白話文就是先註冊一個事件,程式不會停下來等,繼續去跑其他地方,等事件被觸發了才執行 callback function 的內容。
其實就是把 function 當參數,當拿到 response 才執行 callback function
function callMe(data) {
cosnole.log(data);
}
function getData(callback) {
// ... 送一個 request
// ... 收到 response
callback(response);
}
getData(callMe);
又可以改成匿名函式的 callback function
function getData(callback) {
// ... 送一個 request
// ... 收到 response
callback(response);
}
getData(function (data) {
cosnole.log(data);
});
function(e)
event 資訊會放在 callback function 裡面的第一個參數,通常都是取名 event
或簡寫 e
,可以當成是一個「 物件 」,裡面有各種此事件的參數值,例如:
click
點擊
e.target
點擊到的元素e.screenX
滑鼠離視窗左邊的距離e.screenY
滑鼠離視窗上邊的距離keydown
按下按鍵
e.key
按鍵號碼onSubmit
當表單 form
中的 submit
按鈕 click
的時候,會有個預設行為,就是「 送出表單 」,預設是 GET 方法,並把參數帶入原網址送出,而 submit
事件是在表單送出前會觸發,用處是可以拿來驗證表單內容。
例如 密碼
跟 確認密碼
輸入的值不一樣的話,可以用 e.preventDefault()
來阻止表單送出。
<body>
<form class="form" action="">
密碼:<input type="password" name="password1">
確認密碼:<input type="password" name="password2">
<button type="submit">送出表單</button>
</form>
<script>
const form = document.querySelector('.form');
form.addEventListener('submit', function(e){
const pw1 = document.querySelector('input[name="password1"]');
const pw2 = document.querySelector('input[name="password2"]');
if (pw1.value !== pw2.value) e.preventDefault(); // 密碼不同、不送出表單
});
</script>
</body>
e.preventDefault()
阻止瀏覽器上的特定元素在該事件預設的行為,以下是比較常用的情況:
<form>
的 submit
- 阻止送出表單<a>
的 click
事件 - 阻止跳網址<input>
的 keypress
事件 - 阻止輸入按鍵( 以上內容大部分是 程式導師實驗計畫第三期 的學習筆記,如有錯誤歡迎糾正,非常感謝 🤓 )
Written on May 27th, 2019 by Yakim shu