js / jQuery — выход из функции по положению мыши

#javascript #jquery #recursion

#javascript #jquery #рекурсия

Вопрос:

У меня есть рекурсивная функция для своего рода слайдера изображения.

 function nextCol(col) {
  $('.menubox_col').fadeOut();
  $('.menubox_col').eq(col).fadeIn(function(){
    col  ;  
    if (col > 3) col = 0;
    setTimeout(function(){ nextCol(col) }, 1000);  
  });
}

<div id="menubox">      
        <div class="menubox_col">content</div>
        <div class="menubox_col">content</div>
        <div class="menubox_col">content</div>
        <div class="menubox_col">content</div>
</div>
  

Это работает нормально, но я не нашел способа остановить рекурсивную функцию, когда курсор мыши попадает в #menubox div.

Ответ №1:

Хотя вы могли бы использовать clearTimeout и затем снова перезапустить анимацию, вы могли бы просто установить флаг, что означает, что вам не нужно останавливать и запускать таймеры… Это остановит анимацию, когда мышь окажется над полем меню, и продолжит ее, когда она уйдет. Я также взял на себя смелость внести некоторые небольшие изменения в код — я нахожу результат намного проще:

 $(function(){

  var col = 0, hover = false;

  function nextCol() {
    if(hover){return;} // if their mouse is over, do nothing
    col = (col 1) % 4; // make this a one-liner. the 4 probably shouldn't be hard-coded though, it could be $('.menubox_col').length
    $('.menubox_col').fadeOut().eq(col).fadeIn();
  }

  setInterval(nextCol, 1000);

  $('#menubox').hover(function(){ hover=true; }, function(){ hover=false; });

});
  

Ответ №2:

Вы могли бы отменить время ожидания с помощью clearTimeout:

 var timeoutHandle = null;

function nextCol(col) {
    $('.menubox_col').fadeOut();
    $('.menubox_col').eq(col).fadeIn(function() {
        col  ;  
        if (col > 3) { col = 0; }
        timeoutHandle = setTimeout(function() { 
            nextCol(col);
        }, 1000);  
    });
}

$('#menubox div').mouseenter(function() {
    window.clearTimeout(timeoutHandle);
});
  

Комментарии:

1. это была моя первая идея, но она не сработала. после вашего поста я попробовал это снова, поместив весь код в $ (document). часть ready(). теперь это работает — большое тебе спасибо , дарин!