Custom Events

Create and dispatch custom events

JavaScriptIntermediate
JavaScript
// Method 1: Create custom event
const customEvent = new CustomEvent('myCustomEvent', {
    detail: { message: 'Hello from custom event', data: 123 },
    bubbles: true,
    cancelable: true
});

// Listen for custom event
document.addEventListener('myCustomEvent', function(event) {
    console.log('Custom event received:', event.detail);
    console.log('Message:', event.detail.message);
    console.log('Data:', event.detail.data);
});

// Dispatch custom event
document.dispatchEvent(customEvent);

// Method 2: Custom event on specific element
const button = document.getElementById('myButton');

button.addEventListener('buttonClicked', function(e) {
    console.log('Button custom event:', e.detail);
});

const buttonEvent = new CustomEvent('buttonClicked', {
    detail: { buttonId: 'myButton', timestamp: Date.now() }
});

button.dispatchEvent(buttonEvent);

// Method 3: Event with data
const dataEvent = new CustomEvent('dataUpdate', {
    detail: {
        userId: 123,
        action: 'update',
        payload: { name: 'John', age: 30 }
    }
});

document.addEventListener('dataUpdate', function(e) {
    console.log('User ID:', e.detail.userId);
    console.log('Action:', e.detail.action);
    console.log('Payload:', e.detail.payload);
});

document.dispatchEvent(dataEvent);

// Method 4: Event with validation
function createValidatedEvent(type, data) {
    if (!data || typeof data !== 'object') {
        throw new Error('Data must be an object');
    }
    
    return new CustomEvent(type, {
        detail: data,
        bubbles: true,
        cancelable: true
    });
}

const validatedEvent = createValidatedEvent('validated', { value: 42 });
document.dispatchEvent(validatedEvent);

Output

Custom event received: { message: 'Hello from custom event', data: 123 }
Message: Hello from custom event
Data: 123
User ID: 123
Action: update
Payload: { name: 'John', age: 30 }

Custom events enable communication between components.

CustomEvent Constructor

  • type: Event name
  • detail: Custom data
  • bubbles: Propagate up DOM
  • cancelable: Can be prevented

Use Cases

  • Component communication
  • Decoupled architecture
  • Custom notifications
  • Plugin systems

Benefits

  • Loose coupling
  • Reusable components
  • Better organization
  • Event-driven architecture