我正在尝试使用可通过箭头切换激活的下拉菜单执行垂直菜单,同时仍保持顶级链接处于活动状态且可单击。我正在使用自定义CMS,因此我对如何使其工作有一些限制。
HTML
<ul class="topnav">
<li class="tn_first">
<span></span><a class="topmenu" href="/default.asp">Home</a>
</li>
<li class="tn_mid">
<span></span><a class="topmenu" href="/listings.asp">My Listings</a>
<ul class="subnav">
<li class="sn_first">
<a class="submenu" href="#">Listing 1</a>
</li>
<li class="sn_mid">
<a class="submenu" href="#">Listing 2</a>
</li>
<li class="sn_last">
<a class="submenu" href="#">Listing 3</a>
</li>
</ul>
</li>
<li class="tn_last">
<span></span><a class="topmenu" href="/links.asp">System Pages</a>
<ul class="subnav">
<li class="sn_first">
<a class="submenu" href="#">Page 1</a>
</li>
<li class="sn_mid">
<a class="submenu" href="#">Page 2</a>
</li>
<li class="sn_last">
<a class="submenu" href="#">Page 3</a>
</li>
</ul>
</li>
</ul>
所以我有一个非常简单的UL LI菜单系统。我已经在顶级导航的模板中添加了一个span标记,我想将其用作切换开关。跨度可以改为任何东西,这正是我目前所拥有的。
我遇到的问题是,鉴于这是一个模板系统,我可以选择将span放入,但是没有选项根据ul.subnav是否存在于同一条件中而有条件地显示李。所以我需要一些方法来应用display:block到实际满足这个条件的那些,然后我只显示:默认情况下没有其他跨度。
我尝试使用这个解决方案,它确实起到了一定的作用,但它不适用于多个下拉菜单,只有在菜单结构中有一个下拉列表实例时,它似乎才有效。
jQuery Toggle Dropdown Menu 和 http://jsfiddle.net/hXNnD/1/
的Javascript
jQuery(document).ready(function () {
var subMenu = jQuery("li ul li");
var linkClick = jQuery("ul li").filter(":has(ul)");
subMenu.hide();
linkClick.click(function (e) {
e.preventDefault();
subMenu.slideToggle("fast");
});
});
我创建了另一个有2个子UL的示例,这样您就可以看到代码落在哪里。
答案 0 :(得分:1)
使用CSS隐藏您的跨度并转到:$('.topnav li:has(ul) span').show();
http://jsbin.com/ujoqek/1/edit
CSS:
.topnav li span{ display:none; }
JQ:
var arrow = ['▼','▲'];
$('.topnav li:has(ul) span').show().html( arrow[0] ).data('a',0);
$('.topnav li > ul').hide();
$('.topnav span').click(function(){
$(this).closest('li').find('ul').slideToggle();
var arrw = $(this).data('a');
$(this).html( arrow[++arrw%2] ).data('a', arrw);
});
答案 1 :(得分:0)
我认为这就是你想要的。我可能错了。
$('li').each(function(){
//if we can find a UL with the class of subnav within our LI
if($(this).find('ul.subnav').length){
//find the span within this LI and give it a display block
$(this).find('span').css('display', 'block')
}else{
//otherwise, hide the span.
$(this).find('span').css('display', 'none')
}
});