javascript - 如何在执行悬停功能之前添加等待时间

标签 javascript jquery hover settimeout jquery-hover

我正在处理嵌套菜单,当我的鼠标移到选项上时,会显示一个子列表。 这是我的悬停功能:

$( ".sublist" ).parent().hover( function () {
    $(this).toggleClass("li_hover",300); //use to change the background color
    $(this).find(".sublist").toggle("slide", {}, 500); //sub list show / hide
});

现在,我想在子列表显示之前添加一个短句,以防止用户疯狂移动鼠标。有人对此有好的建议吗?


更新:

谢谢你们,我对我的程序做了一些改变,最近看起来像这样:

function doSomething_hover (ele) {
    ele.toggleClass("li_hover",300);
    ele.find(".sublist").toggle("slide", {}, 500);
}

$(function () {
    $( ".sublist" ).parent().hover( function () {
        setTimeout(doSomething_hover($(this)), 3000);
    });
}):

这很奇怪,setTimeout 不会延迟任何事情。但如果我将函数调用更改为 doSomething_hover (不带“()”),该函数将延迟良好。但我无法将任何 jquery 元素传递给该函数,所以它仍然不起作用,有人可以告诉我如何使 doSomething_hover($(this))setTimeout 中工作?


更新2: 得到了 setTimeout 的工作,但这似乎不是我想要的: 我真正想要的是,如果鼠标悬停在选项上的时间少于 0.5 秒,则不会发生任何事情。

无论如何,这是我使 setTimeout 工作的代码:

function doSomething_hover (ele) {
    ele.toggleClass("li_hover",300);
    ele.find(".sublist").toggle("slide", {}, 500);
}

$(function () {
    $( ".sublist" ).parent().hover( function () {
        var e = $(this);
        setTimeout(function () { doSomething_hover(e); }, 1000);
    });
}):

最终更新: 当我将鼠标移出时,我通过使用clearTimeout 完成了这项工作。 所以代码应该是:

    $( ".sublist" ).parent().mouseover( function () {
        var e = $(this);
        this.timer = setTimeout(function () { doSomething_hover(e); }, 500);
    });

    $( ".sublist" ).parent().mouseout ( function () {
        if(this.timer){
            clearTimeout(this.timer);
        }
        if($(this).hasClass("li_hover")){
            $(this).toggleClass("li_hover");
        }
        $(this).find(".sublist").hide("slide", {}, 500);

    });

这是$(document).ready()中的部分。其他代码与上面相同。


真的。最终更新: 因此,mouseovermouseout 有时会导致错误,因为当我将鼠标移动到子列表时,父级的 mouseover 事件将触发,并隐藏子列表。 问题可以通过使用hover函数来解决:

    $( ".sublist" ).parent().hover( 
        function () {
            var e = $(this);
            this.timer = setTimeout(function () { doSomething_hover(e); }, 500);
        },
        function () {
            if(this.timer){
                clearTimeout(this.timer);
            }
            $(this).find(".sublist").hide("slide", {}, 500);
            if($(this).hasClass("li_hover")){
                $(this).toggleClass("li_hover",300);
            }
        }
    );

谢谢大家

最佳答案

请尝试一下:

代码

setInterval(doSomthing_hover, 1000);


function doSomthing_hover() {
    $(".sublist").parent().hover(function() {

        $(this).toggleClass("li_hover", 300); //use to change the background color
        $(this).find(".sublist").toggle("slide", {}, 500); //sub list show / hide
    });

}​

SetTime 与 setInterval

从根本上来说,了解 JavaScript 计时器的工作原理非常重要。通常,由于它们所在的单线程,它们的行为不直观。让我们首先检查我们可以访问的三个可以构造和操作计时器的函数。

var id = setTimeout(fn,delay); - 启动一个计时器,该计时器将在延迟后调用指定的函数。该函数返回一个唯一的 ID,稍后可以使用该 ID 取消计时器。

var id = setInterval(fn,delay); - 与 setTimeout 类似,但不断调用该函数(每次都有延迟)直到被取消。

clearInterval(id);clearTimeout(id); - 接受计时器 ID(由上述任一函数返回)并停止计时器回调的发生。

为了理解定时器的内部工作原理,需要探索一个重要的概念:定时器延迟是无法保证的。由于浏览器中的所有 JavaScript 都在单线程上执行,异步事件(例如鼠标单击和计时器)仅在执行中出现空缺时才会运行。

进一步阅读: http://ejohn.org/blog/how-javascript-timers-work/

关于javascript - 如何在执行悬停功能之前添加等待时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13285593/

相关文章:

html - 与按钮不同的 anchor 标签

javascript - Intl.NumberFormat 的指数符号

javascript - 使用 FireFox、Safari 和 Chrome 在剪贴板上复制/放置文本

jquery - 如何使用 jquery 删除 noscript 标签包装?

javascript - touchstart 上没有原始事件

javascript - 使用 jQuery 放大元素的 "hover"区域 - 最简单的方法

html - 如何在悬停后保持链接可见

javascript - 谷歌地图标记上的复选框

javascript - 输入前重构 JSON

jquery - 切换点击最多 4 次效果很好,但从第 6 次点击开始效果不佳