JavaScript点击下拉菜单切换

5

好的,我正在使用以下jquery下拉菜单。 我在网上找到了这段代码,它运行正常。 我想改变的是打开/关闭功能。现在只需要用鼠标悬停显示和隐藏菜单。 我想要更改它,使得菜单“单击”后显示并保持打开状态。 然后当用户从下拉菜单中选择链接时,菜单会关闭。 另外,如果他们在页面上的其他地方单击,则需要将其关闭。 我认为可以通过使用“toggle”事件来实现这一点,但我已经尝试了几个小时,没有成功。 有人可以帮忙吗? 代码如下。

HTML:

<ul id="jsddm">
    <li><a href="#">JavaScript</a>
        <ul>
            <li><a href="#">Drop Down Menu</a></li>
            <li><a href="#">jQuery Plugin</a></li>
            <li><a href="#">Ajax Navigation</a></li>
        </ul>
    </li>
    <li><a href="#">Effect</a>
        <ul>
            <li><a href="#">Slide Effect</a></li>
            <li><a href="#">Fade Effect</a></li>
            <li><a href="#">Opacity Mode</a></li>
            <li><a href="#">Drop Shadow</a></li>
            <li><a href="#">Semitransparent</a></li>
        </ul>
    </li>
    <li><a href="#">Navigation</a></li>
    <li><a href="#">HTML/CSS</a></li>
    <li><a href="#">Help</a></li>
</ul>

CSS:
#jsddm
{   margin: 0;
    padding: 0}

    #jsddm li
    {   float: left;
        list-style: none;
        font: 12px Tahoma, Arial}

    #jsddm li a
    {   display: block;
        background: #20548E;
        padding: 5px 12px;
        text-decoration: none;
        border-right: 1px solid white;
        width: 70px;
        color: #EAFFED;
        white-space: nowrap}

    #jsddm li a:hover
    {   background: #1A4473}

        #jsddm li ul
        {   margin: 0;
            padding: 0;
            position: absolute;
            visibility: hidden;
            border-top: 1px solid white}

        #jsddm li ul li
        {   float: none;
            display: inline}

        #jsddm li ul li a
        {   width: auto;
            background: #9F1B1B}

        #jsddm li ul li a:hover
        {   background: #7F1616}

javascript:

var timeout    = 500;
var closetimer = 0;
var ddmenuitem = 0;

function jsddm_open()
{  jsddm_canceltimer();
   jsddm_close();
   ddmenuitem = $(this).find('ul').css('visibility', 'visible');}

function jsddm_close()
{  if(ddmenuitem) ddmenuitem.css('visibility', 'hidden');}

function jsddm_timer()
{  closetimer = window.setTimeout(jsddm_close, timeout);}

function jsddm_canceltimer()
{  if(closetimer)
   {  window.clearTimeout(closetimer);
      closetimer = null;}}

$(document).ready(function()
{  $('#jsddm > li').bind('mouseover', jsddm_open)
   $('#jsddm > li').bind('mouseout',  jsddm_timer)});

document.onclick = jsddm_close;

我已经尝试了上述JS代码的最后4行,将mouseover更改为onclick,并尝试了一些toggle的变化,但无法使其正常工作。谢谢任何帮助。

你的代码格式非常好,我给了一个赞 :) - Sameera Thilakasiri
3个回答

2

请查看这个解决方案(jsfiddle)

这是修改后的代码:

var timeout    = 500;
var closetimer = 0;
var ddmenuitem = 0;

function jsddm_open(event)
{
   jsddm_canceltimer();
   jsddm_close();
   var submenu = $(this).find('ul');
    if(submenu){
        ddmenuitem = submenu.css('visibility', 'visible');
        return false;
    }
    return true;
}

function jsddm_close()
{  if(ddmenuitem) ddmenuitem.css('visibility', 'hidden');}

function jsddm_timer()
{  closetimer = window.setTimeout(jsddm_close, timeout);}

function jsddm_canceltimer()
{  if(closetimer)
   {  window.clearTimeout(closetimer);
      closetimer = null;}}

$(document).ready(function()
{  $('#jsddm li').bind('click', jsddm_open);
   $('#jsddm > li').bind('mouseout',  jsddm_timer);
   $('#jsddm > li').bind('mouseover', jsddm_canceltimer);
});

document.onclick = jsddm_close;

这很接近,但我需要它保持打开状态,直到有人从下拉菜单中选择或点击其他地方。之所以需要保持打开状态直到选择或点击是因为移动设备总是触发mouseout事件。由于移动设备上没有鼠标,每当有一个点击时,mouseout函数自动触发,导致立即关闭下拉菜单。在移动设备上无法使用mouseout。需要在点击时打开并保持打开状态,直到选择项目或再次点击鼠标。也许可以使用toggle?谢谢。 - user982853
好的,那么你根本不需要计时器。你只需通过注释掉mouseover和mouseout绑定即可实现。此外,删除所有冗余代码。http://jsfiddle.net/ENXpW/5/ - Pencho Ilchev

0

可能已经晚了,但我有一个解决方案!

我有一个类似于你所需的要求。我编写了一个简单的jQuery代码片段,以便在单击父菜单时获取下拉菜单。一旦您单击任何一个父菜单 - 它将显示其自己的子级别在下拉菜单中。

当您单击任何其他父菜单时 - 先前的下拉菜单将消失,新的下拉菜单将出现。

我在这里有教程:http://pepfry.com/tutorials/show-dropdown-menu-on-click-using-jquery

它有点静态 - 但非常有用。如果有任何问题,请随时在此处提出!

谢谢!

Stormstriker Sumesh


0
在下拉菜单中,除非绑定了点击功能,否则链接将无法工作。
var ddmenuitem = 0;

function jsddm_open(event)
{
   jsddm_close();
   var submenu = $(this).find('ul');
    if(submenu){
        ddmenuitem = submenu.css('visibility', 'visible');
        return false;
    }
    return true;
}

function jsddm_close()
{  if(ddmenuitem) ddmenuitem.css('visibility', 'hidden');}

function jsddm_link_fix() {
    window.location.replace($(this).attr("href"));
}

$(document).ready(function()
{  $('#jsddm li').bind('click', jsddm_open);
   $('#jsddm li ul li a').bind('click', jsddm_link_fix); // fixes drop down links
});

document.onclick = jsddm_close;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接