-1

I have this code below from another post. It sends a message to the console everytime a certain element with an id was hovered over or not. How would I be able to do the same except it sends a message to the console everytime a certain tag was hovered over.

function isHover(e) {
 return (e.parentElement.querySelector(':hover') === e);
}


var myDiv = document.getElementById('mydiv');;
document.addEventListener('mousemove', function checkHover() {
 var hovered = isHover(myDiv);
 if (hovered !== checkHover.hovered) {
   console.log(hovered ? 'hovered' : 'not hovered');
   checkHover.hovered = hovered;
 }
});

--pure javascript to check if something has hover (without setting on mouseover/out)

1 Answers1

2

Add the listener to the document like you're doing, but in the mousemove handler, use .closest to see if the target.target or an ancestor matches a particular tag. For example, for divs:

document.addEventListener('mousemove', ({ target }) => {
  console.log(target.closest('div') ? 'div hovered' : 'no div hovered');
});
<div>some div</div>
<span>some span</span>
<div>some other div
  <span>some nested span in a div</span>
</div>
<ul><li>some li</li></ul>

You can assign to a persistent variable if you like:

let hovered = false;
document.addEventListener('mousemove', ({ target }) => {
  hovered = Boolean(target.closest('div'));
  console.log(hovered ? 'div hovered' : 'no div hovered');
});
document.addEventListener('click', () => {
  console.log('currently:', hovered);
});
<div>some div</div>
<span>some span</span>
<div>some other div
  <span>some nested span in a div</span>
</div>
<ul><li>some li</li></ul>

You can also watch for hover over an <input>:

let hovered = false;
document.addEventListener('mousemove', ({ target }) => {
  hovered = Boolean(target.closest('input'));
  console.log(hovered ? 'input hovered' : 'no input hovered');
});
document.addEventListener('click', () => {
  console.log('currently:', hovered);
});
<div>some div</div>
<span>some span</span>
<div>some other div
  <span>some nested span in a div</span>
</div>
<ul><li>some li</li></ul>
<input>
CertainPerformance
  • 356,069
  • 52
  • 309
  • 320