jquery下拉菜单无法正常工作

时间:2022-02-09 11:20:29

I know wordpress has drop-down feature but for some reason it's broken on the current theme and I need it to work it again. My current code works but when I click on a parent menu item it opens all the submenus. I need to open only the clicked element.

我知道wordpress有下拉功能,但由于某种原因它在当前主题上被打破了,我需要它再次工作。我当前的代码工作,但当我点击父菜单项时,它打开所有子菜单。我只需要打开单击的元素。

I posted my code on jsfiddle but for some reason on jsfiddle the jquery code doesn't work. jsfiddle

我在jsfiddle上发布了我的代码但由于某种原因在jsfiddle上jquery代码不起作用。的jsfiddle

HTML

<ul id="menu-menu" class="navlinks"><li id="menu-item-257" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-2 current_page_item menu-item-257"><a href="#">Home</a></li>
<li id="menu-item-55" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-55"><a href="#">Menu Item</a></li>
<li id="menu-item-54" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-54"><a href="#">1</a>
<ul class="sub-menu">
<li id="menu-item-82" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-82"><a href="#">Menu Item</a></li>
</ul>
</li>
<li id="menu-item-83" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-83"><a href="#">Menu Item</a></li>
<li id="menu-item-56" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-56"><a href="#">Menu Item</a>
<ul class="sub-menu">
<li id="menu-item-296" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-296"><a href="#">1</a></li>
</ul>
</li>
<li id="menu-item-57" class="accessories menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-57"><a href="#">Accessories</a>
<ul class="sub-menu">
<li id="menu-item-320" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-320"><a href="#">1</a></li>
<li id="menu-item-319" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-319"><a href="#">2</a></li>
<li id="menu-item-317" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-317"><a href="#">3</a></li>
<li id="menu-item-318" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-318"><a href="#">4</a></li></ul>
</li>
</ul>

JQuery:

 $(document).ready(function() {
    $(".accessories").click(function() { //When trigger is clicked...

    //Following events are applied to the subnav itself (moving subnav up and down)
    $(this).parent().find(".sub-menu").slideDown('fast').show(); //Drop down the subnav on click

    $(this).parent().hover(function() {
    }, function(){  
        $(this).parent().find(".sub-menu").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
    });

    //Following events are applied to the trigger (Hover events for the trigger)
    }).hover(function() { 
        $(this).addClass("subhover"); //On hover over, add class "subhover"
    }, function(){  //On Hover Out
        $(this).removeClass("subhover"); //On hover out, remove class "subhover"
    });
});

3 个解决方案

#1


3  

Try this out:- http://jsfiddle.net/adiioo7/5jA3C/2/

JS:-

$(document).ready(function() {
    $(".menu-item").click(function() { //When trigger is clicked...

        //Following events are applied to the subnav itself (moving subnav up and down)
        $(this).find(".sub-menu").slideDown('fast').show(); //Drop down the subnav on click

        $(this).hover(function() {
        }, function(){  
            $(this).find(".sub-menu").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
        });

        //Following events are applied to the trigger (Hover events for the trigger)
        }).hover(function() { 
            $(this).addClass("subhover"); //On hover over, add class "subhover"
        }, function(){  //On Hover Out
            $(this).removeClass("subhover"); //On hover out, remove class "subhover"
    });
 });

#2


2  

Change into this:

换成这个:

$(".accessories").click(function () { //When trigger is clicked...

    //Following events are applied to the subnav itself (moving subnav up and down)
    $(this).find(".sub-menu").slideDown('fast').show(); //Drop down the subnav on click

    $(this).hover(function () {}, function () {
        $(this).find(".sub-menu").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
    });

    //Following events are applied to the trigger (Hover events for the trigger)
}).hover(function () {
    $(this).addClass("subhover"); //On hover over, add class "subhover"
}, function () { //On Hover Out
    $(this).removeClass("subhover"); //On hover out, remove class "subhover"
});

you need the current element as selector not its parent.

你需要当前元素作为选择器而不是它的父元素。

