2013-04-30 4 views
0

У меня есть fancybox для отображения фотографий и их описания. Теперь он открывает fancybox на событии mouseenter. Он отлично работает с этим кодом:JQuery Fancybox open delay

$('.fancy_link').live('mouseenter', mouseEnter); 
function mouseEnter() 
{ 
jQuery(this).fancybox().trigger('click'); 
return false; 
} 

Но мне нужно установить задержку для открытия fancybox. Как это должно работать: Пользователь перемещает курсор по ссылке, после 1 секунды fancybox должен открывать и отображать содержимое. Если пользователь перемещает мышь, прежде чем ждать 1 секунду, fancybox не должен открываться.

Я пробовал JQuery delay() и setTimeout(), но оба они работают неправильно. 1 сек. задержка просто игнорируется обоими методами.

+0

Вы можете проверить это http://stackoverflow.com/a/11731165/1055987 – JFK

+0

Похоже, вы пытаетесь задержать парения триггер, который является довольно сложно, поскольку он перегорает при малейшем движении мыши. Ссылка в комментарии полезна, но также, посмотрите на плагин «hoverintent» (Google it) очень полезно, и я думаю, что полностью обработать то, что вам нужно. –

+1

@JamieHartnoll: ссылка в моем комментарии также включает ссылку на плагин 'hoverIntent' и образец кода того, как его использовать. @crd: возможная проблема с принятым ответом называется «пузыриться», если вы понимаете, что я имею в виду (именно здесь «hoverIntent» становится удобной). Также 'live()' устарел и причина, по которой он не может работать с 'on()', состоит в том, что оба метода не обязательно имеют одну и ту же структуру ('on()' должен иметь делегированную форму в этом случае); @ tracker1 должен предоставить вам правильный '.on()' делегированный формат, так как его ответ был принят. – JFK

ответ

0

использование SetTimeout/clearTimeout ...

//binding code... 
$('.fancy_link').on('mouseenter',mouseEnter); 
$('.fancy_link').on('mouseleave', mouseLeave); 

//run when the mouse hovers over the item 
function mouseEnter() { 
    //clear any previous timer 
    clearTimeout($(this).data('h_hover')); 

    //get a reference to the current item, for the setTimeout callback 
    var that = this; 

    //set a timer, and save the reference to g_hover 
    var h_hover = setTimeout(function(){ 
    //timer timed out - click the item being hovered 
    $(that).click(); 
    }, 1000); 

    //save the reference - attached to the item - for clearing 
    // data is a generic "store", it isn't saved to the tag in the dom. 
    // note: if you have a data-* attribute it is readable via data() 
    $(this).data('h_hover',h_hover) 
} 

//handler for when the mouse leaves the item 
function mouseLeave() { 
    //clear the previously set timeout 
    clearTimeout($(this).data('h_hover')); 
}
+0

'.live()' устарел, используйте '.on()' вместо этого с jQuery v1.7 + – JFK

+0

спасибо JFK, скопированный с вопроса ... не думал пересматривать ... – Tracker1

+0

Спасибо! он работает отлично. Но только с методом 'live()'. С методом 'on()' function 'mouseEnter()' не выполняется. – 2013-04-30 08:24:52

0

Попробуйте это решение:

var timer = null; 
$('.fancy_link').on('mouseenter', function() { 
    timer = setTimeout(mouseEnter, 1000); 
}); 
// clear timer when mouse leaves 
$('.fancy_link').on('mouseleave', function() { 
    clearTimeout(timer); 
}); 
+0

Спасибо, он почти работает. В jquery.min.js v1.7.2 в строке 583 ошибка: return a.nodeName && a.nodeName.toUpperCase() === b.toUpperCase() - необработанная ошибка: ошибка безопасности: попытка чтения защищенной переменной: nodeName. Когда я пытаюсь открыть fancybox сразу же без задержки, ошибка не возникает. – 2013-04-30 06:53:45

+1

'.live()' устарел, используйте '.on()' вместо этого с jQuery v1.7 + – JFK

+0

Отсутствие эффекта вообще. Теперь функция mouseEnter не вызывает. – 2013-04-30 06:58:55

0

это может помочь вам

function openFancybox() { 
    setTimeout(function() {$('#fancy_link').trigger('click'); },1000); 
} 
0

я представляю вам нужно будет использовать SetTimeout и clearTimeout

Что-то вдоль этих линий:

var timer; 

$('.fancy_link').mouseenter(function(){ 
    var $this = $(this); 
    timer = setTimeout(function(){ 
     $this.fancybox().trigger('click'); 
    }, 1000); 
}).mouseleave(function(){ 
    clearTimeout(timer); 
});