2015-01-21 1 views
1

Я знаю, что есть много похожих вопросов, подобных этому, я искал и пытался часами, но не повезло.Наведите указатель мыши на один из нескольких div и задержите, затем опустите ребенка div

То, что я пытаюсь сделать, это просто, есть множественный блок в моей странице, как этот и .description класса появится, если пользователь парить на .frame элемент

<div class="row"> 
    <div class="col-xs-4"> 
     <div class="frame"> 
      <div class="description"> 
       <h3>Title</h3> 
       <p>Description</p> 
      </div> 
     </div>   
    </div> 
    <div class="col-xs-4"> 
     <div class="frame"> 
      <div class="description"> 
       <h3>T2</h3> 
       <p>Description</p> 
      </div> 
     </div>   
    </div> 
</div> 

Я думаю, что это очень раздражает, когда пользователь прокручивается по экрану, и каждое описание запускается, поэтому я попытался добавить «условие задержки» до setTimeout(), таким образом, только когда пользователь останавливается на одном блоке по крайней мере на 1сек, появляется всплывающее окно

Но это просто не " t хорошо, и вот мой Demo

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

JQuery код:

var timer; 

$(document).ready(
    function(){ 
     $(".frame").hover(  
      function() { 
       var descrip_in=$(".description",$(this)) 
       timer = setTimeout(function(){descrip_in.slideToggle();}, 1000); 

      },  
      function() {  
       var descrip_out=$(".description",$(this)) 
       clearTimeout(timer); 
       descrip_out.slideToggle(1000) 
      } 
     );  
    } 
); 
+0

Что именно проблема с этим? Какое поведение вы ожидаете? –

+0

Я хочу, чтобы '.description' всплывал только тогда, когда пользователь зависал в' frame' за 1сек; в демо, он все равно получил триггер, когда вы пронеслись над ним (извините за плохую грамматику) –

+0

@DennisKao проведите по экрану, вы имеете в виду, что указатель мыши остается в кадре и вне рамки ... или вы тестируете его на мобильном телефоне для салфетки? – Lucky

ответ

0

Ах, это был тонкий.

Используя slideToggle вместо slideDown и slideUp, вы переключили всплывающее окно на выходе, если вы покинули элемент до истечения таймаута!

var timer; 

$(document).ready(
    function(){ 
     $(".frame").hover(  
      function() { 
       var descrip_in=$(".description",$(this)) 
       timer = setTimeout(function(){descrip_in.slideDown();}, 1000); 

      },  
      function() {  
       var descrip_out=$(".description",$(this)) 
       clearTimeout(timer); 
       descrip_out.slideUp(1000) 
      } 
     );  
    } 
); 

http://jsfiddle.net/1esrLrfs/71/

+0

Спасибо большое! но ... почему? !! –

+0

Если вы зависали над элементом и выходили до истечения таймаута, вы в конечном итоге вызывали toggleSlide один раз * при выходе *. И вот что вызвало всплывающее окно, а не таймаут, как-то все-таки устроившись. Это обычная ошибка с бистабильной логикой, такой как функции переключения, чтобы быть в безопасности, вы всегда должны пытаться использовать функции прямого включения и выключения. –

+0

Получил! спасибо снова :) –

0

Вы можете проверить в обработчике из функции, является ли ваш элемент отображения или нет, а затем применить функцию переключения.

Из кода

var timer ,isToggle; 
    $(document).ready(
    function(){ 
     $(".frame").hover(  
      function() { 
       var descrip_in=$(".description",$(this)) 
       timer = setTimeout(function(){descrip_in.slideToggle();}, 1500);   
      },  
      function() {  
       var descrip_out=$(".description",$(this)) 
       clearTimeout(timer); 
       if(descrip_out.css('display') !== 'none') 
       descrip_out.slideToggle(1000) 
      } 
     );  
    } 
); 
+0

спасибо, это полезно. –

0

То же самое можно использовать с show и hide функций тоже. Функция slideToggle вызывается даже до достижения таймаута, и она не будет работать.

Вы можете увидеть Demo

$(function() { 
    var timeoutId; 
    $(".frame").hover(showDesc, hideDesc); 
}); 

function showDesc(){ 
var descrip_in=$(".description",$(this)) 
timer = setTimeout(function(){descrip_in.show(200);}, 1000); 
} 

function hideDesc(){ 
    var descrip_out=$(".description",$(this)) 
    clearTimeout(timer); 
    descrip_out.hide(300) 
} 
+1

спасибо, чувак, никогда не думал об этом и спасибо за исправление. –