在 JavaScript 中的事件處理
本文說明了如何在 JavaScript 中進行事件處理。
YouTube Video
javascript-html-event.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>JavaScript & HTML</title>
6 <style>
7 * {
8 box-sizing: border-box;
9 }
10
11 body {
12 margin: 0;
13 padding: 1em;
14 padding-bottom: 10em;
15 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16 background-color: #f7f9fc;
17 color: #333;
18 line-height: 1.6;
19 }
20
21 .container {
22 max-width: 800px;
23 margin: 0 auto;
24 padding: 1em;
25 background-color: #ffffff;
26 border: 1px solid #ccc;
27 border-radius: 10px;
28 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
29 }
30
31 .container-flex {
32 display: flex;
33 flex-wrap: wrap;
34 gap: 2em;
35 max-width: 1000px;
36 margin: 0 auto;
37 padding: 1em;
38 background-color: #ffffff;
39 border: 1px solid #ccc;
40 border-radius: 10px;
41 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
42 }
43
44 .left-column, .right-column {
45 flex: 1 1 200px;
46 min-width: 200px;
47 }
48
49 h1, h2 {
50 font-size: 1.2rem;
51 color: #007bff;
52 margin-top: 0.5em;
53 margin-bottom: 0.5em;
54 border-left: 5px solid #007bff;
55 padding-left: 0.6em;
56 background-color: #e9f2ff;
57 }
58
59 button {
60 display: block;
61 margin: 1em auto;
62 padding: 0.75em 1.5em;
63 font-size: 1rem;
64 background-color: #007bff;
65 color: white;
66 border: none;
67 border-radius: 6px;
68 cursor: pointer;
69 transition: background-color 0.3s ease;
70 }
71
72 button:hover {
73 background-color: #0056b3;
74 }
75
76 #output {
77 margin-top: 1em;
78 background-color: #1e1e1e;
79 color: #0f0;
80 padding: 1em;
81 border-radius: 8px;
82 min-height: 200px;
83 font-family: Consolas, monospace;
84 font-size: 0.95rem;
85 overflow-y: auto;
86 white-space: pre-wrap;
87 }
88
89 .highlight {
90 outline: 3px solid #ffc107; /* yellow border */
91 background-color: #fff8e1; /* soft yellow background */
92 transition: background-color 0.3s ease, outline 0.3s ease;
93 }
94
95 .active {
96 background-color: #28a745; /* green background */
97 color: #fff;
98 box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
99 transition: background-color 0.3s ease, box-shadow 0.3s ease;
100 }
101 </style>
102</head>
103<body>
104 <div class="container-flex">
105 <div class="left-column">
106 <h2>HTML Sample</h2>
107 <div id="parentDiv">
108 <button id="myButton">Click me</button>
109 </div>
110 </div>
111
112 <div class="right-column">
113 <h2>Form Sample</h2>
114 <form id="myForm">
115 <input type="text" name="username">
116 <button type="submit">Submit</button>
117 </form>
118 </div>
119 </div>
120
121 <div class="container">
122 <h1>JavaScript Console</h1>
123 <button id="executeBtn">Execute</button>
124 <div id="output"></div>
125 </div>
126
127 <script>
128 // Override console.log to display messages in the #output element
129 (function () {
130 const originalLog = console.log;
131 console.log = function (...args) {
132 originalLog.apply(console, args);
133 const output = document.getElementById('output');
134 output.textContent += args.map(String).join(' ') + '\n';
135 };
136 })();
137
138 document.getElementById('executeBtn').addEventListener('click', () => {
139 // Prevent multiple loads
140 if (document.getElementById('externalScript')) return;
141
142 const script = document.createElement('script');
143 script.src = 'javascript-html-event.js';
144 script.id = 'externalScript';
145 //script.onload = () => console.log('javascript-html-event.js loaded and executed.');
146 //script.onerror = () => console.log('Failed to load javascript-html-event.js.');
147 document.body.appendChild(script);
148 });
149 </script>
150</body>
151</html>在 JavaScript 中的事件處理
在 JavaScript 中的事件處理是一種機制,用於回應使用者的操作(例如點擊和鍵盤輸入)或瀏覽器的操作來執行特定的動作。透過設置事件監聽器,您可以創建動態且具交互性的網頁。
事件的基礎
事件是根據使用者操作和瀏覽器動作觸發的。當事件觸發時,會執行相關的事件處理器(函數)。例如,有如下事件:。
- 點擊(
click) - 鍵盤輸入(
keydown,keyup) - 滑鼠移動(
mousemove,mouseover) - 表單提交(
submit) - 頁面加載完成(
DOMContentLoaded) - 滾動(
scroll)
添加事件監聽器
使用 addEventListener() 方法設置事件監聽器。當指定事件發生時,此方法會調用特定的函數。
addEventListener() 的基本語法
1element.addEventListener(event, handler);element是監聽事件的 HTML 元素。event是事件名稱(例如:click)。handler是當事件發生時所執行的函式。
事件對象
當事件發生時,JavaScript 會將包含事件詳細信息的 事件物件 傳遞給事件處理程式。此物件包括資訊,例如是由哪個元素觸發了事件以及按下了哪個鍵。
範例:使用事件物件
1<button id="myButton">Click me</button>1const button = document.getElementById('myButton');
2
3button.addEventListener('click', (event) => {
4 console.log(event); // Display event details in the console
5 console.log('Clicked element:', event.target); // Display the clicked element
6});- 此程式碼在按鈕被點擊時,使用事件物件在主控台顯示詳細資訊和被點擊的元素。
常見的事件
點擊事件
click 事件在使用者點擊某個元素時發生。
1element.addEventListener('click', () => {
2 console.log('Clicked');
3});- 此程式碼在元素被點擊時,在主控台顯示一則訊息。
鍵盤事件
keydown 和 keyup 事件分別在使用者按下或釋放按鍵時發生。您可以使用 event.key 查看按下了哪個鍵。
1document.addEventListener('keydown', (event) => {
2 console.log(`Key pressed: ${event.key}`);
3});- 此程式碼在使用者按下按鍵時,在主控台顯示按鍵名稱。
滑鼠事件
mousemove 和 mouseover 事件在滑鼠移動和懸停時發生。
1document.addEventListener('mousemove', (event) => {
2 console.log(`Mouse position: X=${event.clientX}, Y=${event.clientY}`);
3});- 此程式碼每當滑鼠移動時,在主控台顯示位置(X 和 Y 座標)。
表單事件
與表單相關的事件包括 submit 和 input。submit 事件在提交表單時觸發,通常會導致頁面重新載入,但常使用 event.preventDefault() 來阻止這種情況。
範例:表單提交時阻止頁面重新載入
1<form id="myForm">
2 <input type="text" name="username">
3 <button type="submit">Submit</button>
4</form>1const form = document.getElementById('myForm');
2
3form.addEventListener('submit', (event) => {
4 event.preventDefault(); // Prevent page reload
5 console.log('Form has been submitted');
6});- 此程式碼在送出表單時防止頁面重新載入,並於主控台顯示一個訊息。
事件傳播(冒泡和捕獲)
事件通過兩個階段進行傳播:捕獲階段,從父元素傳播到子元素;和冒泡階段,從子元素傳播到父元素。
事件冒泡
默認情況下,事件在最內層元素上發生,然後向外傳播。這稱為 冒泡。
範例:冒泡範例
1<div id="parentDiv">
2 <button id="myButton">Click me</button>
3</div> 1const parent = document.getElementById('parentDiv');
2const button = document.getElementById('myButton');
3
4parent.addEventListener('click', () => {
5 console.log('Parent element was clicked');
6});
7
8button.addEventListener('click', () => {
9 console.log('Button was clicked');
10});- 在此範例中,當您點擊按鈕時,按鈕的事件會首先發生,隨後是父元素的事件。
事件捕獲
通過在 addEventListener() 中指定 true 作為第三個參數,您可以在捕獲階段處理事件。
1parent.addEventListener('click', () => {
2 console.log('Capturing: Parent element was clicked');
3}, true);- 此程式碼在捕獲階段處理父元素的點擊事件,並在主控台顯示訊息。
使用 stopPropagation() 阻止事件傳播
您可以使用 event.stopPropagation() 來阻止事件的傳播。
1button.addEventListener('click', (event) => {
2 event.stopPropagation(); // Stop the event propagation
3 console.log('Button was clicked (no propagation)');
4});- 此程式碼在按鈕被點擊時阻止事件傳播,並在主控台顯示訊息。
移除事件
您可以使用 removeEventListener() 來移除事件監聽器。要移除事件監聽器,您需要取得在 addEventListener() 中指定的函數參考。
1function handleClick() {
2 console.log('Clicked');
3}
4
5const button = document.getElementById('myButton');
6button.addEventListener('click', handleClick);
7button.removeEventListener('click', handleClick); // Remove the event listener
- 此程式碼從按鈕上移除點擊事件監聽器,使之之後點擊時不再處理此事件。
自訂事件
在 JavaScript 中,您可以除了標準事件外,也可以創建並觸發自訂事件。使用 CustomEvent 建構函數。
1document.addEventListener('myCustomEvent', (event) => {
2 console.log(event.detail.message); // Displays "Hello!"
3});
4
5const event = new CustomEvent('myCustomEvent', {
6 detail: {
7 message: 'Hello!'
8 }
9});
10document.dispatchEvent(event);- 此程式碼建立並派發自訂事件
myCustomEvent,並在主控台顯示其詳細資訊。
總結
事件處理是增強網頁應用互動性的關鍵要素。透過善用事件處理的各個組件,你可以提供更靈活且精緻的使用者體驗。
- 事件監聽器:使用
addEventListener()在元素上設置事件處理程式。 - 事件對象:當事件發生時,會傳遞一個事件對象,可以用來獲取詳細資訊。
- 事件傳播:事件的傳播分為兩個階段:冒泡階段和捕獲階段。
- 表單事件與自訂事件:您可以處理表單提交以及自己的自訂事件。
您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。