2011-01-28 1 views
5

Плагин hoverintent - это противоположность тому, что мне нужно. У меня есть .popup, который запускается .trigger, когда я нахожусь от него, я хочу .popup НЕ затухать в течение нескольких секунд, но если я откинусь, тогда снова наведите курсор, отмените затухание, которое собиралось произойти и сохранить .popup открытым.JQuery: как добавить задержку в mouseleave, так что если кто-то случайно случайно наведет элемент, он останется открытым

Кто-нибудь знает, как я это сделаю?

Это не работает, но это была идея:

$('.trigger').hover(function(){ 
     $('.popup').fadeIn(600) 
    }, function() { 
     $('.popup').delay(2000, function(){ 
      if ($(this).blur() = true) { 
       $('.popup').fadeOut(600) 
      } 
     }); 
    }) 

ответ

10

jQuery HoverIntent plugin - это именно то, что вы ищете.

Свойство timeout будет устанавливать время, в течение которого мышь должна быть OUT из области перед вызовом функции out.

Цитата парения умысел сайте:

тайм-аут: Простая задержка в миллисекундах перед вызовом функции «вне». Если пользователь возвращается к элементу до истечения времени ожидания, функция «выход» не будет вызываться (и не будет вызываться функция «over»). Это прежде всего защита от неаккуратных/человеческих траекторий мышц, которые временно (и непреднамеренно) снимают пользователя с целевого элемента ... давая им время для возвращения. По умолчанию время ожидания: 0

Чтобы установить его ...

$('.trigger').hoverIntent({ 
    over: startHover, 
    out: endHover, 
    timeout: 2000 
}); 

Затем определяют функции для обработки over и out

function startHover(e){ 
    //your logic here 
    $('.popup').fadeIn(600) 
} 

function endHover(){ 
    //your logic here 
    $('.popup').fadeOut(600) 
} 

EDIT:

Вы можете также настроить свойство interval для увеличения/уменьшения количества времени для функции startHover для запуска ... по умолчанию установлено значение 100 миллисекунд ... вы можете установить его на ноль, чтобы отключить всплывающее окно, как только мышь входит в зону триггера, если вам нравится.

+0

Есть настройки для точной настройки всего. Свойство «timeout» задает задержку до того, как вызывается функция «out» – stephen776

+0

Таким образом, функция 'startHover' будет показывать ваше всплывающее окно, а функция' endhover' удалит его. Тайм-аут установил задержку до того, как будет вызываться функция конца при выводе области ... достижение эффекта, которое ваше желание – stephen776

+0

Отредактировано о включении вашей логики fadeIn/fadeOut – stephen776

1

Вы можете попробовать использовать JQuery плагин hoverintent.

0

Это работает для меня:

$(".triger").mouseenter(function() { 
    $(this).find("popup").fadeIn(); 
}).mouseleave(function() { 
    $(this).find("popup").delay(200).fadeOut(); 
}); 
+0

Это НЕ РАБОТАЕТ, потому что, когда вы вернетесь с мышь над .triger в течение времени задержки, все равно будет fadeOut в любом случае ... просто с задержкой 200. – thorinkor

3

Вот самый простой способ сделать это без дополнительных плагинов:

$('.trigger').hover(function() { 
    clearTimeout(this.timer); 
    $('.popup').fadeIn(600); 
}, function() { 
    this.timer = setTimeout(function() { 
     if ($(this).blur() = true) { // off topic: you should to check this condition ;) 
      $('.popup').fadeOut(600); 
     } 
    }, 2000); 
}); 

SetTimeout() и clearTimeout() являются носителями JS функции HTML DOM окна объект, поскольку навсегда.

+0

для любого, кто наткнулся на это, как и я: есть [очень похожее решение этого] (http://stackoverflow.com/questions/1273566/how-do-i-check-if-the-mouse-is -over-an-element-in-jquery/1670561 # 1670561), что мне понравилось лучше. например, условие if ($ (this) .blur() = true) 'совершенно неверно. – sashn