Side note: your jsfiddle demo not work because you have not selected any framework

旁注:你的jsfiddle演示不起作用,因为你没有选择任何框架

Demo: http://jsfiddle.net/XdgF7/

#3


1  

HTML

           <ul class="menu" id="menu">
<li><a href="#" class="menulink">Dropdown One</a>
    <ul>
        <li><a href="#">Navigation Item 1</a></li>
        <li>
            <a href="#" class="sub">Navigation Item 2</a>
            <ul>
                <li class="topline"><a href="#">Navigation Item 1</a></li>
                <li><a href="#">Navigation Item 2</a></li>
                <li><a href="#">Navigation Item 3</a></li>
                <li><a href="#">Navigation Item 4</a></li>
                <li><a href="#">Navigation Item 5</a></li>
            </ul>
        </li>
        <li>
            <a href="#" class="sub">Navigation Item 3</a>
            <ul>
                <li class="topline"><a href="#">Navigation Item 1</a></li>
                <li><a href="#">Navigation Item 2</a></li>
                <li>
                    <a href="#" class="sub">Navigation Item 3</a>
                    <ul>
                        <li class="topline"><a href="#">Navigation Item 1</a></li>
                        <li><a href="#">Navigation Item 2</a></li>
                        <li><a href="#">Navigation Item 3</a></li>
                        <li><a href="#">Navigation Item 4</a></li>
                        <li><a href="#">Navigation Item 5</a></li>
                        <li><a href="#">Navigation Item 6</a></li>
                    </ul>
                </li>
                <li><a href="#">Navigation Item 4</a></li>
            </ul>
        </li>
        <li><a href="#">Navigation Item 4</a></li>
        <li><a href="#">Navigation Item 5</a></li>
    </ul>
</li>
<li><a href="#" class="menulink">Non-Dropdown</a></li>
<li>
    <a href="#" class="menulink">Dropdown Two</a>
    <ul>
        <li><a href="#">Navigation Item 1</a></li>
        <li>
            <a href="#" class="sub">Navigation Item 2</a>
            <ul>
                <li class="topline"><a href="#">Navigation Item 1</a></li>
                <li><a href="#">Navigation Item 2</a></li>
                <li><a href="#">Navigation Item 3</a></li>
            </ul>
        </li>
    </ul>
</li>

