0

我有一个非常简单的 jQuery 下拉菜单,其中包含通常的 ul/li 列表排列中的链接。下拉菜单的代码如下:

$('body').ready(function() {
      if(screen.width <= 720) {
          $('.dropdown').hover(function() { $(this).find('.subMenu').toggle(); });
          $('.dropdown').click(function() { if( $('this').css('display') != 'none') {
              $('this').toggle();
              }
          });
      }
      else
      {
          $('.dropdown').hover(
              function() { $(this).stop(true,true).find('.subMenu').slideDown("fast"); },
              function() { $(this).stop(true,true).find('.subMenu').hide(); } 
          );
      }
  });

在移动设备上(忽略 720 宽度,现在只是为了测试),我想实现以下功能:

  • 用户点击带有下拉菜单的链接 > 如果菜单已打开,请关闭它

  • 用户在另一个菜单已打开时点击链接 > 关闭上一个菜单,打开当前菜单

  • 用户点击页面上的其他位置 > 关闭所有打开的菜单

我发现悬停功能实际上处理了#2 和#3,但我不知道如何让#1 工作。我很确定我知道为什么要进行这种特殊的尝试

$('.dropdown').click(function() { if( $('this').css('display') != 'none') {
      $('this').toggle();
      }
});

失败。我猜点击(或点击,在这种情况下)触发悬停事件,这似乎优先,因此显示菜单,而不是隐藏它。

我怎样才能让它在移动设备上工作?

编辑:我正在使用 jQuery v1.7.2

HTML列表结构如下,以防对某人有帮助(精简版):

    <div id="navbar">
      <ul>
        <li class="dropdown"><a href="#">Link A</a></li>
        <li class="dropdown"><a href="#">Link B</a>
          <ul class="subMenu">
            <li><a href="#">Link 1</a></li>
            <li><a href="#">Link 2</a></li>
          </ul>
        </li>
      </ul>
    </div>
4

4 回答 4

1

if( $('this').css('display') != 'none') 可以替换为 if($('this').is(':hidden'))

您可以使用 .siblings() 关闭其他菜单...看不到 html 代码来说明选择器的外观。

作为选项,您可以添加一些类来检查是否还有其他打开的菜单...

  $('.dropdown').hover(function() { 
      $('.openedMenu .subMenu').hide().removeClass('openedMenu');
      $(this).find('.subMenu').toggle(); 
      $(this).addClass('openedMenu');
  });
  $('.dropdown').click(function() { 
      if( $('this').is(':hidden')) {
          $('this').toggle();
      }
  });
于 2012-05-30T07:30:48.127 回答
1

我只在 1 个移动网络项目中工作过,但我也遇到了点击事件的问题。我正在使用 jQuery 移动框架。解决方法是使用 jQm 中包含的“tap”事件,而不是单击。我猜你没有使用 jQuery mobile,我发现这个插件可以帮助你创建“点击”事件:http ://aanandprasad.com/articles/jquery-tappable/

于 2012-05-30T07:45:10.353 回答
1

如果您使用 jq 1.7+,请在此处尝试此演示http://jsfiddle.net/SCN5T/3/

$(function(){
    $(document).mousedown(function(){
         $('.dropdown .active').removeClass('active').children('ul').hide();
    })
    $('.dropdown').on('mousedown','.subMenu', function(e){
        e.stopPropagation();
        var elem = $(this);
        if(elem.is('.active')) {
            elem.children('ul').slideUp(150);
            elem.removeClass('active');
        } else {
             $('.dropdown .active').removeClass('active').children('ul').hide();
            elem.addClass('active').children('ul').slideDown(150);
        }
    });
    $('.subMenu').on('mousedown','ul', function(e){
        e.stopPropagation();
        alert('menu item clicked');
    });       
})
于 2012-05-30T08:11:54.860 回答
0

以下代码解决了我的特定问题:

$('html').mousedown(function() {
    $('.subMenu').hide();
    });

$('#navbar').mousedown(function(event) {
    event.stopPropagation();
    });

$('.dropdown').mousedown(function() {
    var ele = $(this).find('.subMenu');
    $('#navbar').find('.subMenu').each(function(index) { if(!$(this).is(ele)) $(this).hide(); } );
    ele.toggle();
    });

我遵循的基本思想是在接收到 mousedown 事件时找到子菜单并隐藏它们,除非该元素是用户单击的菜单。然后切换显示或隐藏菜单。事件传播部分和 body/html 隐藏部分来自 acrashik 的答案,更改$('html')为来自此答案

于 2012-05-30T08:43:49.463 回答