Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 延迟对象链可以在事件处理程序上使用吗?_Javascript_Javascript Events_Jquery_Jquery Deferred - Fatal编程技术网

Javascript 延迟对象链可以在事件处理程序上使用吗?

Javascript 延迟对象链可以在事件处理程序上使用吗?,javascript,javascript-events,jquery,jquery-deferred,Javascript,Javascript Events,Jquery,Jquery Deferred,我对Javascript/jQuery有些陌生(但不熟悉编程),所以请原谅我对这件事的无知。我已经看过了,但都没有解决我的问题 我的场景:我有一个用Javascript/jQuery编写的幻灯片。在本幻灯片中,我希望在用户将鼠标悬停在幻灯片上时显示控件(播放按钮、后退、前进),并在鼠标离开幻灯片区域时隐藏它们。按钮按预期显示和隐藏,但当我将鼠标悬停在其中一个按钮(也在幻灯片上)上时,它会消失(我知道这是因为幻灯片上的“mouseleave”) 我尝试将悬停事件处理程序添加到我的按钮中,以更改全局

我对Javascript/jQuery有些陌生(但不熟悉编程),所以请原谅我对这件事的无知。我已经看过了,但都没有解决我的问题

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

我尝试将悬停事件处理程序添加到我的按钮中,以更改全局布尔值,这样,只有当该布尔值为false时,幻灯片显示控件才会隐藏(这意味着其中一个按钮的“鼠标指针”未触发)。然后我在“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());
是否存在这样的组合事件处理程序和延迟对象的方法?或者,有没有比延迟对象更好的方法

提前谢谢


编辑:我刚刚遇到,但我不想使用插件来完成这项工作。

不,这不是解决问题的方法

当鼠标进入幻灯片时,显示控件;当鼠标离开幻灯片时,隐藏控件,除非鼠标进入控件

要做到这一点,您将使用一个小的超时,并检查鼠标是否在隐藏控件之前进入控件

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);
    }
});


做同样事情的一个更简单的方法是将控件放在HTML中的
#slide
元素中,这样它们就不会触发mouseleave事件,但这并不总是可能的,也不方便。这两种解决方案都很好。在本例中,我实际上可以将其移动到包含HTML元素的位置。这太简单了,我都没想到。非常感谢你的帮助@Don-Yup,这是一个非常简单的答案,如果你没有使用任何javascript效果,或者可以使用CSS3效果,你甚至可以用css隐藏和显示控件,如果控件在幻灯片中(在HTML标记中),就不需要使用javascript。再次为真。有时,我太沉迷于Javascript了,以至于忘记了许多同样的事情都可以通过CSS3来完成。我真的很感谢你的帮助,太棒了。我对CSS动画不太感兴趣。这是一个很好的起点,有助于清理我的Javascript。你帮了大忙!感谢所有的例子!