2015-05-09 40 views
0

我正在使用Bootstrap典型的nav下拉菜單。正常懸停並點擊小設備的jQuery引導程序下拉引導3

我希望下拉菜單顯示在鼠標懸停上並隱藏在鼠標上。但是當設備寬度小於979px時,我希望下拉菜單顯示在點擊上而不是懸停上。

我寫了一些jQuery來實現這一點。它工作正常,但是當我將瀏覽器寬度減少到979px以下時,它會顯示懸停時的下拉菜單。我希望這隻能顯示點擊下拉。具有諷刺意味的是,如果我保持瀏覽器寬度低於979px,那麼它不會顯示懸停。

我的jQuery:

$(document).ready(function() { 
    if ($(window).width() < 979) { 
    $(".md-nav ul.nav li.dropdown").click(function() { 
     $('li.dropdown > a').addClass('dropdown-toggle'); 
     $('li.dropdown > a').attr('data-toggle','dropdown'); 

    }); 
    } 

    if ($(window).width() > 979) { 
     $(".md-nav li.dropdown").hover(function() { 
      $(".md-nav li.dropdown:hover > .dropdown-menu").stop(true,true).delay(400).show(0); 
     }, function() { 
      $(".md-nav li.dropdown:hover > .dropdown-menu").stop(true,true).delay(500).hide(0); 
     }); 
    } 

    }); 


我的HTML爲導航:

<nav class="navbar navbar-default md-nav" role="navigation"> 
    <div class="container-fluid"> 
     <select class="nav-sel"> 
      <option value="Vous Etes">Vous Etes</option> 
      <option value="Vous Etes">Vous Etes</option> 
      <option value="Vous Etes">Vous Etes</option> 
      <option value="Vous Etes">Vous Etes</option> 
     </select> 

     <!-- Brand and toggle get grouped for better mobile display --> 
     <div class="navbar-header"> 
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> 
      <span class="sr-only"></span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      </button> 
     </div> 

     <!-- Collect the nav links, forms, and other content for toggling --> 
     <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
      <ul class="nav navbar-nav nav nav-tabs"> 
       <li class="dropdown"><a href="#">Ministére</a> 
        <div class="dropdown-menu"> 
         <ul> 
          <li><a href="#">Promotion</a></li> 
          <li><a href="#">Prévention</a></li> 
          <li><a href="#">Les Féderations</a></li> 
          <li><a href="#">Le diréct</a></li> 
          <li><a href="#">Emplois & Mériers</a></li> 
          <li><a href="#">Grand Evénements</a></li> 
         </ul> 
         <img src="img/athlete-img1.jpg" alt="athlete running" /> 
        </div> 
       </li> 
       <li class="dropdown"><a href="#">Sport</a> 
        <div class="dropdown-menu"> 
         <ul> 
          <li><a href="#">Promotion</a></li> 
          <li><a href="#">Prévention</a></li> 
          <li><a href="#">Les Féderations</a></li> 
          <li><a href="#">Le diréct</a></li> 
          <li><a href="#">Emplois & Mériers</a></li> 
          <li><a href="#">Grand Evénements</a></li> 
         </ul> 
         <img src="img/athlete-img1.jpg" alt="athlete running" /> 
        </div> 
       </li> 
       <li class="dropdown"><a href="#">Jeunesse</a> 
        <div class="dropdown-menu"> 
         <ul> 
          <li><a href="#">Promotion</a></li> 
          <li><a href="#">Prévention</a></li> 
          <li><a href="#">Les Féderations</a></li> 
          <li><a href="#">Le diréct</a></li> 
          <li><a href="#">Emplois & Mériers</a></li> 
          <li><a href="#">Grand Evénements</a></li> 
         </ul> 
         <img src="img/athlete-img1.jpg" alt="athlete running" /> 
        </div> 
       </li> 
       <li class="dropdown"><a href="#">Publications</a> 
        <div class="dropdown-menu"> 
         <ul> 
          <li><a href="#">Promotion</a></li> 
          <li><a href="#">Prévention</a></li> 
          <li><a href="#">Les Féderations</a></li> 
          <li><a href="#">Le diréct</a></li> 
          <li><a href="#">Emplois & Mériers</a></li> 
          <li><a href="#">Grand Evénements</a></li> 
         </ul> 
         <img src="img/athlete-img1.jpg" alt="athlete running" /> 
        </div> 
       </li> 
       <li class="dropdown"><a href="#">Mediatheque</a> 
        <div class="dropdown-menu"> 
         <ul> 
          <li><a href="#">Promotion</a></li> 
          <li><a href="#">Prévention</a></li> 
          <li><a href="#">Les Féderations</a></li> 
          <li><a href="#">Le diréct</a></li> 
          <li><a href="#">Emplois & Mériers</a></li> 
          <li><a href="#">Grand Evénements</a></li> 
         </ul> 
         <img src="img/athlete-img1.jpg" alt="athlete running" /> 
        </div> 
       </li> 
       <li><a href="#">Espace Medias</a></li> 
      </ul> 
     </div><!-- /.navbar-collapse --> 
    </div><!-- /.container --> 
