2013-02-18 150 views
1

顯示非嵌套/非嫡系兄弟導航我有2個航區。第二個應該在第一個元素懸停時出現,如果鼠標不移過它,它應該消失。jQuery的 - 上懸停事件

非常基本上我有:

HTML

<ul class="main"> 
<li class="1">item 1</li> 
<li class="2">item 2</li> 
</ul> 

<div class="sub"> 
<ul class="1"> 
    <li>1 sub item 1</li> 
    <li>1 sub item 2</li> 
</ul> 

<ul class="2"> 
    <li>2 sub item 1</li> 
    <li>2 sub item 2</li> 
</ul> 
</div> 

我想ul.1當我將鼠標懸停在li.1和ul.2當我將鼠標懸停在li.2出現出現,我希望他們都只有在我沒有徘徊在小組之後纔會消失。

我已經得到了它的工作方式的一部分:

JAVASCRIPT

var sections = new Array('1', '2'); 

$.each(sections, function(i, section) { 
    $('ul.main li.' + section).hover(
     function() { 
      $('div.sub ul').hide(); 
      $('div.sub ul.' + section).show(); 
     } 
    ); 
}); 

這將顯示正確的部分並隱藏了別人,但我無法弄清楚如何我需要什麼,這樣,當鼠標離開ul.main li時,如果沒有被覆蓋,.sub ul會消失。

更新:小提琴這裏:http://jsfiddle.net/alluvialplains/XY4mH/

+0

你爲什麼不嵌套在主菜單內的子菜單?這將解決您的問題。 – Mottie 2013-02-18 22:25:43

+0

我不是嵌套的,因爲子導航需要將後面的內容向下推,但它們也需要比主導航寬,這意味着絕對定位和無內容推送:-( – EpF 2013-02-18 22:41:17

+0

您缺少的關鍵元素是:#1)綁定一個'mouseleave'事件的包裝div,#2)你使用的是'.hover()',但使用'.hide()'事件的包裝div更容易實現綁定到它。有關更多詳情,請參閱下面的答案。 – Brian 2013-02-18 23:53:47

回答

0

你是@EpF那裏的一部分。問題是,你的語義例如上面給出的(這是可能的堅持)正試圖捕捉mouseleave事件,雖然可以使用jQuery的.not()功能來實現這一目標,這將是昂貴的。說真的,要做到這一點的最聰明的辦法是讓你的整個導航外包裝(包裝所有div的你在現有的小提琴已經有了),然後你的show()事件綁定到mouseenter,而分別結合您的.hide()事件(一個用於ALL .subz)一個事件引發了對mouseleave的包裝股利。

考慮下面的HTML:

<div id="nav-wrap"> 
    <ul class="mainz"> 
    <li class="1">item 1</li> 
    <li class="2">item 2</li> 
    </ul> 

    <div class="subz"> 
    <ul class="1"> 
     <li>1 sub item 1</li> 
     <li>1 sub item 2</li> 
    </ul> 

    <ul class="2"> 
     <li>2 sub item 1</li> 
     <li>2 sub item 2</li> 
    </ul> 
    </div> 
</div><!-- /END #nav-wrap --> 

可以實現與以下JavaScript

$(document).ready(function() { 
    var $ul = $('.subz ul').hide(); 
    $('.mainz li').on('mouseenter', function(event){ 
      $ul.hide().eq($(this).index()).show(); 
    }); 
    $('#nav-wrap').on('mouseleave', function(event){ 
     $ul.hide(); 
    }); 
}); 

影響這裏是一個的jsfiddle的它在行動:http://jsfiddle.net/XY4mH/4/

而且,我應該請注意,.hover()函數在jQuery中已被棄用了很長一段時間,並且很快就會消失。請注意,我使用了.on()函數,這是在jQuery中綁定這些事件的正確方法。

+0

謝謝@布萊恩!我也很欣賞.hover()信息。 – EpF 2013-02-19 17:05:42

+0

高興地幫助:) – Brian 2013-02-19 21:52:00

0
$(document).ready(function() { 
    $('.main li').on('click', function() { 
    $('.sub ul') 
     .hide() 
     .eq($(this).index()) 
     .show(); 
    }); 
}); 

這應該做的伎倆。但正如@Mottie說,嵌套菜單會工作得更好/更symantecly

編輯:對不起,這是工作click。只需一秒鐘,我就可以更新

$(document).ready(function() { 
    var $ul = $('.sub ul').hide(); 
    $('.main li').hover(
     function() { 
      $ul 
       .hide() 
       .eq($(this).index()) 
        .show(); 
     }, 
     function() { 
      $ul.hide() 
     } 
    ); 
}); 
+0

謝謝@詹姆斯 - 我可能在我的問題中不夠清楚,但是這兩個元素高於另一個(.main和.sub),而我試圖實現的是能夠將鼠標懸停在.main裏.1,然後將鼠標懸停在.sub ul.1上,這不符合您的建議(.sub ul.1消失)。我只想要.sub ul消失,如果用戶移動鼠標。主李,但**沒有**到.sub ul – EpF 2013-02-18 23:06:50