after this lesson, students will be able to:
- Describe what a browser event is
- Create a click event
- Use a named, referenced function as the click handler for the listener
Every kind of interactivity in the browser is an event: clicks, mouseovers, key presses, scrolling, resizing, loading the page, and more.
When you interact with the browser it checks to see if there is a listener for that interaction.
If there is a listener present, the browser will try to run any handlers for those interactions.
A handler is just a function that runs a desired procedure.
How can we set up a click event?
We need:
- An element to set it on
- A listener that listens for the event: on which element should the event take place
- A handler that runs the procedure we want to have happen when the event is triggered
Make a button in the html:
<button id='btn'>Click me</button>
Grab the button in the JS (DOM element):
const btn = document.querySelector('#btn')
Set an event listener:
We use the addEventListener
docs method:
btn.addEventListener('click', ()=>{
// what do you want to happen when the button is clicked?
})
The event listener takes a string as the first argument. There are just a few strings that it will recognize as valid events, and 'click' is one of them.
Add a function that runs what we want to have happen. This function is what handles the event and is called an event handler:
btn.addEventListener('click', ()=>{
console.log('button was clicked!')
})
Notice that we have supplied a function as an argument. The jargon for using a function as an argument to another function is callback
.
pseudo code for an event listener
elem.addEventListener(STRING, CALLBACK);
btn.addEventListener('click', ()=>{
const confirmation = document.createElement('p')
confirmation.innerText = 'The button hath been smashed.'
document.querySelector('body').appendChild(confirmation)
})
The handler that we used for our click was anonymous. It was a function that had no name. We just told the listener to run an anonymous function. We can give our function a name and thereby reuse that function with other event listeners.
We can abstract the anonymous function out and give it a name:
Separate function, not inside the listener:
const addText = () => {
const showConfirmation = () => {
const confirmation = document.createElement('p')
confirmation.innerText = 'The button hath been smashed.'
document.querySelector('body').appendChild(confirmation)
}
We can then reference it in the event Listener:
document.addEventListener('DOMContentLoaded', ()=>{
const btn = document.querySelector('#btn')
btn.addEventListener('click', showConfirmation)
})
With a named function, we can use the same handler for more than one DOM element.
Note that we do not invoke the function with parentheses. We do not want to invoke the function right away, we merely want to reference it to be invoked when the listener runs it.
- The function should be defined before it is used in the event listener
- When the function is invoked inside the event listener leave out the parentheses. We do not want to invoke the function right away! We merely want to reference that function in the listener.
Here the function is invoked and will run immediately:
btn.addEventListener('click', showConfirmation())
We don't want this! We only want the function to run when the user has clicked on the button.
Complete code:
const showConfirmation = () => {
const confirmation = document.createElement('p')
confirmation.innerText = 'The button hath been smashed.'
document.querySelector('body').appendChild(confirmation)
}
document.addEventListener('DOMContentLoaded', ()=>{
const btn = document.querySelector('#btn')
btn.addEventListener('click', showConfirmation)
})
Let's do something fancier, and toggle the background-color of the page using .toggleClass()
const changeClass = () => {
const bodyClasses = document.querySelector('body').classList
if (bodyClasses.length>0) {
bodyClasses.remove('black')
} else {
bodyClasses.add('black')
}
}
CSS:
.black {
background-color: black;
}
There are times where you want a DOM element to stop listening for an event.
Psuedo-code: elem.removeEventListener(EVENT, CALLBACK)
Let's set up the changeClass
function to remove the event listener from the button after it is clicked once (so the background is stuck as black after it is changed once).
const changeClass = () => {
const bodyClasses = document.querySelector('body').classList
if (bodyClasses.length>0) {
bodyClasses.remove('black')
} else {
bodyClasses.add('black')
}
document.querySelector('#btn').removeEventListener('click', changeClass)
}
- Add a div to your html that has some height, width, and a border so you can see it
- Set an event listener on the div that listens for the mouseover event and changes the background color of the div to yellow when there is a pointer on it.