我有以下代码快照
<ul id="Boss">
<li class="A">A-list
<ul>
<li class="B">Blah Blah
<ul>
<li><a href="#">Lorem Ipsum</a></li>
<li><a href="#">Medswer</a></li>
</ul>
</li>
<li class="B">Blah Blah BLah
<ul>
<li><a href="#">Brotx</a></li>
<li><a href="#">The holy</a></li>
<li><a href="#">Terodvc</a></li>
</ul>
</li>
我正在切换节点以像这样展开/折叠
$('#Boss').find('.A, .B, .C').filter(":not(:has(>a))").click(function () {
// code to toggle
return false;
}
但是,我希望在单击锚点时避免节点切换。所以我添加了一个过滤器,但它没有工作
$('#Boss').find('.A, .B, .C').filter(":not(:has(>a))").click(..)
我做错了什么?请建议使用什么代码作为过滤器,因为其他东西工作得很好,我不想改变太多
感谢。
答案 0 :(得分:1)
事件泡沫起来。因此,在锚点击事件中停止传播。即使你提到过滤器,你的锚点上的点击事件也会冒泡到li
上父/祖父母层次结构上注册的点击事件。所以有一种方法可以阻止传播。
$('#Boss ul li > a').on('click', function(e){
e.stopPropagation();
e.preventDefault(); //prevent the default action of anchor required here since it wont go to its parent li which has a return false.
// or combine them to return false;
});
或者您可以在li
的点击事件中使用支票
if(!$(this).is(e.target)){
//click did not happen on li, possibly on its descendants, do whatever you want.
}
答案 1 :(得分:1)
我想,你想要这样的东西(DEMO)
<强> HTML:强>
<ul id="Boss">
<li class="B">Blah Blah
<ul>
<li><a href="#">Lorem Ipsum</a></li>
<li><a href="#">Medswer</a></li>
</ul>
</li>
<li class="B">Blah Blah BLah
<ul>
<li><a href="#">Brotx</a></li>
<li><a href="#">The holy</a></li>
<li><a href="#">Terodvc</a></li>
</ul>
</li>
</ul>
<强> JS:强>
$(function(){
$('#Boss li').on('click', function(e){
e.stopPropagation();
$(this).find('ul').slideToggle()
});
});
答案 2 :(得分:0)
您应该停止事件传播。
$("#clickable a").click(function(e) {
//do something
e.stopPropagation();
})