2012-09-08 64 views
2

滑下菜單我想這個js代碼:等待300毫秒,然後使用jQuery

<script type="text/javascript"> 

     $(document).ready(function() { 
      var timer; 
      $('.top-menu-first-ul li').hover(function(){ 
         if(timer) { 
           clearTimeout(timer); 
           timer = null 
         } 
         timer = setTimeout(function() { 
            $(this).find('ul').slideToggle(100); 
         }, 500) 
      }, 
      // mouse out 
      }); 
     }); 


</script> 

與這個網站:

<ul class="top-menu-first-ul"> 
    <li> 
     <a href="http://google.com">Google</a> 
     <ul class="top-menu-second-ul"> 
      <li><a href="http://translate.google.com">Google Translate</a></li> 
      <li><a href="http://images.google.com">Google Images</a></li> 
      <li><a href="http://gmail.google.com">Gmail</a></li> 
      <li><a href="http://plus.google.com">Google Plus</a></li> 
     </ul> 
    </li> 
    <li> 
     <a href="http://facebook.com">Facebook</a> 
    </li> 
    <li> 
     <a href="http://twitter.com">Twitter</a> 
    </li> 
</ul> 

,但它無法正常工作。

我想在懸停時顯示子菜單。谷歌鏈接和其他將在300ms後出現。

所以,我需要防止加載子菜單,當用戶只是快速懸停在它上面,而不是留在懸停鏈接至少300毫秒。

然後當他離開鏈接時,我需要停止執行代碼(或向上滑動)。因爲如果他一遍又一遍地回顧一段時間,他會停下來徘徊anfd代碼仍然執行自己有多少次懸停在鏈接上。我需要以某種方式防止這種情況發生。

編輯:我需要解決這個不喜歡hoverIntent等。如果可能的插件,只是簡單的JavaScript和jQuery

回答

6

使用stop()防止動畫古怪和delay()等待300毫秒。此外hover()不贊成我會用on(),而不是提示:

$('.top-menu-first-ul li').on({ 
    mouseover: function() { 
    $(this).find('ul').stop(1,1).delay(300).slideDown(100); 
    }, 
    mouseleave: function() { 
    $(this).find('ul').stop(1,1).slideUp(100); 
    } 
}); 

演示:http://jsfiddle.net/elclanrs/6dtWz/

+0

謝謝,但只要我離開谷歌,並希望將鼠標懸停在Google翻譯,Google郵件等子菜單上,它們就會消失。你能修好它嗎? – Derfder

+0

是的,只需用'mouseleave'改變'mouseout'即可。再次檢查演示。 – elclanrs

+0

謝謝,起初你的更新版本不工作,但我注意到,如果我打開jsfiddle你的演示jquery 1.6它不會工作。所以,我已經將我的jQuery從1.6.2版本升級到最新的1.8.1版本,並且它工作的很好;)。謝謝。 – Derfder

3

我認爲,問題是,你用你的$(this)函數被調用超時內。 $(this)在這個閉包裏面和外面的不一樣(在jQuery爲你設置的jQuery事件處理程序裏面)。 Here (jsfiddle)是解決方案:該解決方案是基於你的

$(document).ready(function() { 
      $('.top-menu-first-ul li').mouseenter(mouseIn); 
      $('.top-menu-first-ul li').mouseout(mouseOut); 
}); 
function mouseIn(e){ 
    var target = $(this); 
    var timer = setTimeout(function() { 
        target.find('ul').slideDown(100); 
     }, 500); 
    target.attr("data-timer", timer); 
} 

function mouseOut(e){ 
    var target = $(this); 
    var timer = target.attr("data-timer"); 
    if(timer){ 
     clearTimeout(timer); 
    } 
    target.find('ul').slideUp(100) 
} 
​ 

UPDATE,但我建議使用@ elclanrs的解決方案,因爲它是更好的(更具可讀性,使用其意在此jQuery的API)。

+0

謝謝,但你的jsfiddle無法正常工作。 – Derfder

+0

我剛剛在Chrome 21,IE 10和Firefox 14中檢查過,它可以在任何地方使用。 –

+0

嗯,我看到,當你移動鼠標點擊翻譯... :) –

相關問題