1.概述:
-
在 JavaScript 中,事件(Event)是瀏覽器或 DOM(文檔對象模型)與 JavaScript 代碼之間交互的一種機制。
-
它代表了在瀏覽器環境中發生的特定行為或者動作,比如用戶點擊鼠標、敲擊鍵盤、頁面加載完成、元素獲得或失去焦點等情況。這些事件可以被 JavaScript 代碼捕獲并進行相應的處理。
2.表單事件:
1.獲取/失去焦點:onfocus/onblur
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="#" method="post" id="myForm" enctype="application/x-www-form-urlencoded"><input type="text" id="text"/>
<!-- <button type="submit">提交</button>--><input type="submit"/>
</form><script>let text = document.getElementById("text");text.onblur = function () {//失去焦點時this.style.backgroundColor = "green";}text.onfocus = function () {//獲得焦點時this.style.backgroundColor = "red";}
</script></body>
</html>
默認輸入框背景無填充色,只有觸發下面事件才會將背景填充為對應顏色
點擊輸入框,此時獲得焦點,觸發獲得焦點事件,將輸入框背景改為紅色
點擊輸入框以外的區域,此時失去焦點,觸發失去焦點事件,將輸入框背景改為綠色
2.節點內容改變:onchange
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="#" method="post" id="myForm" enctype="application/x-www-form-urlencoded"><input type="text" id="text"/>
<!-- <button type="submit">提交</button>--><input type="submit"/>
</form><script>let text = document.getElementById("text");text.onchange = function () {//節點的內容改變時console.log(this.value)}
</script></body>
</html>
當輸入1時,控制臺輸入1;
當刪除輸入框中的1后再重新輸入1,發現控制臺沒有再次輸出,說明此時沒有觸發該事件;
當輸入框內的內容發送改變時,會再次觸發該事件,并將輸入值打印到控制臺;
3.輸入框有內容輸入時:oninput
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="#" method="post" id="myForm" enctype="application/x-www-form-urlencoded"><input type="text" id="text"/>
<!-- <button type="submit">提交</button>--><input type="submit"/>
</form><script>let text = document.getElementById("text");text.oninput = function () {//在用戶輸入時執行console.log(this.value)}
</script></body>
</html>
沒有內容輸入時,不觸發該事件;
輸入內容時,會將輸入內容打印到控制臺
當刪除輸入框內容時,會觸發該事件,控制臺打印空數據
當再次輸入1時,再次觸發該事件,控制臺再次打印該數據
4.選取元素時:onselect
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="#" method="post" id="myForm" enctype="application/x-www-form-urlencoded"><input type="text" id="text"/>
<!-- <button type="submit">提交</button>--><input type="submit"/>
</form><script>let text = document.getElementById("text");text.onselect = function () {console.log("選取元素時執行",this.value)}</script></body>
</html>
輸入框輸入內容時,不觸發該事件
當選取輸入內容時,觸發該事件,將輸入內容打印到控制臺
5.提交時:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="#" method="post" id="myForm" enctype="application/x-www-form-urlencoded"><input type="text" id="text"/><button type="submit">提交</button><input type="submit"/>
</form><script>let myForm = document.getElementById("myForm");myForm.onsubmit = function () {// if(text.value.....){//.....// }//當返回值為fasle 阻止提交// true 允許提交return false;}*/</script></body>
</html>
此時返回值為false,點擊提交按鈕時不會觸發提交事件,該表單不會被提交
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="#" method="post" id="myForm" enctype="application/x-www-form-urlencoded"><input type="text" id="text"/><button type="submit">提交</button><input type="submit"/>
</form><script>let myForm = document.getElementById("myForm");myForm.onsubmit = function () {// if(text.value.....){//.....// }//當返回值為fasle 阻止提交// true 允許提交return true;}</script></body>
</html>
當返回值為true時,點擊提交按鈕會觸發該事件,該表單會被提交(#表示提交到當前頁面)
3.窗口事件:
1.獲得/失去焦點時:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<img src="./img/QQ20241118-114112.png"/>
<script>window.onblur = function () {console.log('窗口失去了焦點')}window.onfocus = function () {console.log('窗口獲得了焦點')}</script></body>
</html>
此時剛打開頁面,不觸發事件,所以控制臺無輸出
當點擊左側窗口區域時,觸發獲得焦點事件,控制臺打印對應內容
當再次點擊窗口外區域時,觸發失去焦點事件,控制臺再次打印對應內容
2.頁面加載完成時:onload
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<img src="./img/QQ20241118-114112.png"/>
<script>window.onload= function () {//當頁面加載完成后執行console.log("頁面加載完成")}</script></body>
</html>
當使用低網速加載測試時,可以發現,不是一打開頁面就會觸發該事件,而是只有當整個頁面加載出來后,才會觸發該事件;
3.窗口大小改變時:onresize
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>window.onresize= function () {console.log("頁面大小正在改變")}</script></body>
</html>
頁面加載完成時,未觸發事件
此時將窗口區域面積減小時,觸發了該事件,并在控制臺打印對應信息
4.鍵盤事件:
1.鍵盤按下時觸發:onkeydown
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--<input type="text" id="text"/>-->
<script>let text = document.getElementById("text");//鍵盤按下時執行text.onkeydown = function (event) {// 解決兼容問題event = event || window.event;// key 按鍵//console.log("按下的鍵:", event.keyCode)console.log("按下的鍵:",event.key)}</script></body>
</html>
只要在鍵盤上按下按鍵,每按一次就會觸發一次該事件,(如果長按則會重復觸發),并將按鍵輸出到控制臺;
2.鍵盤彈起時觸發:onkeyup
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--<input type="text" id="text"/>-->
<script>let text = document.getElementById("text");text.onkeyup = function (event) {console.log("按鍵彈起時:",event.key)}</script></body>
</html>
當長按1時,不會觸發該事件,只有當松開時,會觸發1次該事件
3.按下彈起時觸發:onkeypress
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--<input type="text" id="text"/>-->
<script>let text = document.getElementById("text");text.onkeypress = function (event) {console.log("按下彈起時:",event.key)}</script></body>
</html>
只有當按下并松開時才會觸發該事件
4.案例:通過方向鍵控制色塊移動
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="width: 100px;height: 100px;background-color: red;position: absolute;"></div>
<script>let box = document.getElementById("box");document.onkeydown = function (event) {let speed = 10;switch (event.keyCode) {case 37:box.style.left = box.offsetLeft - speed + "px";break;case 39:box.style.left = box.offsetLeft + speed + "px";break;case 38:box.style.top = box.offsetTop - speed + "px";break;case 40:box.style.top = box.offsetTop + speed + "px";break;}}</script></body>
</html>
這是頁面剛加載出來時色塊的位置,此時我們可以通過方向鍵改變色塊的位置
5.鼠標事件:
1.單擊左鍵觸發:onclick
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");box.onclick = function () {console.log("單擊事件觸發");}</script>
</body>
</html>
在元素區域(色塊)內,單機鼠標左鍵,觸發該事件
2.雙擊觸發:ondblclick
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");box.ondblclick = function () {console.log("雙擊事件觸發");}</script>
</body>
</html>
雙擊元素區域,觸發該事件
3.鼠標任意按鍵按下或松開時觸發:onmousedown/onmouseup
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");box.onmousedown = function () {console.log("鼠標按鈕按下時");}box.onmouseup = function () {console.log("鼠標按鈕松開時");}</script>
</body>
</html>
在元素區域內按下或松開鼠標任意按鍵對會觸發對應事件
4.鼠標指針移動時觸發:onmousemove
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");box.onmousemove = function () {console.log("鼠標指針移動時");}</script>
</body>
</html>
當鼠標指針在元素區域內移動時,就會重復觸發該事件
5.鼠標指針移入或移出時觸發:
不能阻止事件冒泡:onmouseover/onmouseout
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");box.onmouseover = function () {// 不能阻止事件的冒泡console.log("鼠標指針移動到元素上時");}box.onmouseout = function () {// 不能阻止事件的冒泡console.log("鼠標指針移動出元素上時");}</script>
</body>
</html>
當指針移入元素區域或移出元素區域時,都會觸發對應事件
可以阻止事件冒泡:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");box.onmouseenter = function () {// 能阻止事件的冒泡console.log("鼠標指針移動到元素上時");}box.onmouseleave = function () {// 能阻止事件的冒泡console.log("鼠標指針移動出元素上時");}</script>
</body>
</html>
當指針移入元素區域或移出元素區域時,都會觸發對應事件
6.鼠標滾輪滑動時觸發:
1.有無內容都可觸發(滑動滾輪):onmousewheel
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");// 有沒有內容都會觸發/* box.onmousewheel = function () {console.log("鼠標的滾輪滾動時")}*/</script>
</body>
</html>
在元素區域內滑動鼠標滾輪,不管元素區域內有沒有內容,都會觸發該事件
2.必須有內容才會觸發(滑動滾動條):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;"></div>
<script>let box = document.getElementById("box");//有內容才能觸發box.onscroll = function () {console.log("滾動條滾動了")}</script>
</body>
</html>
此時元素區域內無內容,滑動鼠標滾輪不會觸發該事件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="box" style="overflow: auto;width: 100px;height: 100px;background-color: pink;">我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容我是一段內容
</div>
<script>let box = document.getElementById("box");//有內容才能觸發box.onscroll = function () {console.log("滾動條滾動了")}</script>
</body>
</html>
此時元素區域內有內容,當我們滑動鼠標滾輪時會重復觸發該事件
6.事件冒泡:
1.概述:
事件冒泡 (Bubble):是指事件向上傳導,當后代元素上的事件被觸發時,其祖先元素的相同事件也會被觸發;
2.示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>#div1 {width: 200px;height: 200px;background-color: pink;}#div2 {width: 100px;height: 100px;background-color: coral;}</style>
</head>
<body>
<div id="div1">我是DIV1<div id="div2">我是DIV2</div>
</div>
<script>let div1 = document.getElementById("div1");let div2 = document.getElementById("div2");div1.onclick = function () {console.log("div1 的單擊事件觸發了")}div2.onclick = function () {console.log("div2 的單擊事件觸發了")}
</script>
</body>
</html>
在上面案例中,DIV2作為DIV1的子節點,當我們單擊DIV2區域時,鼠標單擊事件會向上傳導到其父節點DIV1中,通過測試結果我們也可以看出當我們單擊子節點div2時,不僅div2節點觸發了該事件,其父節點div1節點也觸發了該事件;
3.避免事件冒泡:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>#div1 {width: 200px;height: 200px;background-color: pink;}#div2 {width: 100px;height: 100px;background-color: coral;}</style>
</head>
<body>
<div id="div1">我是DIV1<div id="div2">我是DIV2</div>
</div>
<script>let div1 = document.getElementById("div1");let div2 = document.getElementById("div2");div1.onclick = function () {console.log("div1 的單擊事件觸發了")}div2.onclick = function () {console.log("div2 的單擊事件觸發了")stopBubble();}//取消事件的冒泡function stopBubble(event) {//處理瀏覽器兼容性問題if (event && event.stopPropagation) {event.stopPropagation()} else {window.event.cancelBubble = true;}}
</script>
</body>
</html>
此時單擊div2區域,該事件不會再傳導到其父節點div1中;