2017-06-05 37 views
0

我想爲HTML菜單創建一個觸發器,當它被點擊時會切換子菜單。下面代碼的問題是,當你點擊觸發器(class =「open」)時,它會一次切換所有子菜單項。我希望觸發器一次使用jQuery切換一個子菜單。這裏是我的代碼:帶子菜單觸發器的jQuery菜單

HTML

<ul> 
<li class="menu-item-has-children">Item 1</li> 
    <a class="open">+</a> 
    <ul class="sub-menu"> 
    <li>Sub Item 1</li> 
    <li>Sub Item 2</li> 
    <li class="menu-item-has-children">Sub Item 3</li> 
    <a class="open">+</a> 
     <ul class="sub-menu"> 
     <li>Sub Sub Item 1</li> 
     <li>Sub Sub Item 2</li> 
     <li>Sub Sub Item 3</li> 
     <li>Sub Sub Item 4</li> 
     <li>Sub Sub Item 5</li> 
     </ul> 
    <li>Sub Item 4</li> 
    <li>Sub Item 5</li> 
</ul> 

JQUERY

$(document).ready(function() { 
    $('.open').click(function() { 
    $('li.menu-item-has-children').parent().closest('.sub-menu').toggle(); 
    }); 
}); 

CSS

ul li { 
    list-style-type:none; 
} 
.open { 
    width:20px; 
    height:20px; 
    background-color:red; 
    color:#fff; 
    display:block; 
    cursor:pointer; 
    text-align:center; 
} 
.sub-menu { 
    display:none; 
} 

VIEW THE JS FIDDLE HERE

謝謝:)

+0

剛拋出這個在那裏,但jQuery UI的內置了一個[菜單控件(https://jqueryui.com/menu/)... – War10ck

回答

1

這裏沒有上下文this這裏。它應該是:

$(document).ready(function() { 
    $('.open').click(function() { 
    $(this).next('.sub-menu').toggle(); 
    }); 
}); 

當您使用$('li.menu-item-has-children'),它選擇所有的一切,而不是那個被點擊時的一個。觸發點擊事件的當前元素可以通過this關鍵字獲得,我已經使用它來使其工作。由於您有一個完美的結構,如<a>的子菜單,上面的代碼適用於.next()

片段

$(document).ready(function() { 
 
    $('.open').click(function() { 
 
    $(this).next('.sub-menu').toggle(); 
 
    }); 
 
});
ul li { 
 
list-style-type:none; 
 
} 
 
.open { 
 
    width:20px; 
 
    height:20px; 
 
    background-color:red; 
 
    color:#fff; 
 
    display:block; 
 
    cursor:pointer; 
 
    text-align:center; 
 
} 
 
.sub-menu { 
 
    display:none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li class="menu-item-has-children">Item 1</li> 
 
    <a class="open">+</a> 
 
    <ul class="sub-menu"> 
 
    <li>Sub Item 1</li> 
 
    <li>Sub Item 2</li> 
 
    <li class="menu-item-has-children">Sub Item 3</li> 
 
    <a class="open">+</a> 
 
    <ul class="sub-menu"> 
 
     <li>Sub Sub Item 1</li> 
 
     <li>Sub Sub Item 2</li> 
 
     <li>Sub Sub Item 3</li> 
 
     <li>Sub Sub Item 4</li> 
 
     <li>Sub Sub Item 5</li> 
 
    </ul> 
 
    <li>Sub Item 4</li> 
 
    <li>Sub Item 5</li> 
 
    </ul> 
 
</ul>

的jsfiddle:https://jsfiddle.net/bdh7seoh/

+1

這是偉大的感謝普利文!完美的作品。我試圖添加'打開'標籤與jQuery prepend像這樣:[link](https://jsfiddle.net/aLo6k7mo/5/),但你的代碼似乎並沒有工作時,這樣做...這可能嗎? –

+0

@FutureWebs不要預先考慮任何事情,因爲它與結構緊密相關。 –

0

另一種選擇是創建另一個類的sub-menu

$(document).ready(function() { 
 
\t $('.open').click(function() { 
 
\t \t $('li.menu-item-has-children').parent().closest('.sub-menu').toggle(); 
 
    }); 
 
    
 
    $('.open-sub1').click(function() { 
 
\t \t $('.sub-menu1').toggle(); 
 
    }); 
 
});
ul li { 
 
list-style-type:none; 
 
} 
 
.open, .open-sub1 { 
 
    width:20px; 
 
    height:20px; 
 
    background-color:red; 
 
    color:#fff; 
 
    display:block; 
 
    cursor:pointer; 
 
    text-align:center; 
 
} 
 
.sub-menu, .sub-menu1 { 
 
    display:none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<ul> 
 
    <li class="menu-item-has-children">Item 1</li> 
 
    <a class="open">+</a> 
 
    <ul class="sub-menu"> 
 
     <li>Sub Item 1</li> 
 
     <li>Sub Item 2</li> 
 
     <li class="menu-item-has-children">Sub Item 3</li> 
 
     <a class="open-sub1">+</a> 
 
     <ul class="sub-menu1"> 
 
      <li>Sub Sub Item 1</li> 
 
      <li>Sub Sub Item 2</li> 
 
      <li>Sub Sub Item 3</li> 
 
      <li>Sub Sub Item 4</li> 
 
      <li>Sub Sub Item 5</li> 
 
     </ul> 
 
     <li>Sub Item 4</li> 
 
     <li>Sub Item 5</li> 
 
    </ul> 
 
</ul>