【问题标题】:Keep menu open after clicking sub-item jQuery单击子项jQuery后保持菜单打开
【发布时间】:2013-12-05 21:18:16
【问题描述】:

我已经搜索过,但没有找到我要找的东西。

我的菜单使用 cookie,因此当页面重新加载时,它会保持打开的菜单保持打开状态。

但我意识到,当您单击 Hyperlink 2 的子项时,它会完全关闭 Hyperlink 2。有没有办法让它保持打开状态?

http://jsfiddle.net/Dnamixup/5S54v/

我尝试使用来自Here 的模拟点击答案,但除非我放置错误,否则它不起作用。

我还是 javascript/jQuery 的新手,但我正在慢慢掌握它!

谢谢

<ul class="nav">
<li><a>Hyperlink 1</a>

</li>
<li class="drop"><a>Hyperlink 2</a>

    <ul id="m1">
        <li><a href="#">Hyperlink Sub</a>

        </li>
        <li><a href="#">Hyperlink Sub</a>

        </li>
    </ul>
</li>
<li class="drop"><a>Hyperlink 3</a>

    <ul id="m2">
        <li><a href="#">Hyperlink Sub</a>

        </li>
        <li><a href="#">Hyperlink Sub</a>

        </li>
    </ul>
</li>
<li class="drop"><a>Hyperlink 4</a>

    <ul id="m3">
        <li><a href="#">Hyperlink Sub</a>

        </li>
        <li><a href="#">Hyperlink Sub</a>

        </li>
    </ul>
</li>

jQuery(function ($) {
// jQuery code in here can safely use $
$('.nav li')
    .css({
    cursor: "pointer"
});

$(".drop")
    .on('click', function () {
    $(this).toggleClass('open');
    $(this).find('ul').toggle();
    $.cookie('open_items', 'the_value');
    openItems = new Array();
    $("li.drop").each(function (index, item) {
        if ($(item).hasClass('open')) {
            openItems.push(index);
        }
    });
    $.cookie('open_items', openItems.join(','));
});

if ($.cookie('open_items') && $.cookie('open_items').length > 0) {
    previouslyOpenItems = $.cookie('open_items');
    openItemIndexes = previouslyOpenItems.split(',');
    $(openItemIndexes).each(function (index, item) {
        $("li.drop").eq(item).addClass('open').find('ul').toggle();
    });
}
});

【问题讨论】:

    标签: javascript jquery html css


    【解决方案1】:

    停止传播被点击的孩子:

    DEMO

     $(".drop li a")
            .on('click', function (e) {
                e.stopPropagation();
            });
    

    【讨论】:

    • 您先生,是我的超级英雄!非常感谢!
    • @A.Wolff:+1 你的回答很好,确实解决了问题。不过请注意 OP,虽然这可行,但会添加一个额外的事件处理程序来解决问题。一般来说,这很好,但您可以通过在初始选择器中更直接地定位您的元素来避免这个问题。我的观点是,为什么要应用解决方案来解决您可以避免的问题?
    【解决方案2】:

    将点击事件的选择器更改为".drop&gt;a" 似乎可行。 然后,您需要做的就是管理 li 略有不同,类似于:

    $(".drop>a").on('click', function (eventData) {
        var $listItem = $(this).closest('li');
    
        $listItem.find('ul').toggle();
        $listItem.toggleClass('open');
    
        $.cookie('open_items', 'the_value');
        openItems = new Array();
    
        $("li.drop").each(function (index, item) {
            if ($(item).hasClass('open')) {
                openItems.push(index);
            }
        });
        $.cookie('open_items', openItems.join(','));
    });
    

    DEMO - 单击内部链接时保持菜单打开


    【讨论】:

    • 谢谢你的回答:)
    【解决方案3】:

    您不应将 click 事件应用于 .drop 元素,而应应用于它们的子元素。比如:

    <div class="drop">
       <a class="click-to-open">Click here to open</a>
          <ul>
             <li>Sub links etc...</li>
             <li>...</li>
          </ul>
     </div>
    
    
     $('.drop .click-to-open').click(function() {
    
       //toggle the open class etc
    
       //use .parent() to access the .drop div
       $(this).parent().toggleClass('open');
    
     });
    

    【讨论】:

    • 谢谢你的回答,我认为上面的评论基本上停止了这一点,但这清除了它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多