mousemove
:光标在元素内移动时持续触发
mouseenter
/mouseleave
:进出元素边界触发(不冒泡)
mouseover
/mouseout
:进出元素或子元素触发(冒泡)
// 节流函数实现
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);
重点注意:高频触发事件需进行性能优化,避免过度重绘
mousedown
mouseup
click
dblclick(快速双击时)
element.addEventListener('click', (e) => {
console.log('Button:', e.button); // 0-左键, 1-中键, 2-右键
console.log('Modifiers:',
e.ctrlKey, e.shiftKey, e.altKey, e.metaKey);
});
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())
事件 | 触发时机 | 适用场景 |
---|---|---|
DOMContentLoaded | HTML解析完成 | DOM操作初始化 |
load | 所有资源加载完成 | 性能统计 |
beforeunload | 页面关闭前 | 数据保存提示 |
unload | 页面卸载时 | 清理操作 |
window.addEventListener('load', () => {
// 延迟加载非关键资源
const lazyImages = document.querySelectorAll('.lazy');
lazyImages.forEach(img => {
img.src = img.dataset.src;
});
});
const input = document.querySelector('input');
input.addEventListener('focus', () => {
input.parentElement.classList.add('active');
});
input.addEventListener('blur', () => {
if (!input.value) {
input.parentElement.classList.remove('active');
}
});
emailInput.addEventListener('input', () => {
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailInput.value);
emailInput.setCustomValidity(isValid ? '' : 'Invalid email');
});
重点提示:优先使用input
事件而非change
实现实时反馈
事件 | 触发阶段 | 典型应用 |
---|---|---|
keydown | 按键按下时 | 快捷键检测 |
keypress | 字符输入时 | 字符输入过滤 |
keyup | 按键释放时 | 组合键操作 |
document.addEventListener('keydown', (e) => {
if (e.ctrlKey && e.key === 's') {
e.preventDefault();
saveDocument();
}
});
兼容性注意:优先使用e.key
而非keyCode
document.querySelector('form').addEventListener('submit', (e) => {
if (!validateForm()) {
e.preventDefault();
showError('请完善表单信息');
}
});
form.addEventListener('reset', (e) => {
if (!confirm('确认要重置所有内容吗?')) {
e.preventDefault();
}
});
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;
});
以下哪种事件组合能准确检测文本选择操作?
A) click + keyup
B) select + mouseup
C) focus + input
D) mousedown + mouseup
实现表单提交时数据验证的正确方式是:
// 选项代码...
事件委托:利用冒泡机制优化性能
document.getElementById('list').addEventListener('click', (e) => {
if (e.target.tagName === 'LI') {
handleItemClick(e.target);
}
});
通过系统掌握这些事件处理技术,开发者可以构建出响应灵敏、用户体验优秀的Web应用。建议结合Chrome DevTools的Event Listener检测功能进行调试优化。