Jquery垂直多级菜单父li捕获内部ul的鼠标点击?

Posted

技术标签:

【中文标题】Jquery垂直多级菜单父li捕获内部ul的鼠标点击?【英文标题】:Jquery vertical multilevel menu parent li catches mouseclicks of inner ul? 【发布时间】:2019-03-03 10:18:04 【问题描述】:

我正在尝试为小屏幕制作垂直多级菜单。

我首先在li 中的所有ul 项目中添加一个名为“隐藏”的css 类。我用 jquery 做这个。该类具有visibility:hiddenopacity:0height:0 属性

如果单击内部带有ulli,则会删除“隐藏”类,并添加“活动”类(到该ul)。我用 jquery 做这个。此类具有属性visibility:visibleopacity:1height:auto

$(".menu > li > ul").addClass("hidden");
	$(".menu > li > ul > li > ul").addClass("hidden");
	
	$(".menu > li").has("ul").click(function()
        if ( $(this).children("ul").hasClass( "hidden" ) ) 
            $(this).children("ul").removeClass("hidden");
            $(this).children("ul").addClass("active");
         else 
            $(this).children("ul").removeClass("active");
            $(this).children("ul").addClass("hidden");
        
    );

    $(".menu > li > ul > li").has("ul").click(function()
        if ( $(this).children("ul").hasClass( "hidden" ) ) 
            $(this).children("ul").removeClass("hidden");
            $(this).children("ul").addClass("active");
         else 
            $(this).children("ul").removeClass("active");
            $(this).children("ul").addClass("hidden");
        
    );
<ul class="menu">
    <li><a href="#">Home</a></li>
    <li>
        <a href="#">About</a>
        <ul>
            <li><a href="#">About 1.1</a></li>
            <li><a href="#">About 1.2</a></li>
        </ul>
    </li>
    <li>
        <a href="#">Hello</a>
        <ul>
            <li><a href="#">Hello 1.1</a></li>
            <li>
                <a href="#">Hello 1.2</a>
                <ul>
                    <li><a href="#">Hello 1.2.1</a></li>
                    <li><a href="#">Hello 1.2.2</a></li>
                    <li><a href="#">Hello 1.2.3</a></li>
                </ul>
            </li>
            <li><a href="#">Hello 1.3</a></li>
        </ul>
    </li>
</ul>

所有 ulli 项目在 css 中都有 position:static 。 a 项目有 position:block。

问题

如果我点击li About,就会显示 About 中的 ul。但是,如果我点击 li About 1.1,前面提到的 ul 会再次隐藏(它被分配 css-class 'hidden')。

认为 li 关于以某种方式“捕获”鼠标点击(因为它是包含父级的),使 jquery 删除“活动”类并应用“隐藏”类。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您需要将点击事件应用于a 而不是直接应用于整个li

请检查以下代码:

$(".menu > li > ul").addClass("hidden");
$(".menu > li > ul > li > ul").addClass("hidden");

$(".menu > li a").click(function()
	if ( $(this).parent().children("ul").hasClass( "hidden" ) ) 
		$(this).parent().children("ul").removeClass("hidden");
		$(this).parent().children("ul").addClass("active");
	 else 
		$(this).parent().children("ul").removeClass("active");
		$(this).parent().children("ul").addClass("hidden");
	
);
.hiddendisplay:none
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="menu">
    <li><a href="#">Home</a></li>
    <li>
        <a href="#">About</a>
        <ul>
            <li><a href="#">About 1.1</a></li>
            <li><a href="#">About 1.2</a></li>
        </ul>
    </li>
    <li>
        <a href="#">Hello</a>
        <ul>
            <li><a href="#">Hello 1.1</a></li>
            <li>
                <a href="#">Hello 1.2</a>
                <ul>
                    <li><a href="#">Hello 1.2.1</a></li>
                    <li><a href="#">Hello 1.2.2</a></li>
                    <li><a href="#">Hello 1.2.3</a></li>
                </ul>
            </li>
            <li><a href="#">Hello 1.3</a></li>
        </ul>
    </li>
</ul>

更多细节:

如果您在li 上应用click 事件,它将第一次使子ul li 可见,但是当您单击“关于 1.1”时,您首先单击其父项。

请看下图了解,当菜单打开时,整个li 将考虑点击事件

【讨论】:

您先生,真是个天才。我已经怀疑父李正在响应点击它的内部元素。以下适用于子菜单和子子菜单。我相信你忘记了 1 个父母()? $(".menu &gt; li a").click(function() if ( $(this).parent().children("ul").hasClass( "hidden" ) ) $(this).parent().children("ul").removeClass("hidden"); $(this).parent().children("ul").addClass("active"); else $(this).parent().children("ul").removeClass("active"); $(this).parent().children("ul").addClass("hidden"); );

以上是关于Jquery垂直多级菜单父li捕获内部ul的鼠标点击?的主要内容,如果未能解决你的问题,请参考以下文章

关闭多级 jquery 下拉菜单

jQuery ul li 悬停效果

CSS 导航菜单--悬停状态为父 UL 高度的 100%

带有 Php Mysql 的 Css 多级垂直菜单

单击父li时的jQuery slideToggle ul

使用 jQuery 删除内部 UL 和 Li 元素