当前位置: 首页 > news >正文

【Java Web学习 | 第13篇】JavaScript(7) - 事件绑定 + 事件

【Java Web学习 | 第13篇】JavaScript(7) - 事件绑定与事件机制(2026最新版)

恭喜你完成 DOM 操作!
现在进入事件绑定与事件机制,这是 JavaScript 实现用户交互(点击、输入、提交、滚动等)的核心技术。在 Java Web 项目中,几乎所有动态功能(表单提交、按钮操作、实时验证、列表交互)都依赖事件系统。

掌握本篇后,你就能优雅地处理用户行为,并为后续Fetch 调用 Spring Boot API做好准备。

1. 事件绑定三种方式(推荐顺序)

方式1:推荐 ——addEventListener(现代标准)
constbtn=document.querySelector('#submitBtn');btn.addEventListener('click',functionhandler(e){console.log('按钮被点击了');// e 是事件对象(Event)});

优点

  • 可以绑定多个事件处理函数
  • 支持事件委托
  • 可以移除监听(removeEventListener
  • 推荐在所有生产项目中使用
方式2:HTML 内联(学习阶段可用,生产不推荐)
<buttononclick="handleClick()">点击我</button><script>functionhandleClick(){alert('点击了!');}</script>
方式3:DOM0 方式(旧方式,不推荐)
btn.onclick=function(){console.log('点击');};// 缺点:只能绑定一个,后绑定的会覆盖前面的

2. 事件对象(Event)常用属性与方法

element.addEventListener('click',(e)=>{console.log(e.type);// "click"console.log(e.target);// 实际被点击的元素console.log(e.currentTarget);// 当前绑定事件的元素(委托时很重要)console.log(e.clientX,e.clientY);// 鼠标相对于视口的坐标console.log(e.pageX,e.pageY);// 相对于文档的坐标e.preventDefault();// 阻止默认行为(如表单提交、链接跳转)e.stopPropagation();// 阻止事件冒泡});

3. 常用事件类型速查(Java Web 高频)

事件类别常用事件典型使用场景
鼠标事件click, dblclick, mousedown, mouseup, mouseover, mouseout, mousemove按钮点击、悬停效果
键盘事件keydown, keyup, keypress快捷键、表单输入控制
表单事件input, change, focus, blur, submit实时验证、表单提交
页面事件load, DOMContentLoaded, resize, scroll页面初始化、懒加载
触摸事件touchstart, touchmove, touchend移动端交互
其他drag, drop, contextmenu拖拽、右键菜单

最常用事件组合

  • DOMContentLoaded:DOM 解析完就执行(比load更快)
  • input:实时监听输入框变化(搜索、防抖常用)
  • submit:表单提交

4. 事件冒泡与捕获(Event Bubbling & Capturing)

事件默认从目标元素向上冒泡到document

// 事件委托(最高性能写法,推荐!)document.getElementById('userList').addEventListener('click',(e)=>{// 判断是否点击了删除按钮if(e.target.closest('.delete-btn')){constitem=e.target.closest('.user-item');console.log('删除用户',item.dataset.id);item.remove();}});

事件委托优点

  • 只需绑定一个监听器
  • 新增的动态元素自动支持事件
  • 性能更好

5. 完整实战示例(用户列表 + 表单提交模拟)

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>事件绑定实战 - Java Web</title><style>.user-item{padding:12px;margin:8px 0;background:#f8f9fa;border-radius:8px;}.delete-btn{color:#dc3545;margin-left:15px;}</style></head><body><h1>用户管理</h1><formid="userForm"><inputtype="text"id="username"placeholder="用户名"required><inputtype="number"id="age"placeholder="年龄"required><buttontype="submit">添加用户</button></form><divid="userList"></div><script>constusers=[];constuserList=document.getElementById('userList');constform=document.getElementById('userForm');// 渲染函数functionrenderUsers(){userList.innerHTML=users.map((user,index)=>`<div class="user-item">${index}">${user.username}${user.age}岁) <button class="delete-btn">${index}">删除</button> </div>`).join('');}// 事件委托(推荐写法)userList.addEventListener('click',(e)=>{if(e.target.classList.contains('delete-btn')){constindex=parseInt(e.target.dataset.index);users.splice(index,1);renderUsers();}});// 表单提交事件form.addEventListener('submit',(e)=>{e.preventDefault();// 阻止默认提交constusername=document.getElementById('username').value.trim();constage=parseInt(document.getElementById('age').value);if(username&&age){users.push({username,age});renderUsers();// 清空表单form.reset();console.log('用户添加成功,当前用户数:',users.length);}});// 输入实时提示(input 事件)document.getElementById('username').addEventListener('input',(e)=>{if(e.target.value.length>10){e.target.style.borderColor='red';}else{e.target.style.borderColor='#007bff';}});// 页面加载完成后初始化document.addEventListener('DOMContentLoaded',()=>{console.log('DOM 已加载完成,开始绑定事件');renderUsers();});</script></body></html>

6. 防抖与节流(实际项目必备)

// 防抖(用户输入停止后一段时间才执行,常用于搜索)functiondebounce(fn,delay=300){lettimer=null;returnfunction(...args){clearTimeout(timer);timer=setTimeout(()=>fn.apply(this,args),delay);};}// 使用示例constsearchInput=document.getElementById('search');searchInput.addEventListener('input',debounce((e)=>{console.log('搜索关键词:',e.target.value);// 这里可以调用后端搜索 API},500));

7. 小练习(建议立即完成)

  1. 在上面示例中添加“清空所有用户”按钮,点击后清空列表。
  2. 为年龄输入框添加blur事件:离开焦点时如果年龄 < 18,提示警告并清空。
  3. 使用事件委托实现:点击任意.user-item时,高亮该项(添加 active 类)。
  4. 实现键盘快捷键:按下Esc键时清空表单。

下一篇文章预告:《【Java Web学习 | 第14篇】JavaScript(8) - 异步编程(Promise + async/await)与 Fetch API》

我们将进入异步编程,学习如何使用fetch调用 Spring Boot 后端 REST 接口,实现真正的增删改查操作。


本篇核心总结

  • 绑定事件:优先使用addEventListener
  • 处理事件:记住e.preventDefault()e.stopPropagation()
  • 高性能:优先使用事件委托
  • 表单:一定要preventDefault()阻止默认提交

有问题随时问:

  • 想要防抖 + 节流完整工具函数
  • 需要更多表单验证事件示例
  • 或直接进入异步 + Fetch篇?

回复“给我练习答案”或“下一篇 Fetch”,我立刻继续!

事件机制是 JavaScript 与用户“对话”的方式,掌握后你的页面才能真正“动”起来。继续加油,下一章我们就要和后端真正交互了!🚀

http://www.jsqmd.com/news/563750/

相关文章:

  • intv_ai_mk11部署教程:Llama中型模型网页版快速启动与参数调优实战
  • 墨语灵犀生成ComfyUI自定义节点:可视化AI工作流拓展
  • 2026年质量好的济宁装修公司/装修公司人气榜 - 品牌宣传支持者
  • 摄影测量学:从理论到4D产品生产的核心链路解析
  • 2026年诚信的山东评职称专著/评职称著作/评职称专著/评职称论文实力公司推荐 - 品牌宣传支持者
  • PyTorch 2.8镜像一文详解:xFormers+Accelerate+Diffusers全栈预装环境实测
  • 机器人装备直流无刷电机一体化服务商:空心杯电机/驱动器定制/驱动器开发/伺服轮毂电机/伺服防爆电机/低压伺服电机/选择指南 - 优质品牌商家
  • BCI Competition IV 2a数据集实战:如何用MATLAB预处理EEG信号并构建四分类运动想象模型
  • 2026年知名的旧房翻新装修公司/装修公司综合排名榜 - 品牌宣传支持者
  • 2026攀枝花殡葬用品优质品牌推荐榜:攀枝花殡葬鲜花布置/殡葬下葬服务/殡葬净身穿衣/殡葬卫生棺/殡葬寿衣/殡葬用品纸棺/选择指南 - 优质品牌商家
  • CMake实战:用ExternalProject_Add一键集成第三方库(附spdlog完整配置)
  • 电力电子工程师必看:Psim 2022三相锁相环仿真避坑指南
  • ClawdBot惊艳效果案例:PaddleOCR识别模糊手写体+LibreTranslate精准输出
  • AudioSeal Pixel Studio部署教程:Flink实时流式音频水印处理架构设计
  • 2026年中式风婚礼堂/轻奢婚礼堂高评分公司推荐 - 品牌宣传支持者
  • JSON For You安全特性详解:保护你的JSON数据隐私和安全
  • 从Claude Agent Skills到Hatchify多Agent:我是如何把团队知识库变成AI‘技能包’的
  • Phi-3-Mini-128K一键部署教程:3步搞定Ubuntu环境与模型启动
  • 多轴控制方案对比:S7-1200+CM CANopen模块为何成为KINCO伺服性价比之选?
  • java篇26-Java匿名内部类、invoke方法、动态代理
  • 别再让单片机‘死机’!手把手教你用TPV6823设计一个靠谱的硬件看门狗电路
  • GLM-4.1V-9B-Base行业落地:建筑图纸局部区域语义理解与标注建议
  • 告别复制粘贴:用Python自动化提取微信SQLite数据库中特定联系人的聊天记录
  • 四元数微分方程的数值解法对比:欧拉法 vs 龙格库塔法
  • Kandinsky-5.0-I2V-Lite-5s镜像免配置优势:内置VAE/CLIP/Qwen2.5-VL,开箱即用
  • CEF编译太折腾?我整理了从107到113多个版本的已编译支持MP4的CEF库(含32/64位)
  • AI工程师薪资谈判指南:软件测试从业者的行业数据与策略
  • Go的sync.Map实现原理:read-copy-update模式
  • uniapp学习1,hello world 项目,打包到微信小程序,贪吃蛇小游戏
  • 避开Hugging Face跳转坑!手把手教你从GitHub Releases正确下载YOLOv10预训练模型