JSFIDDLE: http://jsfiddle.net/yL1uu0hv/
I'm trying to create a simple hoverintent using setTimeout. I'm not sure what the problem is with the provided code. If I comment out hovertimer = setTimeout(function(){
and }, 500);
then the addClass I'm using works. If the aforementioned items are active (not commented out), addClass doesn't work.
I'm also getting some kind of error due to the syntax of $('ul#megamenulist li').each($(this).addClass(opts.mmactiveclass.mmclassname));
and it keeps bubbling even with doing nothing.
What's supposed to happen is that after X milliseconds of hovering over the item, the class 'active' is supposed to be added to the hovered 'li' tag. If not hovered over for X milliseconds or longer, 'active' is not added. And, if 'active' is added, on mouseleave the class 'active' should be removed.
Any help is greatly appreciated.
jQuery(document).ready(function($){
$('ul#megamenulist li').hover(
function(){
console.log('over');
//hovertimer = setTimeout(function(){
$('ul#megamenulist li').each($(this).addClass('active'));
//}, 500);
},
function(){
console.log('off');
clearTimeout(hovertimer);
$('ul#megamenulist li').removeClass('active');
}
);
});
<div id="megamenunav">
<ul id="megamenulist">
<li>
<a href="#"><span>Explore</span></a>
</li>
<li>
<a href="#"><span>Develop</span></a>
</li>
<li>
<a href="#"><span>Engage</span></a>
</li>
<li>
<a href="#"><span>Shop</span></a>
</li>
<li>
<a href="#"><span>About</span></a>
</li>
</ul>
</div>
The problem is that the context inside
setTimeout
function (this
keyword) is globalwindow
object. The simplest fix for this is to save reference toul#megamenulist li
element in variable and use it insidesetTimeout
.Correct code:
Also it's a good practice to cache jQuery collections to avoid repetitive DOM queries. For example you can cache it like in the code above, since
hover
returns a collection.Demo: http://jsfiddle.net/yL1uu0hv/2/