Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Efficient JS Event Listener on Hover

I have written the following script, and it is perfectly working.

function LogoHoverAdd() {
    this.classList.add("logo__container--hover");
}
function LogoHoverRemove() {
    this.classList.remove("logo__container--hover");
}

var logo = document.querySelector("h1");
logo.addEventListener("mouseover", LogoHoverAdd);
logo.addEventListener("mouseout", LogoHoverRemove);

I think, this method is very inefficient, since I have to implement a few of these event listeners. Therefore, I have tried to make this shorter by putting it together or using the ClassList Toggle function. Unfortunately, it has not worked yet.

How do I write this piece of code in a good way?

[[I am not using jquery.]]

like image 584
michael Avatar asked Sep 18 '25 14:09

michael


1 Answers

As it has become clear this is a Javascript question, here is a way you can create reusable functions.

function hover(element, enter, leave){
  element.addEventListener('mouseenter', enter)
  element.addEventListener('mouseleave', leave)
}

You can then pass your element and callback functions like so.

hover(document.querySelector('h1'), e => {
  // On hover
  e.target.classList.add("logo__container--hover")
}, e => {
  // On exit hover
  e.target.classList.remove("logo__container--hover")
})

You can reduce the lines of code too by modifying the hover function.

function hover(element, className){
  element.addEventListener('mouseenter', e => element.classList.add(className))
  element.addEventListener('mouseleave', e => element.classList.remove(className))
}

Then use it like so.

hover(document.querySelector('h1'), "logo__container--hover")

You can reuse this now for multiple elements scalably.


This was my previous answer: As JHeth mentioned, use CSS pseudo-classes instead.

h1{
  /* Style when not hovering */
}

h1:hover{
  /* Style when cursor is on element */
}
like image 197
Mike Avatar answered Sep 21 '25 04:09

Mike