JavaScript Event Handling Cheatsheet
Adding and Removing Listeners
element.addEventListener('click', handleClick);
element.removeEventListener('click', handleClick);
element.addEventListener('click', () => console.log('clicked'));
function handleClick(event) {
console.log('clicked');
}
element.addEventListener('click', handleClick);
Common Event Types
element.addEventListener('click', handler);
element.addEventListener('dblclick', handler);
element.addEventListener('mouseenter', handler);
element.addEventListener('mouseleave', handler);
element.addEventListener('mousedown', handler);
element.addEventListener('mouseup', handler);
element.addEventListener('mousemove', handler);
element.addEventListener('keydown', handler);
element.addEventListener('keyup', handler);
element.addEventListener('keypress', handler);
element.addEventListener('submit', handler);
element.addEventListener('change', handler);
element.addEventListener('input', handler);
element.addEventListener('focus', handler);
element.addEventListener('blur', handler);
document.addEventListener('DOMContentLoaded', handler);
window.addEventListener('load', handler);
window.addEventListener('resize', handler);
window.addEventListener('scroll', handler);
Common Properties
function handleEvent(event) {
console.log(event.target);
console.log(event.currentTarget);
console.log(event.clientX, event.clientY);
console.log(event.button);
console.log(event.key);
console.log(event.code);
console.log(event.ctrlKey);
console.log(event.shiftKey);
console.log(event.altKey);
console.log(event.target.value);
event.preventDefault();
event.stopPropagation();
}
Event Phases
element.addEventListener('click', handler);
element.addEventListener('click', handler, true);
parent.addEventListener('click', () => console.log('Parent clicked'));
child.addEventListener('click', () => console.log('Child clicked'));
Stop Propagation
function handleClick(event) {
console.log('Element clicked');
event.stopPropagation();
}
Efficient Event Handling
const items = document.querySelectorAll('.item');
items.forEach(item => {
item.addEventListener('click', handleItemClick);
});
document.querySelector('.container').addEventListener('click', (event) => {
if (event.target.matches('.item')) {
handleItemClick(event);
}
});
document.addEventListener('click', (event) => {
if (event.target.matches('.button, .link, .item')) {
handleClick(event);
}
});
Dynamic Content
document.querySelector('.list').addEventListener('click', (event) => {
if (event.target.classList.contains('delete-btn')) {
deleteItem(event.target.dataset.id);
}
});
function addItem(text) {
const item = document.createElement('li');
item.innerHTML = `${text} <button class="delete-btn" data-id="${Date.now()}">Delete</button>`;
document.querySelector('.list').appendChild(item);
}
Form Events
const form = document.querySelector('form');
form.addEventListener('submit', (event) => {
event.preventDefault();
const formData = new FormData(form);
const data = Object.fromEntries(formData);
console.log(data);
});
const input = document.querySelector('input[type="email"]');
input.addEventListener('input', (event) => {
const isValid = event.target.checkValidity();
event.target.classList.toggle('invalid', !isValid);
});
input.addEventListener('blur', validateField);
input.addEventListener('input', debounce(validateField, 300));
File Input
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (event) => {
const files = event.target.files;
for (const file of files) {
console.log('File:', file.name, file.size, file.type);
}
});
const dropZone = document.querySelector('.drop-zone');
dropZone.addEventListener('dragover', (event) => {
event.preventDefault();
dropZone.classList.add('dragover');
});
dropZone.addEventListener('drop', (event) => {
event.preventDefault();
dropZone.classList.remove('dragover');
const files = event.dataTransfer.files;
handleFiles(files);
});
Key Handling
document.addEventListener('keydown', (event) => {
if (event.key === 'Enter') {
submitForm();
}
if (event.key === 'Escape') {
closeModal();
}
if (event.ctrlKey && event.key === 's') {
event.preventDefault();
saveDocument();
}
});
document.addEventListener('keydown', (event) => {
if (event.ctrlKey && event.shiftKey && event.key === 'S') {
saveAs();
}
});
const numberInput = document.querySelector('input[type="number"]');
numberInput.addEventListener('keypress', (event) => {
if (!/[0-9]/.test(event.key)) {
event.preventDefault();
}
});
Creating and Dispatching
const customEvent = new CustomEvent('userAction', {
detail: { action: 'login', userId: 123 },
bubbles: true,
cancelable: true
});
element.dispatchEvent(customEvent);
element.addEventListener('userAction', (event) => {
console.log('User action:', event.detail);
});
function triggerEvent(element, eventName, data) {
const event = new CustomEvent(eventName, {
detail: data,
bubbles: true
});
element.dispatchEvent(event);
}
Debouncing and Throttling
function debounce(func, delay) {
let timeoutId;
return function(...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func.apply(this, args), delay);
};
}
function throttle(func, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
const debouncedSearch = debounce(searchFunction, 300);
const throttledScroll = throttle(handleScroll, 100);
searchInput.addEventListener('input', debouncedSearch);
window.addEventListener('scroll', throttledScroll);
Memory Management
class Component {
constructor() {
this.boundHandler = this.handleClick.bind(this);
this.element.addEventListener('click', this.boundHandler);
}
destroy() {
this.element.removeEventListener('click', this.boundHandler);
}
}
const listeners = new WeakMap();
function addListenerWithCleanup(element, event, handler) {
const boundHandler = handler.bind(element);
listeners.set(element, { event, handler: boundHandler });
element.addEventListener(event, boundHandler);
}
Modal Handling
const modal = document.querySelector('.modal');
const openBtn = document.querySelector('.open-modal');
const closeBtn = document.querySelector('.close-modal');
openBtn.addEventListener('click', () => modal.classList.add('open'));
closeBtn.addEventListener('click', () => modal.classList.remove('open'));
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape' && modal.classList.contains('open')) {
modal.classList.remove('open');
}
});
modal.addEventListener('click', (event) => {
if (event.target === modal) {
modal.classList.remove('open');
}
});
Toggle Functionality
function toggleClass(element, className) {
element.classList.toggle(className);
}
function toggleVisibility(element) {
element.style.display = element.style.display === 'none' ? 'block' : 'none';
}
button.addEventListener('click', () => toggleClass(menu, 'open'));
Infinite Scroll
let page = 1;
const loadMoreThreshold = 100;
window.addEventListener('scroll', throttle(() => {
const scrollTop = window.scrollY;
const windowHeight = window.innerHeight;
const documentHeight = document.documentElement.scrollHeight;
if (documentHeight - scrollTop - windowHeight < loadMoreThreshold) {
loadMoreContent(page++);
}
}, 100));