这个问题涉及使用 jQuery 实现下拉菜单功能,需要同时满足两个需求:
$(document).ready(function() {
// 点击父菜单项展开/收起子菜单
$('.menu-item-has-children > a').click(function(e) {
e.preventDefault(); // 阻止默认行为
$(this).siblings('.sub-menu').toggle();
});
// 子菜单项点击时不阻止事件
$('.sub-menu a').click(function(e) {
// 这里不需要阻止事件,让链接正常跳转
});
});
$(document).ready(function() {
$('.menu-item-has-children').click(function(e) {
// 如果点击的是链接本身且不是子菜单中的链接
if ($(e.target).is('a') && !$(e.target).parents('.sub-menu').length) {
e.preventDefault();
$(this).find('.sub-menu').toggle();
}
});
});
$(document).ready(function() {
$('.menu-item-has-children > a').click(function(e) {
// 只有当子菜单隐藏时才阻止默认行为
if ($(this).siblings('.sub-menu').is(':hidden')) {
e.preventDefault();
$(this).siblings('.sub-menu').show();
}
// 如果子菜单已显示,则允许链接跳转
});
// 点击其他地方收起子菜单
$(document).click(function(e) {
if (!$(e.target).closest('.menu-item-has-children').length) {
$('.sub-menu').hide();
}
});
});
<ul class="menu">
<li class="menu-item">
<a href="/">首页</a>
</li>
<li class="menu-item menu-item-has-children">
<a href="/products">产品</a>
<ul class="sub-menu">
<li><a href="/products/phone">手机</a></li>
<li><a href="/products/computer">电脑</a></li>
</ul>
</li>
<li class="menu-item">
<a href="/about">关于我们</a>
</li>
</ul>
.sub-menu {
display: none;
position: absolute;
background: #fff;
border: 1px solid #ddd;
padding: 10px;
}
.menu-item-has-children {
position: relative;
}
.menu-item-has-children:hover .sub-menu {
display: block;
}
e.stopPropagation()
阻止事件冒泡,或者在事件处理中更精确地判断目标元素以上方案可以根据实际需求进行调整和组合使用。