【JavaScript-Day 41】JS 事件大全:click, keydown, submit, load 等常见事件详解与实战

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 陷阱:深入理解 letconst 的妙用
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】对象的“蓝图”详解:构造函数、newinstanceof 完全指南
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 点击事件:clickdblclick

  • 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 悬停与移出事件:mouseovermouseout

  • 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 按键过程:keydownkeypresskeyup

这三个事件描述了按键的完整过程,但它们的用途和触发时机有所不同。

  • 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 值改变事件:changeinput

  • 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 焦点事件:focusblur

  • 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) 执行时机对比

我们可以用一个流程图来直观地理解这两个事件的触发顺序:

浏览器 HTML解析器 JS脚本 外部资源(CSS,图片) 开始解析HTML文档 HTML解析完成,DOM树构建完毕 触发 DOMContentLoaded 事件 此时可以安全地操作DOM, 但图片可能还未显示 继续加载CSS、图片等资源 所有资源加载完毕 触发 load 事件 此时页面所有内容都已完全呈现 浏览器 HTML解析器 JS脚本 外部资源(CSS,图片)
(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 常见事件的探索!理解并熟练运用这些事件是构建动态、响应式网页的基石。让我们来回顾一下今天的核心知识点:

  1. 鼠标事件:处理用户的点击(click, dblclick)、悬停(mouseover, mouseout)和移动(mousemove)操作,是实现视觉反馈和拖拽等效果的关键。
  2. 键盘事件:通过 keydownkeyup 捕获用户的按键行为,可以实现快捷键功能和输入监控。event.key 是获取按键信息的常用属性。
  3. 表单事件submit 用于拦截表单提交并用 JS 处理;inputchange 分别用于实时和完成后的值改变监听;focusblur 则用于处理元素的焦点状态。
  4. 页面加载事件DOMContentLoaded 是脚本执行的最佳时机,因为它在 DOM 树构建完成后立即触发;而 load 事件则需等待所有资源加载完毕。

掌握了这些事件类型,你就拥有了与用户进行深度交互的“武器库”。然而,当页面结构复杂,事件繁多时,事件的传播机制就显得尤为重要。在下一篇文章中,我们将深入探讨事件冒泡、事件捕获以及高效的事件委托模式,敬请期待!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴师兄大模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值