掌握事件监听、冒泡、捕获和委托
// 添加事件监听器
const button = document.querySelector('button');
// 基本语法
button.addEventListener('click', function(event) {
console.log('Button clicked!');
});
// 使用箭头函数
button.addEventListener('click', (event) => {
console.log('Button clicked!');
});
// 移除事件监听器
function handleClick(event) {
console.log('Button clicked!');
}
button.addEventListener('click', handleClick);
button.removeEventListener('click', handleClick);// 事件对象
button.addEventListener('click', (event) => {
// 事件类型
console.log(event.type); // 'click'
// 目标元素
console.log(event.target); // button element
// 当前元素
console.log(event.currentTarget); // button element
// 阻止默认行为
event.preventDefault();
// 阻止冒泡
event.stopPropagation();
// 鼠标位置
console.log(event.clientX, event.clientY);
console.log(event.pageX, event.pageY);
});// HTML 结构
// <div id="outer">
// <div id="inner">
// <button id="btn">Click me</button>
//// HTML 结构
// <ul id="list">
// <li>Item 1</li>
// <li>Item 2</li>
// <li>Item 3</li>
// </ul>
const list = document.getElementById('list');
// 使用事件委托
list.addEventListener('click', (event) => {
if (event.target.tagName === 'LI') {
console.log('List item clicked:', event.target.textContent);
}
});
// 动态添加的元素也会触发事件
const newItem = document.createElement('li');
newItem.textContent = 'Item 4';
list.appendChild(newItem);// 创建自定义事件
const customEvent = new CustomEvent('customEvent', {
detail: {
message: 'Hello from custom event',
time: new Date()
},
bubbles: true,
cancelable: true
});
// 监听自定义事件
const element = document.querySelector('.container');
element.addEventListener('customEvent', (event) => {
console.log(event.detail.message);
console.log(event.detail.time);
});
// 触发自定义事件
element.dispatchEvent(customEvent);// 防抖函数
function debounce(func, wait) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => {
func.apply(this, args);
}, wait);
};
}
// 使用防抖
const handleInput = debounce((event) => {
console.log('Input value:', event.target.value);
}, 300);
const input = document.querySelector('input');
input.addEventListener('input', handleInput);// 节流函数
function throttle(func, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => {
inThrottle = false;
}, limit);
}
};
}
// 使用节流
const handleScroll = throttle(() => {
console.log('Scroll position:', window.scrollY);
}, 100);
window.addEventListener('scroll', handleScroll);