Handling Events

Some models of programming require you to choreograph the computation from start to finish in a main function. This is not typically what you see in browser-based scripts in which the viewer drives the consumption of the content. Instead, you schedule your code to be run when certain events happen, including mouse clicks, window resizing, and keypresses.

A function that runs when an event happens is an event listener. You register an event listener by calling the addEventListener method of the element or object that triggers the event. For example, here is a page with two buttons that change the background color of the page when clicked on:

html
js
preview

Notice how only the names of the red and blue functions are passed as parameters to addEventListener. If you had included parentheses after their names, then you would be calling these functions and passing their returned values to addEventListener. You want to pass the functions themselves, so you leave off the parentheses. Try adding parentheses after these names.

You normally set the background color in a stylesheet, but styles can also be set programmatically through an element's style property.

All event listeners receive as a parameter an event object from the browser that gives information about the event. For instance, a mouse wheel event provides information about how much the wheel was scrolled:

html
js
preview

Try opening your developer tools and scrolling the mouse wheel over the image. What values do you see when you scroll up? When your scroll down?

Notice how the window still scrolls as you scroll on the image. That's because the scroll event bubbles up the page structure, and the window itself has an event listener that moves the page up and down. To stop a builtin event listener from running, you call event.preventDefault.

Suppose you want the image to be zoomed in or out on wheel events. You add a scale factor that grows and shrinks on each wheel event and use it to apply a scale transform to the image:

html
js
preview

The variable scale is declared using the keyword let, whereas picture is declared using const. A let variable may be reassigned, but a const variable may not. You should favor const to prevent accidental overwrites and to communicate that a variable will doggedly hang on to its value. In this case, however, you want scale to be overwritten.

While an element's style can be set programmatically, you may prefer to define the alternate styles using a class selector and use event listeners to add or remove the class from an element. For example, suppose you are building a quizzing app and have this structure:

html
css
js
preview

You want the answer to be hidden initially. When the button is clicked, you add the class revealed to the answer element, which applies a new ruleset from the stylesheet:

html
css
js
preview

The builtin classList provides several methods for modifying or querying an element's classes. Try modifying this page so that the viewer can hide the revealed answer.