无法完成此jQuery .slideUp代码

时间:2015-05-18 02:16:54

标签: jquery accordion jquery-ui-accordion

好的,首先我是jQuery的新手(我的背景纯粹是HTML5 / CSS3和图形)。无论如何,我正在开发一个jQuery菜单(试图同时学习),它像手风琴一样打开和关闭。

我的菜单的第一部分正在运行。当有人点击带有子菜单的顶级链接时,它会将一个“顶级活动”类分配给父li(列表项),然后使用.slideDown函数打开子菜单。

现在,为了关闭子菜单,我需要完成'.slideUp'部分,但不知怎的,我似乎停留在代码上。这是我到目前为止所做的,但我的语法远非正确,我担心......

https://jsfiddle.net/digitalsky/undjdrg8/9/

function accordion_menus(){

// if we are not on mobile (menu icon is hidden) show sub items and bail
if ( jQuery('#primary-navigation .menu-toggle').is(':hidden') ){
// show sub menus
jQuery('#primary-navigation ul.nav-menu ul.sub-menu').show();
return;
} else{
// hide sub menus
jQuery('#primary-navigation ul.nav-menu ul.sub-menu').hide();
}

// top level nav click function
jQuery('#primary-navigation ul.nav-menu > li > a').click(function(e){

// store parent li to variable
var parent_li = jQuery(this).parent('li');

// if sub menu does not exist in parent li
if ( !jQuery('ul.sub-menu', parent_li).first().length ) {
    return;
}

// if sub menu is already active, bail
if ( parent_li.hasClass('sub-menu-active') ){
    return;
}

// stop link click
e.preventDefault();

// store current sub menu in variable
var current_submenu = jQuery('ul.sub-menu', parent_li).first();

// slide up non-current sub menus
jQuery('#primary-navigation ul.nav-menu > li > ul.sub-menu').not(current_submenu).slideUp(function(){

    // remove sub-menu-active class from all first level items except current parent li
    jQuery('#primary-navigation ul.nav-menu > li').not(parent_li).removeClass('sub-menu-active');

});

// slide down current sub menu
current_submenu.slideDown(100, function(){
    // add sub-menu-active to current parent li
    parent_li.addClass('sub-menu-active');
});

});

// second level nav click function
jQuery('#primary-navigation ul.nav-menu ul.sub-menu > li > a').click(function(e){

// store parent li to variable
var parent_li = jQuery(this).parent('li');

// if sub menu does not exist in parent li
if ( !jQuery('ul.sub-menu', parent_li).first().length ) {
    return;
}

// if sub menu is already active, bail
if ( parent_li.hasClass('sub-menu-active') ){
    return;
}

// stop link click
e.preventDefault();

// store current sub menu in variable
var current_submenu = jQuery('ul.sub-menu', parent_li).first();

// slide up non-current sub menus
jQuery('#primary-navigation ul.nav-menu ul.sub-menu > li > ul.sub-menu').not(current_submenu).slideUp(function(){

    // remove sub-menu-active class from all second level items except current parent li
    jQuery('#primary-navigation ul.nav-menu ul.sub-menu > li').not(parent_li).removeClass('sub-menu-active');

});

// slide down current sub menu
current_submenu.slideDown(100, function(){
    // add sub-menu-active to current parent li
    parent_li.addClass('sub-menu-active');
});

});

}

长话短说,我只想在您点击它(当前它)时打开子菜单的“课程表”链接,但再次点击它时也会关闭子菜单。

我在脑子里一遍又一遍,看起来很简单,但我必须过于复杂。

也许我在这里偏离轨道,但我正在学习。

1 个答案:

答案 0 :(得分:0)

你的js在运行时只知道dom的当前状态。

这意味着当运行此代码时,它看不到任何具有类子菜单活动的父级,因为此时未设置此类。

它实际上永远不会在click函数中运行你想要的代码,因为它没有将click事件监听器附加到future元素。

要解决此问题,您需要创建一个检查所需内容的函数,然后设置.click(函数....在该函数内。

... EG

function checkSlideUp(){
if ( parent_li.hasClass('sub-menu-active') ){
    jQuery('#primary-navigation ul.nav-menu > li > a').off('click').on('click', function(e){

// store parent li to variable
var parent_li = jQuery(this).parent('li');

// store current sub menu in variable
var current_submenu = jQuery('ul.sub-menu', parent_li).first();

    // slide up current sub menu
    current_submenu.slideUp(function(){
        // remove sub-menu-active to current parent li
        parent_li.removeClass('sub-menu-active');


    });
});
}
}

如果你打电话给checkSlideUp();在您添加子菜单活动类(在您的其他函数中)之后,这将再次检查dom以查看是否需要在此时应用它。