Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来
Python系列文章目录
PyTorch系列文章目录
机器学习系列文章目录
深度学习系列文章目录
Java系列文章目录
JavaScript系列文章目录
01-【JavaScript-Day 1】从零开始:全面了解 JavaScript 是什么、为什么学以及它与 Java 的区别
02-【JavaScript-Day 2】开启 JS 之旅:从浏览器控制台到 <script> 标签的 Hello World 实践
03-【JavaScript-Day 3】掌握JS语法规则:语句、分号、注释与大小写敏感详解
04-【JavaScript-Day 4】var 完全指南:掌握变量声明、作用域及提升
05-【JavaScript-Day 5】告别 var 陷阱:深入理解 let 和 const 的妙用
06-【JavaScript-Day 6】从零到精通:JavaScript 原始类型 String, Number, Boolean, Null, Undefined, Symbol, BigInt 详解
07-【JavaScript-Day 7】全面解析 Number 与 String:JS 数据核心操作指南
08-【JavaScript-Day 8】告别混淆:一文彻底搞懂 JavaScript 的 Boolean、null 和 undefined
09-【JavaScript-Day 9】从基础到进阶:掌握 JavaScript 核心运算符之算术与赋值篇
10-【JavaScript-Day 10】掌握代码决策核心:详解比较、逻辑与三元运算符
11-【JavaScript-Day 11】避坑指南!深入理解JavaScript隐式和显式类型转换
12-【JavaScript-Day 12】掌握程序流程:深入解析 if…else 条件语句
13-【JavaScript-Day 13】告别冗长if-else:精通switch语句,让代码清爽高效!
14-【JavaScript-Day 14】玩转 for 循环:从基础语法到遍历数组实战
15-【JavaScript-Day 15】深入解析 while 与 do…while 循环:满足条件的重复执行
16-【JavaScript-Day 16】函数探秘:代码复用的基石——声明、表达式与调用详解
17-【JavaScript-Day 17】函数的核心出口:深入解析 return 语句的奥秘
18-【JavaScript-Day 18】揭秘变量的“隐形边界”:深入理解全局与函数作用域
19-【JavaScript-Day 19】深入理解 JavaScript 作用域:块级、词法及 Hoisting 机制
20-【JavaScript-Day 20】揭秘函数的“记忆”:深入浅出理解闭包(Closure)
21-【JavaScript-Day 21】闭包实战:从模块化到内存管理,高级技巧全解析
22-【JavaScript-Day 22】告别 function 关键字?ES6 箭头函数 (=>) 深度解析
23-【JavaScript-Day 23】告别繁琐的参数处理:玩转 ES6 默认参数与剩余参数
24-【JavaScript-Day 24】从零到一,精通 JavaScript 对象:创建、访问与操作
25-【JavaScript-Day 25】深入探索:使用 for...in 循环遍历 JavaScript 对象属性
26-【JavaScript-Day 26】零基础掌握JavaScript数组:轻松理解创建、索引、长度和多维结构
27-【JavaScript-Day 27】玩转数组:push, pop, slice, splice 等方法详解与实战
28-【JavaScript-Day 28】告别繁琐循环:forEach, map, filter 数组遍历三剑客详解
29-【JavaScript-Day 29】数组迭代进阶:掌握 reduce、find、some 等高阶遍历方法
30-【JavaScript-Day 30】ES6新特性:Set与Map,让你的数据管理更高效!
31-【JavaScript-Day 31】对象的“蓝图”详解:构造函数、new 与 instanceof 完全指南
32-【JavaScript-Day 32】深入理解 prototype、__proto__ 与原型链的奥秘
33-【JavaScript-Day 33】深入浅出 ES6 Class:从入门到精通面向对象新姿势
34-【JavaScript-Day 34】前后端数据交互的通用语:深入解析JSON
35-【JavaScript-Day 35】从 window 到 location,一文掌握浏览器对象模型 BOM
36-【JavaScript-Day 36】前端基石:深入理解 DOM 并精通五大元素选择器
37-【JavaScript-Day 37】在 DOM 树中“行走”:节点遍历
38-【JavaScript-Day 38】JS操控网页外观:从innerHTML到classList的全方位指南
39-【JavaScript-Day 39】从零到一,动态构建交互式网页的 DOM 节点操作秘籍
40-【JavaScript-Day 40】响应用户操作:事件监听与处理从入门到精通
41-【JavaScript-Day 41】JS 事件大全:click, keydown, submit, load 等常见事件详解与实战
文章目录
前言
在前一篇文章中,我们学习了如何使用 addEventListener 来为网页元素绑定事件监听器,这是让页面动起来的关键一步。然而,仅仅知道如何“监听”还不够,我们还需要了解究竟有哪些“事件”可以被监听。不同的用户操作和浏览器行为会触发不同类型的事件,掌握它们是实现丰富交互体验的基础。今天,就让我们一起探索 JavaScript 中最常见的几类网页事件:鼠标事件、键盘事件、表单事件和页面加载事件,通过丰富的实例让你彻底搞懂它们!
一、鼠标事件 (Mouse Events)
鼠标是用户与网页交互最直接的工具,因此鼠标事件也是我们最常用的一类事件。它们响应用户的点击、移动、悬停等各种鼠标操作。
1.1.1 点击事件:click 与 dblclick
click: 当用户在元素上单击鼠标左键时触发。这是最基础、最核心的事件。dblclick: 当用户在元素上双击鼠标左键时触发。
(1) 应用场景
按钮点击、菜单项选择、图片放大等。
(2) 代码示例
我们创建一个按钮,分别监听它的单击和双击事件。
HTML:
<button id="myBtn">点我试试</button>
<p id="clickStatus"></p>
<p id="dblClickStatus"></p>
JavaScript:
const btn = document.getElementById('myBtn');
const clickStatus = document.getElementById('clickStatus');
const dblClickStatus = document.getElementById('dblClickStatus');
// 监听单击事件
btn.addEventListener('click', function() {
clickStatus.textContent = '检测到单击(click)事件!';
console.log('按钮被单击了');
});
// 监听双击事件
btn.addEventListener('dblclick', function() {
dblClickStatus.textContent = '检测到双击(dblclick)事件!';
console.log('按钮被双击了');
});
💡 提示:当你双击一个元素时,会依次触发两次 click 事件和一次 dblclick 事件。在设计交互时需要注意这一点。
1.1.2 悬停与移出事件:mouseover 与 mouseout
mouseover: 当鼠标指针进入一个元素或其子元素时触发。mouseout: 当鼠标指针离开一个元素或其子元素时触发。
(1) 应用场景
下拉菜单的显示与隐藏、图片或按钮的悬停高亮效果。
(2) 代码示例
我们创建一个 div,当鼠标悬停时改变其背景色。
HTML:
<style>
#hoverBox {
width: 200px;
height: 100px;
border: 1px solid #333;
display: flex;
justify-content: center;
align-items: center;
transition: background-color 0.3s;
}
</style>
<div id="hoverBox">把鼠标移到这里</div>
JavaScript:
const hoverBox = document.getElementById('hoverBox');
// 鼠标进入时触发
hoverBox.addEventListener('mouseover', function() {
hoverBox.style.backgroundColor = '#e0f7fa'; // 改变背景色
hoverBox.textContent = '鼠标进入了 (mouseover)';
});
// 鼠标离开时触发
hoverBox.addEventListener('mouseout', function() {
hoverBox.style.backgroundColor = '#ffffff'; // 恢复背景色
hoverBox.textContent = '把鼠标移到这里';
});
1.1.3 鼠标移动事件:mousemove
mousemove: 当鼠标指针在元素内部移动时连续触发。
(1) 应用场景
实现拖拽效果、显示鼠标实时坐标、制作跟随鼠标的特效。
(2) 代码示例
我们在一个区域内实时显示鼠标的坐标。
HTML:
<style>
#moveArea {
width: 300px;
height: 200px;
border: 1px dashed #999;
position: relative;
}
#coords {
position: absolute;
top: 10px;
left: 10px;
}
</style>
<div id="moveArea">
<p>在此区域移动鼠标</p>
<p id="coords">坐标: (0, 0)</p>
</div>
JavaScript:
const moveArea = document.getElementById('moveArea');
const coordsDisplay = document.getElementById('coords');
moveArea.addEventListener('mousemove', function(event) {
// event.offsetX 和 event.offsetY 获取相对于事件源元素的坐标
const x = event.offsetX;
const y = event.offsetY;
coordsDisplay.textContent = `坐标: (${x}, ${y})`;
});
⚠️注意:mousemove 事件触发非常频繁,如果其回调函数中包含复杂的计算或 DOM 操作,可能会影响性能。
二、键盘事件 (Keyboard Events)
键盘事件允许我们响应用户的按键操作,常用于快捷键、表单输入验证等场景。
2.1.1 按键过程:keydown、keypress 与 keyup
这三个事件描述了按键的完整过程,但它们的用途和触发时机有所不同。
keydown: 当用户按下任意一个键时触发,并且会持续触发(按住不放)。keypress: 当用户按下的键可以产生一个字符时触发(例如 ‘a’, ‘7’, ’ ')。对于功能键(如Ctrl,Shift,F1)则不会触发。此事件已被废弃,不推荐使用,但了解它有助于理解历史代码。keyup: 当用户释放一个键时触发。
(1) 辨析与选择
| 事件 | 触发时机 | 是否响应功能键 | 是否持续触发 | 推荐场景 |
|---|---|---|---|---|
keydown | 按下按键时 | 是 | 是 | 游戏控制、快捷键(如 Ctrl+S) |
keyup | 释放按键时 | 是 | 否 | 输入验证、搜索框实时查询 |
keypress | 按下字符键时 | 否 | 是 | (已废弃,不推荐) |
(2) 代码示例
我们监听一个输入框的键盘事件,并从事件对象 event 中获取按键信息。
HTML:
<input type="text" id="keyInput" placeholder="在此输入内容...">
<p id="keyInfo"></p>
JavaScript:
const keyInput = document.getElementById('keyInput');
const keyInfo = document.getElementById('keyInfo');
// 监听按键按下
keyInput.addEventListener('keydown', function(event) {
// event.key: 返回按下的键名,如 'a', 'Enter', 'Shift'
// event.code: 返回物理按键码,如 'KeyA', 'Enter', 'ShiftLeft'
console.log(`Keydown: key="${event.key}", code="${event.code}"`);
});
// 监听按键释放
keyInput.addEventListener('keyup', function(event) {
keyInfo.textContent = `你刚刚按下了: ${event.key}`;
console.log(`Keyup: key="${event.key}", code="${event.code}"`);
});
三、表单事件 (Form Events)
表单是网页收据用户数据的主要方式,相关的事件对于数据验证和提交至关重要。
3.1.1 提交事件:submit
submit: 当用户点击<form>内的type="submit"按钮或在表单输入框中按回车时触发。该事件绑定在<form>元素上,而不是按钮上。
(1) 核心应用:阻止默认提交
在现代 Web 开发中,我们通常使用 JavaScript (AJAX) 异步提交表单数据,而不是让页面刷新。这时就需要 event.preventDefault() 来阻止表单的默认提交行为。
(2) 代码示例
<form id="myForm">
<label for="username">用户名:</label>
<input type="text" id="username" required>
<button type="submit">提交</button>
</form>
<p id="formStatus"></p>
const myForm = document.getElementById('myForm');
const formStatus = document.getElementById('formStatus');
myForm.addEventListener('submit', function(event) {
// 阻止表单的默认刷新页面的行为
event.preventDefault();
const username = document.getElementById('username').value;
formStatus.textContent = `你好, ${username}! 表单已通过 JS 处理,页面未刷新。`;
console.log('表单提交被拦截');
// 在这里可以添加 AJAX 代码将数据发送到服务器
});
3.1.2 值改变事件:change 与 input
change: 对于输入框 (<input>,<textarea>),在其失去焦点且值发生改变后触发。对于选择框 (<select>)、复选框 (<checkbox>)、单选按钮 (<radio>),在选项改变后立即触发。input: 当<input>或<textarea>的值发生任何改变时立即触发,包括输入、删除、粘贴等。此事件响应更实时。
(1) 场景对比
change: 适用于当用户完成输入后才进行的操作,如离开输入框时进行格式验证。input: 适用于需要实时反馈的场景,如实时显示输入字数、实时搜索建议。
(2) 代码示例
<label>实时反馈 (input event):</label>
<input type="text" id="inputEventExample">
<span id="inputFeedback"></span>
<br><br>
<label>失去焦点后反馈 (change event):</label>
<input type="text" id="changeEventExample">
<span id="changeFeedback"></span>
const inputEventExample = document.getElementById('inputEventExample');
const inputFeedback = document.getElementById('inputFeedback');
const changeEventExample = document.getElementById('changeEventExample');
const changeFeedback = document.getElementById('changeFeedback');
// input 事件,实时触发
inputEventExample.addEventListener('input', function() {
inputFeedback.textContent = `当前字数: ${inputEventExample.value.length}`;
});
// change 事件,失去焦点时触发
changeEventExample.addEventListener('change', function() {
changeFeedback.textContent = `最终内容: "${changeEventExample.value}"`;
});
3.1.3 焦点事件:focus 与 blur
focus: 当元素获得焦点时触发(例如,用户点击输入框)。blur: 当元素失去焦点时触发(例如,用户点击到页面其他地方)。
(1) 应用场景
输入框获得焦点时高亮边框、显示输入提示;失去焦点时进行数据验证。
(2) 代码示例
<style>
.focused {
border-color: #4a90e2;
box-shadow: 0 0 5px rgba(74, 144, 226, 0.5);
}
</style>
<input type="email" id="emailInput" placeholder="输入你的邮箱">
const emailInput = document.getElementById('emailInput');
// 获得焦点时添加高亮样式
emailInput.addEventListener('focus', function() {
emailInput.classList.add('focused');
});
// 失去焦点时移除高亮样式
emailInput.addEventListener('blur', function() {
emailInput.classList.remove('focused');
});
四、页面加载事件 (Page Load Events)
这类事件关系到脚本何时执行才是安全的,对于操作 DOM 的 JavaScript 代码尤为重要。
4.1.1 DOMContentLoaded
当初始的 HTML 文档被完全加载和解析完成之后,无需等待样式表、图像和子框架的完成加载,就会触发 DOMContentLoaded 事件。
这是执行大多数 DOM 操作脚本的最佳时机,因为它比 load 事件触发得更早,能让用户更快地看到页面的交互效果。
4.1.2 load
当整个页面及所有依赖资源(如样式表、图片、脚本等)都已完全加载完成后,window 对象上会触发 load 事件。
(1) 执行时机对比
我们可以用一个流程图来直观地理解这两个事件的触发顺序:
(2) 代码示例
通常我们将脚本放在 <body> 标签的末尾,或者使用这两个事件来确保 DOM 元素已经存在。
// 推荐:在DOM解析完成后立即执行
document.addEventListener('DOMContentLoaded', function() {
console.log('DOM 已加载!可以开始操作元素了。');
const header = document.querySelector('h1');
if (header) {
header.style.color = 'blue';
}
});
// 在页面所有资源(包括图片)加载完成后执行
window.addEventListener('load', function() {
console.log('页面所有资源已加载完毕!');
// 如果需要获取图片的尺寸等信息,应在这里操作
});
五、总结
恭喜你,完成了对 JavaScript 常见事件的探索!理解并熟练运用这些事件是构建动态、响应式网页的基石。让我们来回顾一下今天的核心知识点:
- 鼠标事件:处理用户的点击(
click,dblclick)、悬停(mouseover,mouseout)和移动(mousemove)操作,是实现视觉反馈和拖拽等效果的关键。 - 键盘事件:通过
keydown和keyup捕获用户的按键行为,可以实现快捷键功能和输入监控。event.key是获取按键信息的常用属性。 - 表单事件:
submit用于拦截表单提交并用 JS 处理;input和change分别用于实时和完成后的值改变监听;focus和blur则用于处理元素的焦点状态。 - 页面加载事件:
DOMContentLoaded是脚本执行的最佳时机,因为它在 DOM 树构建完成后立即触发;而load事件则需等待所有资源加载完毕。
掌握了这些事件类型,你就拥有了与用户进行深度交互的“武器库”。然而,当页面结构复杂,事件繁多时,事件的传播机制就显得尤为重要。在下一篇文章中,我们将深入探讨事件冒泡、事件捕获以及高效的事件委托模式,敬请期待!

2516

被折叠的 条评论
为什么被折叠?