CSS

   body {margin:25px; font:11px Verdana,Arial; background:#eee}
   ul.menu {list-style:none; margin:0; padding:0}
   ul.menu * {margin:0; padding:0}
   ul.menu a {display:block; color:#000; text-decoration:none}
   ul.menu li {position:relative; float:left; margin-right:2px}
   ul.menu ul {position:absolute; top:26px; left:0; background:#d1d1d1; display:none; opacity:0; list-style:none}
   ul.menu ul li {position:relative; border:1px solid #aaa; border-top:none; width:148px; margin:0}
   ul.menu ul li a {display:block; padding:3px 7px 5px; background-color:#d1d1d1}
   ul.menu ul li a:hover {background-color:#c5c5c5}
   ul.menu ul ul {left:148px; top:-1px}
   ul.menu .menulink {border:1px solid #aaa; padding:5px 7px 7px; font-weight:bold;    background:url(images/header.gif); width:134px}
   ul.menu .menulink:hover, ul.menu .menuhover {background:url(images/header_over.gif)}
   ul.menu .sub {background:#d1d1d1 url(images/arrow.gif) 136px 8px no-repeat}
   ul.menu .topline {border-top:1px solid #aaa}

Scripts

       var menu=function(){
var t=15,z=50,s=6,a;
function dd(n){this.n=n; this.h=[]; this.c=[]}
dd.prototype.init=function(p,c){
    a=c; var w=document.getElementById(p), s=w.getElementsByTagName('ul'), l=s.length, i=0;
    for(i;i<l;i++){
        var h=s[i].parentNode; this.h[i]=h; this.c[i]=s[i];
        h.onmouseover=new Function(this.n+'.st('+i+',true)');
        h.onmouseout=new Function(this.n+'.st('+i+')');
    }
}
dd.prototype.st=function(x,f){
    var c=this.c[x], h=this.h[x], p=h.getElementsByTagName('a')[0];
    clearInterval(c.t); c.style.overflow='hidden';
    if(f){
        p.className+=' '+a;
        if(!c.mh){c.style.display='block'; c.style.height=''; c.mh=c.offsetHeight; c.style.height=0}
        if(c.mh==c.offsetHeight){c.style.overflow='visible'}
        else{c.style.zIndex=z; z++; c.t=setInterval(function(){sl(c,1)},t)}
    }else{p.className=p.className.replace(a,''); c.t=setInterval(function(){sl(c,-1)},t)}
}
function sl(c,f){
    var h=c.offsetHeight;
    if((h<=0&&f!=1)||(h>=c.mh&&f==1)){
        if(f==1){c.style.filter=''; c.style.opacity=1; c.style.overflow='visible'}
        clearInterval(c.t); return
    }
    var d=(f==1)?Math.ceil((c.mh-h)/s):Math.ceil(h/s), o=h/c.mh;
    c.style.opacity=o; c.style.filter='alpha(opacity='+(o*100)+')';
    c.style.height=h+(d*f)+'px'
}
return{dd:dd}
  **strong text**}();

#1


3  

Try this out:- http://jsfiddle.net/adiioo7/5jA3C/2/

JS:-

$(document).ready(function() {
    $(".menu-item").click(function() { //When trigger is clicked...

        //Following events are applied to the subnav itself (moving subnav up and down)
        $(this).find(".sub-menu").slideDown('fast').show(); //Drop down the subnav on click

        $(this).hover(function() {
        }, function(){  
            $(this).find(".sub-menu").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
        });

        //Following events are applied to the trigger (Hover events for the trigger)
        }).hover(function() { 
            $(this).addClass("subhover"); //On hover over, add class "subhover"
        }, function(){  //On Hover Out
            $(this).removeClass("subhover"); //On hover out, remove class "subhover"
    });
 });

#2


2  

Change into this:

换成这个:

$(".accessories").click(function () { //When trigger is clicked...

    //Following events are applied to the subnav itself (moving subnav up and down)
    $(this).find(".sub-menu").slideDown('fast').show(); //Drop down the subnav on click

    $(this).hover(function () {}, function () {
        $(this).find(".sub-menu").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
    });

    //Following events are applied to the trigger (Hover events for the trigger)
}).hover(function () {
    $(this).addClass("subhover"); //On hover over, add class "subhover"
}, function () { //On Hover Out
    $(this).removeClass("subhover"); //On hover out, remove class "subhover"
});

you need the current element as selector not its parent.

你需要当前元素作为选择器而不是它的父元素。

Side note: your jsfiddle demo not work because you have not selected any framework

旁注:你的jsfiddle演示不起作用,因为你没有选择任何框架

Demo: http://jsfiddle.net/XdgF7/

#3


1  

HTML

           <ul class="menu" id="menu">
<li><a href="#" class="menulink">Dropdown One</a>
    <ul>
        <li><a href="#">Navigation Item 1</a></li>
        <li>
            <a href="#" class="sub">Navigation Item 2</a>
            <ul>
                <li class="topline"><a href="#">Navigation Item 1</a></li>
                <li><a href="#">Navigation Item 2</a></li>
                <li><a href="#">Navigation Item 3</a></li>
                <li><a href="#">Navigation Item 4</a></li>
                <li><a href="#">Navigation Item 5</a></li>
            </ul>
        </li>
        <li>
            <a href="#" class="sub">Navigation Item 3</a>
            <ul>
                <li class="topline"><a href="#">Navigation Item 1</a></li>
                <li><a href="#">Navigation Item 2</a></li>
                <li>
                    <a href="#" class="sub">Navigation Item 3</a>
                    <ul>
                        <li class="topline"><a href="#">Navigation Item 1</a></li>
                        <li><a href="#">Navigation Item 2</a></li>
                        <li><a href="#">Navigation Item 3</a></li>
                        <li><a href="#">Navigation Item 4</a></li>
                        <li><a href="#">Navigation Item 5</a></li>
                        <li><a href="#">Navigation Item 6</a></li>
                    </ul>
                </li>
                <li><a href="#">Navigation Item 4</a></li>
            </ul>
        </li>
        <li><a href="#">Navigation Item 4</a></li>
        <li><a href="#">Navigation Item 5</a></li>
    </ul>
</li>
<li><a href="#" class="menulink">Non-Dropdown</a></li>
<li>
    <a href="#" class="menulink">Dropdown Two</a>
    <ul>
        <li><a href="#">Navigation Item 1</a></li>
        <li>
            <a href="#" class="sub">Navigation Item 2</a>
            <ul>
                <li class="topline"><a href="#">Navigation Item 1</a></li>
                <li><a href="#">Navigation Item 2</a></li>
                <li><a href="#">Navigation Item 3</a></li>
            </ul>
        </li>
    </ul>
</li>

CSS

   body {margin:25px; font:11px Verdana,Arial; background:#eee}
   ul.menu {list-style:none; margin:0; padding:0}
   ul.menu * {margin:0; padding:0}
   ul.menu a {display:block; color:#000; text-decoration:none}
   ul.menu li {position:relative; float:left; margin-right:2px}
   ul.menu ul {position:absolute; top:26px; left:0; background:#d1d1d1; display:none; opacity:0; list-style:none}
   ul.menu ul li {position:relative; border:1px solid #aaa; border-top:none; width:148px; margin:0}
   ul.menu ul li a {display:block; padding:3px 7px 5px; background-color:#d1d1d1}
   ul.menu ul li a:hover {background-color:#c5c5c5}
   ul.menu ul ul {left:148px; top:-1px}
   ul.menu .menulink {border:1px solid #aaa; padding:5px 7px 7px; font-weight:bold;    background:url(images/header.gif); width:134px}
   ul.menu .menulink:hover, ul.menu .menuhover {background:url(images/header_over.gif)}
   ul.menu .sub {background:#d1d1d1 url(images/arrow.gif) 136px 8px no-repeat}
   ul.menu .topline {border-top:1px solid #aaa}

Scripts

       var menu=function(){
var t=15,z=50,s=6,a;
function dd(n){this.n=n; this.h=[]; this.c=[]}
dd.prototype.init=function(p,c){
    a=c; var w=document.getElementById(p), s=w.getElementsByTagName('ul'), l=s.length, i=0;
    for(i;i<l;i++){
        var h=s[i].parentNode; this.h[i]=h; this.c[i]=s[i];
        h.onmouseover=new Function(this.n+'.st('+i+',true)');
        h.onmouseout=new Function(this.n+'.st('+i+')');
    }
}
dd.prototype.st=function(x,f){
    var c=this.c[x], h=this.h[x], p=h.getElementsByTagName('a')[0];
    clearInterval(c.t); c.style.overflow='hidden';
    if(f){
        p.className+=' '+a;
        if(!c.mh){c.style.display='block'; c.style.height=''; c.mh=c.offsetHeight; c.style.height=0}
        if(c.mh==c.offsetHeight){c.style.overflow='visible'}
        else{c.style.zIndex=z; z++; c.t=setInterval(function(){sl(c,1)},t)}
    }else{p.className=p.className.replace(a,''); c.t=setInterval(function(){sl(c,-1)},t)}
}
function sl(c,f){
    var h=c.offsetHeight;
    if((h<=0&&f!=1)||(h>=c.mh&&f==1)){
        if(f==1){c.style.filter=''; c.style.opacity=1; c.style.overflow='visible'}
        clearInterval(c.t); return
    }
    var d=(f==1)?Math.ceil((c.mh-h)/s):Math.ceil(h/s), o=h/c.mh;
    c.style.opacity=o; c.style.filter='alpha(opacity='+(o*100)+')';
    c.style.height=h+(d*f)+'px'
}
return{dd:dd}
  **strong text**}();