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});- 此代码在表单提交时防止页面重新加载,并在控制台显示一条消息。
事件传播(冒泡和捕获)
事件传播分为两个阶段:捕获阶段,从父元素向子元素传播;冒泡阶段,从子元素向父元素传播。
事件冒泡
默认情况下,事件从最内层的元素开始发生并向外传播。这称为 冒泡(bubbling)。
示例:冒泡示例
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频道。