</nav> 
+0

此方法存在缺陷。屏幕尺寸和可移動性並無內在聯繫。 – cvrebert

+0

我們不能寫這樣的東西,「它應該總是顯示下拉懸停,除非屏幕尺寸小於979px,那麼它應該只顯示下拉點擊'? –

+0

大屏幕的平板電腦存在 – cvrebert

回答

2

這是因爲當前的邏輯如下:

  1. 檢查屏幕尺寸(寬)
  2. 創建事件處理程序click如果width小於979
  3. 創建事件處理程序hover如果width大於979

哪個,總之,是指當你打開的頁面寬度檢查只執行一次,並且相應地附加事件處理程序。爲了克服這個問題,我建議用另一種邏輯:

  1. 添加事件處理程序click和上點擊hover
  2. 如果瀏覽器的寬度小於979px顯示下拉
  3. 上懸停,如果瀏覽器的寬度大於(或等於)979px顯示下拉

的Javascript

$(".md-nav ul.nav li.dropdown").click(function() { 
    if ($(window).width() < 979) { 
     $('li.dropdown > a').addClass('dropdown-toggle'); 
     $('li.dropdown > a').attr('data-toggle','dropdown');    
    } 
}); 

$(".md-nav li.dropdown").hover(function() { 
    if ($(window).width() >= 979) { 
     $(".md-nav li.dropdown:hover > .dropdown-menu").stop(true,true).delay(400).show(0); 
    } 
}, function() { 
    if ($(window).width() >= 979) { 
     $(".md-nav li.dropdown:hover > .dropdown-menu").stop(true,true).delay(500).hide(0); 
    } 
}); 

另一種方法是按照你的邏輯,並根據瀏覽器的寬度附加給定的事件處理程序,這在每次調整瀏覽器窗口時刷新:

的Javascript

$(window).on('resize', function (e) { 
    // reattach event handler if necessary 
}); 

請但是,請記住,通過這種方法,您需要刪除以前的事件處理程序,否則它們將堆疊在彼此之上。

+0

這種方法的問題是,除非瀏覽器的大小被調整大小,這意味着默認情況下,下拉菜單不會顯示在懸停和點擊上。有沒有辦法像「如果屏幕尺寸小於979像素懸停無所事事」這樣寫?它應該覆蓋以前的懸停功能。我認爲這將解決這個問題 –

+1

@AlexZahir這很奇怪,它應該出現。由於缺少樣式表,我無法進行深入測試,但它應該可以工作。 _「如果屏幕尺寸小於979px懸停不做」_ - 這個片段是(應該)正是你問的,除了沒有顯示在大屏幕(窗口)點擊下拉。 –

+0

謝謝 - 這真的幫助我解決了我的問題! – iamrobert