【问题标题】:Can Deferred object chains be used on event handlers?可以在事件处理程序上使用延迟对象链吗?
【发布时间】:2013-05-06 05:36:30
【问题描述】:

我对 Javascript / jQuery 有点陌生(但不是编程),所以请原谅对这件事的任何无知。我已经看过this questionthis one,但都没有解决我的问题。

我的场景:我有一个用 Javascript / jQuery 编写的幻灯片。在此幻灯片中,我想在用户将鼠标悬停在幻灯片上时显示控件(播放按钮、向后、向前),并在鼠标离开幻灯片区域时隐藏它们。按钮按预期显示和隐藏,但是当我将鼠标悬停在其中一个按钮(也在幻灯片上)时,它消失了(我知道这是因为幻灯片上的“鼠标离开”)。

我尝试将悬停事件处理程序添加到我的按钮以更改全局布尔值,以便只有在该布尔值为 false 时才会隐藏幻灯片控件(意味着未触发其中一个按钮的“mouseenter”)。然后我在“mouseleave”之前注册了“mouseenter”事件,但它不起作用。

问题出在这里:尽管在滑动的“mouseleave”事件之前触发了按钮的“mouseenter”事件,但事件处理程序回调在相反中执行> 订购。我不完全确定为什么会发生这种情况,但我知道这与 Javascript 中悬停事件的处理方式有关。

我阅读了一些有关延迟对象的信息,我想知道这是否是解决此问题的正确方法?

语法不正确,但我正在考虑以下内容:

function isMouseOverButton() {
    if(mouseEnteredButtonEvent()) {
        window.isOverButton = true;
    } else {
        window.isOverButton = false;
}

function hideControls() {
    if(!window.isOverButton) {
        //hide buttons
    }
}

$.when($("#slide").mouseleave()).then(isMouseOverButton()).then(hideControls());

有没有像这样组合事件处理程序和延迟对象?或者,有没有比延迟对象更好的方法?

编辑:我刚刚遇到this,但我不想使用插件来完成此操作。

【问题讨论】:

    标签: javascript jquery jquery-events jquery-deferred


    【解决方案1】:

    不,这不是办法!

    当鼠标进入幻灯片时,显示控件,当鼠标离开幻灯片时,隐藏控件,除了如果鼠标进入控件。

    为此,您将使用一个小的超时并检查鼠标是否在控件被隐藏之前进入了控件。

    var timer;
    
    $('#slide').on({
        mouseenter: function() {
            clearTimeout(timer);
            $('.controls').show();
        },
        mouseleave: function() {
            timer = setTimeout(function() { //don't hide them right away
                $('.controls').hide();
            }, 400); // set a timeout
        }
    });
    
    $('.controls').on({
        mouseenter: function() {
            clearTimeout(timer);  // if the mouse entered the controls, 
        },                        // clear the timeout, keeping the controls visible,
        mouseleave: function() {
            timer = setTimeout(function() {
                $('.controls').hide();
            }, 400);
        }
    });
    

    FIDDLE

    做同样事情的更简单的方法是将控件放置在 HTML 中的 #slide 元素内,这样它们就不会触发 mouseleave 事件,但这并不总是可行或方便的。

    【讨论】:

    • 两种解决方案都很棒。在这种情况下,我实际上可以将它移动到包含的 HTML 元素。那太简单了,我什至没有想到。非常感谢您的帮助!
    • @Don - 是的,这是一个非常简单的答案,如果您没有使用任何 javascript 效果,或者可以使用 CSS3 效果,您甚至可以仅使用 css 隐藏和显示控件,如果控件在幻灯片内(在 HTML 标记中),则不需要 javascript。
    • 再次正确。有时我会卡在 Javascript 上,以至于忘记了许多相同的事情可以通过 CSS3 完成。非常感谢您的帮助。
    • 这真是太棒了。我并没有过多地摆弄(双关语;))CSS动画。这是一个很好的起点,它有助于清理我的 Javascript。你已经超级有帮助了!感谢所有示例!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多