Трудная задержка при наведении курсора мыши
Это то, что у меня есть:
$("#cart-summary").mouseenter(function () {
$('.flycart').delay(500).slideDown('fast');
});
$(".flycart").mouseleave(function () {
$('.flycart').delay(500).slideUp('fast');
}).find('a.close').click(function(){
$(this).parents('.flycart').hide();
});
Что он делает:
Если mouseover # cart-summary → open flycart после 500 мс
если mouseout.flycart → закрыть flycart после 500 мс
Что мне нужно:
Если mouseover # cart-summary для ATLEAST 500ms → open flycart
если мышь .flycart для ATLEAST 500ms → закрыть flycart
Отредактировано для добавления: Я также использую hoverIntent, если это можно использовать здесь?
Большое спасибо!
Ответы
Ответ 1
Используйте setTimeout, чтобы проверить, установлен ли флаг, который вы установили/отключили (я использую класс).
$("#cart-summary").mouseenter(function () {
$("#cart-summary").addClass("hasFocus");
setTimeout(function(){
if ($("#cart-summary").hasClass("hasFocus")) {
$('.flycart').slideDown('fast');
}
}, 500 );
});
$("#cart-summary").mouseleave(function () {
$("#cart-summary").removeClass("hasFocus");
});
$(".flycart").mouseenter(function () {
$("#cart-summary").removeClass("lostFocus");
});
$(".flycart").mouseleave(function () {
$("#cart-summary").addClass("lostFocus");
setTimeout(function(){
if ($("#cart-summary").hasClass("hasFocus")) {
$('.flycart').slideUp('fast');
}).find('a.close').click(function(){
$(this).parents('.flycart').hide();
}
}, 500)
});
Ответ 2
Похоже, вам может понадобиться плагин HoverIntent.
Я не знаю, поможет ли это вам с помощью мыши ATLEAST 500ms. Но, возможно, там есть вариант для этого.
Ответ 3
Вы можете использовать плагин hoverIntent следующим образом:
var config = {
sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)
interval: 500, // number = milliseconds for onMouseOver polling interval
timeout: 500, // number = milliseconds delay before onMouseOut
};
$(".flycart").hoverIntent(function () {
$('.flycart').slideDown('fast');
}, function() {
$('.flycart').slideUp('fast');
}).find('a.close').click(function(){
$(this).parents('.flycart').hide();
});
Ответ 4
Вы можете сделать:
var timeout,
$flycart = $(".flycart"),
$summary = $("#cart-summary"),
delay = 500;
$summary.mouseenter(function () {
if (timeout) window.clearTimeout(timeout);
timeout = window.setTimeout(function(){
if ( $flycart.is(":visible") ) {
$flycart.slideDown('fast');
}
}, delay);
});
$flycart.mouseleave(function () {
if (timeout) window.clearTimeout(timeout);
timeout = window.setTimeout(function(){
if ( $flycart.is(":visible") ) {
$flycart.slideUp('fast');
}
}, delay);
})...
Ответ 5
предложить решение
var mouseenterTimerCart;
var mouseleaveTimerCart;
$(document).on({
mouseenter: function () {
if (mouseleaveTimerCart) clearTimeout(mouseleaveTimerCart);
mouseenterTimerCart = setTimeout(function() {
$("#head-cart .cart_items").show()
}, 500);
},
mouseleave: function () {
if (mouseenterTimerCart) clearTimeout(mouseenterTimerCart);
mouseleaveTimerCart = setTimeout(function() {
$("#head-cart .cart_items").hide()
}, 500);
}
}, "#head-cart .full, #head-cart .cart_items");
будет работать, если корзина обновляется динамически
$("#head-cart").html(...crat-html-block...)