【问题标题】:Why is setTimeout not working with .hover()?为什么 setTimeout 不能与 .hover() 一起使用?
【发布时间】:2014-12-05 19:42:49
【问题描述】:

JSFIDDLE:http://jsfiddle.net/yL1uu0hv/

我正在尝试使用 setTimeout 创建一个简单的悬停意图。我不确定提供的代码有什么问题。如果我注释掉 hovertimer = setTimeout(function(){}, 500); 那么我正在使用的 addClass 工作。如果上述项目处于活动状态(未注释掉),则 addClass 不起作用。

由于$('ul#megamenulist li').each($(this).addClass(opts.mmactiveclass.mmclassname)); 的语法,我也遇到了某种错误,即使什么都不做,它也会一直冒泡。

应该发生的事情是,在项目上悬停 X 毫秒后,应该将“活动”类添加到悬停的“li”标签中。如果未悬停 X 毫秒或更长时间,则不会添加“活动”。而且,如果添加了“活动”,则在鼠标离开时,应删除“活动”类。

非常感谢任何帮助。

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>

【问题讨论】:

    标签: jquery hover hoverintent


    【解决方案1】:

    问题在于setTimeout 函数(this 关键字)内部的上下文是全局window 对象。最简单的解决方法是将对 ul#megamenulist li 元素的引用保存在变量中,并在 setTimeout 中使用它。

    正确代码:

    var $li = $('ul#megamenulist li').hover(
        function () {
            var self = this;
            hovertimer = setTimeout(function(){
                $(self).addClass('active');
            }, 500);
        },
        function () {
            clearTimeout(hovertimer);
            $li.removeClass('active');
        }
    );
    

    另外,缓存 jQuery 集合以避免重复的 DOM 查询也是一个好习惯。例如你可以像上面的代码那样缓存它,因为hover返回一个集合。

    演示:http://jsfiddle.net/yL1uu0hv/2/

    【讨论】:

    • 太棒了。谢谢dfsq。试图弄清楚为什么 setTimeout 不起作用,这让我发疯了。你刚刚得到我的投票和复选标记!
    • 谢谢!请记住,在setTimeoutsetInterval 内部,上下文this 始终是全局对象window
    • 会的 - 感谢您向我指出这一点。我仍在学习this 及其用途。有时它对我来说很容易理解和使用,但有时它会给我带来麻烦。
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2018-03-09
    • 2021-06-14
    • 2012-10-09
    • 2020-03-18
    • 2017-11-21
    • 2019-04-11
    相关资源
    最近更新 更多