"Welcome back to Jurassic Park," greets you Ray Arnold, the chief systems engineer. "Today I'll show you how the most critical aspect of our systems works - interactivity. Every system in the park, from the security gates to the dinosaur monitoring, must respond to various signals in real time."
Ray leads you to the central control panel, where hundreds of indicators blink and pulse. "Look," he points at the screen, "all these systems listen for events - a gate opening, movement in an enclosure, a temperature change. In JavaScript, we work exactly the same way."
Events are a fundamental communication mechanism in the browser. Every user interaction - a click, a mouse movement, a key press - generates an event that we can respond to.
1// Similar to a motion sensor in a dinosaur enclosure
2const motionSensor = document.getElementById('dino-enclosure');
3
4motionSensor.addEventListener('click', function() {
5 console.log('Activity detected in the enclosure!');
6 checkDinosaurStatus();
7});"In Jurassic Park," Ray continues, "we have thousands of sensors. Each one sends signals to the control center. If we had to constantly check every sensor, the system would collapse. Instead, sensors send events only when something happens."
The browser implements a so-called Event-Driven Architecture - an architecture driven by events. This means that code doesn't execute sequentially from top to bottom, but reacts to events occurring in the system.
1// Code registers listeners and waits for events
2console.log('System active - listening...');
3
4document.addEventListener('click', () => {
5 console.log('Click registered!');
6});
7
8document.addEventListener('keydown', () => {
9 console.log('Key pressed!');
10});
11
12// The program doesn't end - it waits for events
13console.log('All systems ready');Ray shows you a list on the screen. "We have dozens of sensor types in the park. Similarly, JavaScript has dozens of event types:"
Mouse events:
click - click (like an emergency button)dblclick - double clickmouseenter / mouseleave - mouse entering/leavingmousemove - mouse movement (like a motion sensor)mousedown / mouseup - pressing/releasing a mouse buttonKeyboard events:
keydown - key pressedkeyup - key releasedkeypress - character entered by the userForm events:
submit - form submissionchange - field value changedinput - text inputfocus / blur - field activation/deactivationDocument events:
DOMContentLoaded - DOM ready (like a system going online)load - all resources loadedscroll - page scrollingresize - window resize"Every event carries information with it," Ray explains, showing a detailed sensor report. "Similarly, every Event object in JavaScript contains data about what happened."
1const enclosureMap = document.getElementById('park-map');
2
3enclosureMap.addEventListener('click', function(event) {
4 // The event object contains detailed information
5
6 console.log('Event type:', event.type); // 'click'
7 console.log('Target element:', event.target); // the clicked element
8 console.log('Position X:', event.clientX); // X coordinate
9 console.log('Position Y:', event.clientY); // Y coordinate
10 console.log('Mouse button:', event.button); // 0=left, 1=middle, 2=right
11 console.log('Ctrl pressed?', event.ctrlKey); // true/false
12 console.log('Shift pressed?', event.shiftKey); // true/false
13
14 // We can use this information for precise reactions
15 if (event.ctrlKey) {
16 selectMultipleDinosaurs(event.target);
17 } else {
18 selectSingleDinosaur(event.target);
19 }
20});Ray points to the large screen showing maps of all enclosures. "Without the event system, we'd have to check every sensor every second. That would be inefficient and resource-heavy. Events allow systems to react instantly and only when needed."
In web applications, events enable:
"Let's see it in action," says Ray, opening a code panel. "Let's create a simple enclosure monitoring system."
1// T-Rex enclosure monitoring system
2const trexEnclosure = {
3 temperature: 28,
4 humidity: 65,
5 feedingSchedule: '14:00',
6 lastActivity: null,
7
8 initialize() {
9 // Registering listeners for various systems
10 const tempSensor = document.getElementById('temp-sensor');
11 const feedButton = document.getElementById('feed-button');
12 const activityMonitor = document.getElementById('activity-monitor');
13
14 // Temperature monitoring
15 tempSensor.addEventListener('change', (e) => {
16 this.temperature = parseFloat(e.target.value);
17 this.checkConditions();
18 });
19
20 // Feeding system
21 feedButton.addEventListener('click', () => {
22 this.feedDinosaur();
23 });
24
25 // Activity detection
26 activityMonitor.addEventListener('motion', (e) => {
27 this.lastActivity = new Date();
28 this.logActivity(e.detail);
29 });
30
31 console.log('T-Rex monitoring system active');
32 },
33
34 checkConditions() {
35 if (this.temperature > 35) {
36 this.triggerAlert('Temperature too high!', 'warning');
37 } else if (this.temperature < 20) {
38 this.triggerAlert('Temperature too low!', 'warning');
39 } else {
40 console.log('Conditions optimal');
41 }
42 },
43
44 feedDinosaur() {
45 console.log('Starting T-Rex feeding procedure...');
46 this.triggerAlert('Feeding in progress', 'info');
47
48 setTimeout(() => {
49 console.log('Feeding completed successfully');
50 this.triggerAlert('Feeding completed', 'success');
51 }, 3000);
52 },
53
54 logActivity(details) {
55 console.log(`Activity registered: ${details.type} at ${this.lastActivity.toLocaleTimeString()}`);
56 },
57
58 triggerAlert(message, level) {
59 const alertEvent = new CustomEvent('parkAlert', {
60 detail: { message, level, timestamp: new Date() }
61 });
62 document.dispatchEvent(alertEvent);
63 }
64};
65
66// System initialization
67document.addEventListener('DOMContentLoaded', () => {
68 trexEnclosure.initialize();
69});
70
71// Central alert system
72document.addEventListener('parkAlert', (e) => {
73 const { message, level, timestamp } = e.detail;
74 console.log(`[${timestamp.toLocaleTimeString()}] ${level.toUpperCase()}: ${message}`);
75});"Through years of working on Jurassic Park systems," says Ray, "I've learned a few key rules:"
1const emergencyButton = document.getElementById('emergency');
2
3if (emergencyButton) {
4 emergencyButton.addEventListener('click', evacuatePark);
5} else {
6 console.error('CRITICAL ERROR: Emergency button not found!');
7}1function setupTemporaryMonitoring() {
2 const sensor = document.getElementById('temp-sensor');
3
4 function handleReading(e) {
5 console.log('Reading:', e.target.value);
6 }
7
8 sensor.addEventListener('change', handleReading);
9
10 // After 1 hour, disable monitoring
11 setTimeout(() => {
12 sensor.removeEventListener('change', handleReading);
13 console.log('Monitoring ended');
14 }, 3600000);
15}1// Better
2function handleEmergencyClick(event) {
3 console.log('Activating emergency protocol');
4 evacuatePark();
5}
6
7emergencyButton.addEventListener('click', handleEmergencyClick);
8
9// Than
10emergencyButton.addEventListener('click', function(e) {
11 console.log('Activating emergency protocol');
12 evacuatePark();
13});1class EnclosureMonitor {
2 constructor(enclosureId) {
3 this.enclosure = document.getElementById(enclosureId);
4 this.initializeEvents();
5 }
6
7 initializeEvents() {
8 // All event listeners in one place
9 this.enclosure.addEventListener('click', (e) => this.handleClick(e));
10 this.enclosure.addEventListener('mouseenter', (e) => this.handleMouseEnter(e));
11 this.enclosure.addEventListener('mouseleave', (e) => this.handleMouseLeave(e));
12 }
13
14 handleClick(event) {
15 console.log('Enclosure clicked');
16 }
17
18 handleMouseEnter(event) {
19 this.enclosure.classList.add('highlighted');
20 }
21
22 handleMouseLeave(event) {
23 this.enclosure.classList.remove('highlighted');
24 }
25}"Events are the core of every interactive system," Ray summarizes. "Without them, our applications would be static and useless - like a park without security systems."
Key concepts:
In the following lessons, we'll dive deeper into advanced event handling techniques, learning about propagation, delegation, and custom events.