如何避免鼠标事件与定时器冲突

how to avoid mouse event conflict with timer

我的目标是将一个元素悬停在网页上,在本例中为 li 标签,从而导致主图像与备用图像交换。当鼠标悬停在 li 标签上时,替代图像将可见。备用图像将在鼠标离开 li 标签后保持可见 n 秒。在 n 秒后备用图像交换回主图像之前,不会再次触发初始悬停动作。

到目前为止,我的搜索结果是: Detect IF hovering over element with jQuery。 我从 Meligy 分叉了 jsfiddle 想出了这个:

var $sample = $("#sample");
var $main = $("#main");
var $alt = $("#alt");

$alt.hide();

setInterval(function () {
    if ($sample.is(":hover")) {
        $main.hide();
        $alt.show();
    } else {
        setInterval(function(){
            $alt.hide();
            $main.show();
        },3000);
    }
}, 200);

此外,jQuery on hover animation fires multiple times 并使用 FC 的 jsfiddle 得到的结果恰好非常接近。

var $hover = $("#hover");
var $main = $("#main");
var $alt = $("#alt");

$alt.hide();

$hover.hover(

function () {
    $alt.stop(true, true).show();
    $main.stop(true, true).hide();
},

function () {
    $main.stop(true, true).show(2000);
    $alt.stop(true, true).hide(2000);
});

到目前为止,我拥有的最近的东西在下面 但经过几次悬停后,图像无法控制地来回摆动。

var $hover = $("#hover");
var $main = $("#main");
var $alt = $("#alt");

$alt.hide();


$hover.hover(function () {
    if ($main.is(":visible")) {
        $main.hide();
        $alt.show();
    }
}, function () {
    setInterval(function () {

        // Also attempted $main.is(":hidden")

        if ($main.not(":visible")){
            $alt.hide();
            $main.show();
        }
    }, 3000);
});

谢谢大家

使用超时来避免这种行为。原因是,无论悬停如何,都会触发一个间隔(超时)。如果 leave/reenter 元素,则必须取消 运行 timeout/interval。出于测试目的,我对您的代码进行了一些编辑:

var timer = null;

$hover.on('mouseenter', function () {
    if (window.timer != null)
        clearTimeout(window.timer);

        $main.hide();
        $alt.show();
});

$hover.on('mouseout', function () {
    window.timer = setTimeout(function () {
        // Also attempted $main.is(":hidden")
        $alt.hide();
        $main.show();
    }, 3000);
});

更新后的fiddle:https://jsfiddle.net/m18voLeL/5/