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

JavaScript常用事件

一、鼠标移动事件

1.1 核心事件类型

  • mousemove:光标在元素内移动时持续触发

  • mouseenter/mouseleave:进出元素边界触发(不冒泡)

  • mouseover/mouseout:进出元素或子元素触发(冒泡)

1.2 性能优化策略

// 节流函数实现
function throttle(func, delay) {let lastCall = 0;return function(...args) {const now = new Date().getTime();if (now - lastCall < delay) return;lastCall = now;func.apply(this, args);}
}// 应用节流
element.addEventListener('mousemove', throttle((e) => {console.log(`X: ${e.clientX}, Y: ${e.clientY}`);
}), 100);

1.3 实战案例:实时坐标追踪

<div id="tracker" style="position: fixed;"></div><script>document.addEventListener('mousemove', (e) => {const tracker = document.getElementById('tracker');tracker.style.left = `${e.clientX + 15}px`;tracker.style.top = `${e.clientY + 15}px`;tracker.textContent = `(${e.clientX}, ${e.clientY})`;});
</script>

重点注意:高频触发事件需进行性能优化,避免过度重绘


二、点击事件体系

2.1 事件触发顺序

  1. mousedown

  2. mouseup

  3. click

  4. dblclick(快速双击时)

2.2 事件对象关键属性

element.addEventListener('click', (e) => {console.log('Button:', e.button); // 0-左键, 1-中键, 2-右键console.log('Modifiers:', e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);
});

2.3 实战案例:自定义右键菜单

document.addEventListener('contextmenu', (e) => {e.preventDefault();const menu = document.getElementById('custom-menu');menu.style.display = 'block';menu.style.left = `${e.clientX}px`;menu.style.top = `${e.clientY}px`;
});document.addEventListener('click', () => {document.getElementById('custom-menu').style.display = 'none';
});

常见错误:忘记阻止默认右键菜单(e.preventDefault())


三、页面生命周期事件

3.1 核心事件对比

事件触发时机适用场景
DOMContentLoadedHTML解析完成DOM操作初始化
load所有资源加载完成性能统计
beforeunload页面关闭前数据保存提示
unload页面卸载时清理操作

3.2 性能优化实践

window.addEventListener('load', () => {// 延迟加载非关键资源const lazyImages = document.querySelectorAll('.lazy');lazyImages.forEach(img => {img.src = img.dataset.src;});
});

四、表单焦点事件

4.1 事件触发机制

const input = document.querySelector('input');input.addEventListener('focus', () => {input.parentElement.classList.add('active');
});input.addEventListener('blur', () => {if (!input.value) {input.parentElement.classList.remove('active');}
});

4.2 实时验证案例

emailInput.addEventListener('input', () => {const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailInput.value);emailInput.setCustomValidity(isValid ? '' : 'Invalid email');
});

重点提示:优先使用input事件而非change实现实时反馈


五、键盘事件深度解析

5.1 事件类型对比表

事件触发阶段典型应用
keydown按键按下时快捷键检测
keypress字符输入时字符输入过滤
keyup按键释放时组合键操作

5.2 快捷键实现示例

document.addEventListener('keydown', (e) => {if (e.ctrlKey && e.key === 's') {e.preventDefault();saveDocument();}
});

兼容性注意:优先使用e.key而非keyCode


六、表单提交与重置

6.1 事件拦截实践

document.querySelector('form').addEventListener('submit', (e) => {if (!validateForm()) {e.preventDefault();showError('请完善表单信息');}
});

6.2 重置确认案例

form.addEventListener('reset', (e) => {if (!confirm('确认要重置所有内容吗?')) {e.preventDefault();}
});

七、选择与变更事件

7.1 事件对比分析

const textarea = document.querySelector('textarea');// 选择文本时触发
textarea.addEventListener('select', () => {console.log('Selected text:', textarea.value.substring(textarea.selectionStart, textarea.selectionEnd));
});// 值改变时触发(需失焦)
textarea.addEventListener('change', () => {console.log('Final value:', textarea.value);
});// 实时输入监听
textarea.addEventListener('input', () => {characterCount.textContent = textarea.value.length;
});

实战测试题

  1. 以下哪种事件组合能准确检测文本选择操作?
    A) click + keyup
    B) select + mouseup
    C) focus + input
    D) mousedown + mouseup

  2. 实现表单提交时数据验证的正确方式是:

// 选项代码...

总结与最佳实践

  • 事件委托:利用冒泡机制优化性能

document.getElementById('list').addEventListener('click', (e) => {if (e.target.tagName === 'LI') {handleItemClick(e.target);}
});
  • 内存管理:及时移除无用事件监听
  • 移动端适配:结合touch事件处理

        通过系统掌握这些事件处理技术,开发者可以构建出响应灵敏、用户体验优秀的Web应用。建议结合Chrome DevTools的Event Listener检测功能进行调试优化。

http://www.xdnf.cn/news/575767.html

相关文章:

  • 第P10周:Pytorch实现车牌识别
  • 如何解决测试覆盖率与迭代速度的冲突问题?
  • 手搓四人麻将程序
  • 正大模型视角下的高频交易因子构建策略研究
  • 视频监控管理平台EasyCVR工业与公共安全监控:监控中心与防爆系统如何集成?
  • 【免杀】C2免杀技术(八)APC注入
  • 数字化转型到底是什么?如何更好的理解数字化转型
  • NOSQL之Redis群集部署
  • 基于Browser Use + Playwright 实现AI Agent操作Web UI自动化
  • 运行时runtime是什么?(程序在运行过程中所依赖的环境、资源管理机制以及动态行为的总和)(包括内存分配、异常处理、线程调度、类型检查、资源访问等)
  • ip地址冲突说明什么问题?ip地址冲突影响网速吗
  • torch.matmul() VS torch.einsum()
  • 2025上半年软考准考证打印入口已开放!
  • ubuntu24.04+RTX5090D 显卡驱动安装
  • 支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!
  • 认知计算:迈向人类级智能的 AI 新范式
  • 关于对DDOS攻击的防御方法都有哪些?
  • EasyPan 使用及功能优化
  • 操作系统内存管理深度剖析:从虚拟内存机制到前沿技术探索
  • Spyglass:CDC官方Hands-on Training(一)
  • 什么是质量管理的核心要素?人、机、料、法、环、测解析
  • C++(26): 标准库 <queue>
  • 【原创】instagram 批量下载工具
  • 【优秀三方库研读】在 quill 开源库 Backend.h 知识点
  • docker面试题(3)
  • 滚珠丝杆的承载力是多少?
  • BISS0001 PIR红外感应IC:高性能热释电信号处理解决方案
  • MIMO 检测(6)--基于QR分解的ML检测器
  • 红杉资本2025 AI 峰会之Cybersecurity
  • 开源免费抓包工具:ProxyPin 的详细使用