繁体   English   中英

jQuery每个其他元素上的运行函数

[英]jQuery each run function on every other element

我正在研究HTML和jQuery中的基本下拉菜单元素,并且试图更好地理解JavaScript和jQuery,因此,这个问题也与代码重构有关。

所以这是到目前为止我得到的:

HTML

<li class="nav-item">
    <a class="nav-link" href="#">Foo</a>
    <div class="subnav">
       ...
    </div>
</li>

JavaScript的

const navLink = $('.nav-link');

navLink.each(function () {
    let $this = $(this);
    $this.click(function (e) {
        let hasSubnav = $this.parent().find('.subnav');
        if(hasSubnav.length !== 0) {
            e.preventDefault();
            $this.toggleClass('dropdown-active');
        }
        hasSubnav.stop(true, true).slideToggle(200);
    })
});

此解决方案效果很好。 因此,我接下来要做的是检查循环中的另一个元素是否处于活动状态,相应地关闭,然后打开我刚刚单击的元素。

我考虑过将默认的click函数放在每个函数之前,如下所示:

navLink.click(function () {
    $('.subnav').slideUp();
});
navLink.each(function () {
    let $this = $(this);
    $this.click(function (e) {
        let hasSubnav = $this.parent().find('.subnav');
        if(hasSubnav.length !== 0) {
            e.preventDefault();
            $this.toggleClass('dropdown-active');
        }
        hasSubnav.stop(true, true).slideDown(200);
    })
});

但这似乎不起作用。 所以我的问题是,即使在每个函数内部,有没有一种漂亮的方法来实现这一目标? 我在这篇文章中提到了.not(this) ,这可能会起作用(尚未尝试过),但是我认为这将是重复的代码,并且可能会有更好的方法来使它起作用。

您的代码现在遍历每个导航链接,并向其中一个添加一个单击处理程序。 可以删除每个循环,因为您可以一次将单击处理程序添加到所有导航链接。

您所要做的就是在导航链接中添加一个点击处理程序,然后删除活动的类并向上滑动所有打开的下拉菜单,然后再执行逻辑。 请参阅下面的工作代码示例以供参考:

 // Collapse all initially $(".subnav").slideUp(); // Add click handler to all nav-links const navLink = $('.nav-link'); navLink.click(function(e) { // Remove active classes on other elements & slide up const otherLinks = navLink.not(this); otherLinks.removeClass('dropdown-active'); otherLinks.parent().find('.subnav').slideUp(); // Slide down the subnav of selected element let hasSubnav = $(this).parent().find('.subnav'); if (hasSubnav.length !== 0) { e.preventDefault(); $(this).addClass('dropdown-active'); } hasSubnav.stop(true, true).slideToggle(200); }) 
 <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> <li class="nav-item"> <a class="nav-link" href="#">Foo</a> <div class="subnav"> <a href="#">Link1</a> <a href="#">Link2</a> <a href="#">Link3</a> </div> </li> <li class="nav-item"> <a class="nav-link" href="#">Foo</a> <div class="subnav"> <a href="#">Link1</a> <a href="#">Link2</a> <a href="#">Link3</a> </div> </li> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM