我有一个简单的侧边栏导航菜单,嵌套元素设置如下:
<ul>
<li id="nav-Heading1">Heading 1
<ul id="nav-Expanded">
<li>Heading 2
<ul>
<li><a href="link1">Link 1</a></li>
<li><a href="link2">Link 2</a></li>
<li><a href="link3">Link 3</a></li>
</ul>
</li>
</ul>
</li>
</ul>
我要做的就是设置一个slideToggle()设置,这样当点击#nav-Heading1时,id为#nav-Expanded的ul会向下或向上滑动。
如果#nav-Expanded ul可见,那么您应该可以点击链接并转到网站中的正确页面。由于某种原因,slideToggle()被应用于所有元素,因此当您单击链接时,整个#nav-Expanded ul将消失。我不明白为什么这样做。这是我的JQuery:
$(document).ready(function () {
$("#nav-Heading1 ul#nav-Expanded").hide(); //hides the Expanded nav initially
$('#nav-Heading1').click(function(e) {
$("#nav-Heading1 ul#nav-Expanded").slideToggle("fast");
});
});
更新: 这是我的JFiddle http://jsfiddle.net/vPb5V/3/
答案 0 :(得分:2)
这种情况正在发生,因为链接上的点击正在冒泡并触发外部列表上的点击事件。
添加:
$('#nav-Heading2 a').click(function(e){e.stopPropagation();})
到你的代码来阻止它。
<强> jsFiddle example 强>
答案 1 :(得分:1)
由于你的孩子是nav-Heading1
的孩子,点击nav-Heading1
就可以点击它。
尝试检查切换前点击的ul:
if (!$(e.target).closest('#nav-Heading2').length) $("#nav-Heading1 ul#nav-Heading2").slideToggle("fast");
答案 2 :(得分:1)
<强> 1。方法强>
问题是#nav-Heading1
内的所有元素都将绑定到该事件。
要防止event bubbling使用以下内容:
$(document).ready(function () {
$("#nav-Heading1 ul#nav-Heading2").hide(); //hides the heading2 nav initially
$('#nav-Heading1 > span').click(function(e){
$("#nav-Heading1 ul#nav-Heading2").slideToggle("fast");
});
$("#nav-Heading2 a").click(function(e){
e.stopPropagation();
});
});
<强> 2。方法强>
包装#nav-Heading1的可点击部分:
<ul id="nav-Heading1">
<li><span>Heading 1</span>
<ul id="nav-Heading2">
<li>Heading 2
<ul>
<li><a href="link1">Link 1</a></li>
<li><a href="link2">Link 2</a></li>
<li><a href="link3">Link 3</a></li>
</ul>
</li>
</ul>
</li>
</ul>
现在将事件委托给span:
$(document).ready(function () {
$("#nav-Heading1 ul#nav-Heading2").hide(); //hides the heading2 nav initially
$('#nav-Heading1 > span').click(function(e){
$("#nav-Heading1 ul#nav-Heading2").slideToggle("fast");
});
});