【问题标题】:JQuery slideToggle, collapse the child elementsjQuery slideToggle,折叠子元素
【发布时间】:2013-11-28 09:46:56
【问题描述】:

我有一个带有可折叠子菜单的菜单,有 3 级菜单,它工作正常,但是当您单击折叠父级时,我不知道如何折叠所有子级。

它的工作方式是,如果您单击级别 1,它会展开级别 2,然后如果您单击级别 2,则会展开级别 3。

问题是,当所有级别都打开时,我需要能够单击级别 1 并将级别 2 和 3 折叠在一起。我目前正在使用 slideToggle。

我在下面粘贴了我的代码,我知道这是一种非常垃圾的方法,但我不得不为菜单项分配假的 H 标记,因为它是由 ASP:Menu 控件生成的,并且它没有提供唯一的 ID菜单项,所以我必须想办法解决它。

HTML:

<div id="Div1" class="MenuBar">
    <a href="#Menu1_SkipLink" style="position: absolute; left: -10000px; top: auto; width: 1px; height: 1px; overflow: hidden;">Skip Navigation Links</a>
    <div class="mainmenu" id="Div2">
        <ul class="level1">
            <li><a class="level1 staticItem level1">
                <img src="/images/calculator.png" alt="" title="" class="icon" /><h7>Financial</h7></a></li>
            <li><a class="level2 staticItem level2">
                <h10>Address</h10>
            </a></li>
            <li><a class="level3 staticItem level3" href="javascript:openNewWin(&#39;/Controls/Financial/AddressBook.aspx&#39;)">
                <h11>Address Book</h11>
            </a></li>
            <li><a class="level3 staticItem level3" href="javascript:openNewWin(&#39;/Controls/Financial/CustomerTypes.aspx&#39;)">
                <h12>Customer Types</h12>
            </a></li>
            <li><a class="level1 staticItem level1">
                <img src="/images/container.png" alt="" title="" class="icon" /><h8>Container</h8></a></li>
            <li><a class="level2 staticItem level2">
                <h13>Containers</h13>
            </a></li>
            <li><a class="level1 staticItem level1">
                <img src="/images/product.png" alt="" title="" class="icon" /><h9>Product</h9></a></li>
        </ul>
    </div>
    <a id="Menu1_SkipLink"></a>

</div>

jQuery:

$(function () {
    //When opening the page all level 2 and level 3 items must be hidden.
    $(function () {
        hideitems();
    })

    function hideitems() {
        $('h10').slideUp();
        $('h11').slideUp();
        $('h12').slideUp();
        $('h13').slideUp();
    }
    //Financial Click
    $(document).ready(function () {
        $('h7').click(function () {
            $('h10').slideToggle();

        });
    });
    //Address Click
    $(document).ready(function () {
    $('h10').click(function () {
        $('h11').slideToggle();
        $('h12').slideToggle();
    });
})
});

任何关于如何折叠所有子级别的建议将不胜感激,因为我不是 JS 大师。

【问题讨论】:

  • 不同之处在于我不能修改 UL 中的任何内容,包括提供类或 ID。
  • 这听起来太糟糕了,因为标记生成器完全不了解 HTML 的基础知识。
  • 是的,你是对的。我尝试了很多创建菜单的方法,而 ASP:menu 让我最接近。我快到了,但这只是我需要做的最后一件事才能使其正常工作。
  • 好吧,创建嵌套元素只需要 2/3 简单的 for 循环 + 一个数组/对象。无需使用第三方工具。

标签: c# javascript jquery asp.net webforms


【解决方案1】:

在不更改标记的情况下:构建一个将子项目链接到项目的结构,并在.click() 回调中使用它。

例如,您可以使用$(...).data 将数据与节点关联:

// init function :
// we stack all level2 and level3 items as subitems of the last level1 item we met
// we stack all level3 items as subitems of the last level2 item we met
function init() {
    var $menu = $('ul.level1');
    var lv1Itm = null,
        lv2Itm = null;
    $menu.find('a').each(function () {
        var subitems;
        var li = $(this).closest('li').get(0);
        if ($(this).hasClass('level1')) {
            lv1Itm = li;
            $(li).data('subitems', []);
        }

        if ($(this).hasClass('level2')) {
            lv2Itm = li;
            $(li).data('subitems', []);

            $(lv1Itm).data('subitems').push(li);
        }

        if ($(this).hasClass('level3')) {
            $(lv1Itm).data('subitems').push(li);
            $(lv2Itm).data('subitems').push(li);
        }
    });
}
init();

$('.level1').click(function (e) {
    var subitems = $(this).closest('li').data('subitems');
    var shouldHideSubmenus = $(subitems).is(':visible');
    if (shouldHideSubmenus) {
        // in this case, hide all 'li' children items
        $(subitems).slideUp();
    } else {
        // in this case, only show level2 items
        $(subitems).find('.level2').closest('li').slideDown();
    }
});

$('.level2').click(function (e) {
    var subitems = $(this).closest('li').data('subitems');
    var shouldHideSubmenus = $(subitems).is(':visible');
    if (shouldHideSubmenus) {
        // in this case, hide all 'li' children items
        $(subitems).slideUp();
    } else {
        // in this case, only show level3 items
        $(subitems).find('.level3').closest('li').slideDown();
    }
});

fiddle

【讨论】:

  • 我不明白你的意思,你能举个例子吗?请记住,我只能更改菜单​​级别的文本,不能更改其他内容。
  • 正如我所说,除了文本之外,我根本无法修改标记。它是由 ASP:menu 控件生成的,所以我必须利用我所拥有的。
  • 有没有办法在页面首次加载时折叠子菜单?
  • 是的,根据代码添加...$('.level2, .level3').closest('li').hide()应该可以工作
  • 好的,谢谢你这样做,我尝试了代码来替换我之前使用的代码,点击时它对屏幕元素没有任何影响。我还需要做什么才能让它工作吗?
【解决方案2】:

尝试使用这个http://jsfiddle.net/modaloda/B8b4z/1/

//Financial Click
$(document).ready(function () {
    $('h7').click(function () {
       $('h10').slideToggle(); 
       $('h11').slideUp("fast");
       $('h12').slideUp("fast");
    });
});

【讨论】:

  • 什么是.title.content等?
  • 我创建了一个,它不是很好,但如果你以金融为例,它会让你对问题有所了解。展开财务然后地址,然后再次单击财务。 jsfiddle.net/#&togetherjs=E1Rmk0AHwi
  • 请检查您的链接 jsfiddle.net/#&togetherjs=E1Rmk0AHwi
猜你喜欢
  • 2020-09-15
  • 2013-04-08
  • 1970-01-01
  • 2015-02-09
  • 2012-12-07
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多