可以在事件处理程序上使用延迟对象链吗?
Can Deferred object chains be used on event handlers?
我对Javascript/jQuery有点陌生(但不是编程),所以请原谅我对这件事的无知。我已经看了这个问题和这个问题,但是没有一个能解决我的问题。
我的场景:我有一个用Javascript/jQuery编写的幻灯片。在这个幻灯片中,我希望在用户将鼠标悬停在幻灯片上时显示控件(播放按钮、后退按钮、前进按钮),并在鼠标离开幻灯片区域时隐藏它们。按钮按预期显示和隐藏,但当我将鼠标悬停在其中一个按钮(也在幻灯片上)时,它就消失了(我知道这是因为"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事件,但这并不总是可能的,也不方便。
- 使用jquery延迟对象链接多个ajax调用
- jQuery通过嵌套的ajax调用延迟对象
- $.ajax延迟对象
- 延迟迭代对象
- 在延迟对象解析后执行启用函数
- 延迟对象在解析之前返回
- Unity 3d对象在场景中延迟后显示
- 是否有任何方法可以像处理jQuery中附加到XHR延迟对象的done方法处理程序一样处理websocket onmess
- JavaScript清理“”中引用的(本地)对象;延迟的“;功能
- 使用 jQuery 延迟对象管理 ajax 调用
- 我怎样才能延迟可折叠对象的扩展,直到获取其内容
- jquery延迟对象回调未触发
- 如何延迟对 javascript 对象的任何方法的所有调用,直到对象初始化
- 如何确定 jQuery 对象是否延迟
- 在 jQuery 的延迟对象中抛出错误
- 新 $.带有旧回调的延迟对象
- jQuery:在成功/错误中使用延迟对象(ajaxSetup 选项)
- 将延迟对象作为失败返回
- 具有延迟对象的构造函数
- 使用 jQuery 延迟对象以串行方式处理 jQuery 集合/数组