点击外部菜单关闭jquery

点击外部菜单关闭jquery

问题描述:

所以我有一个下拉菜单,根据业务需求点击显示。鼠标远离后,菜单会再次隐藏。点击外部菜单关闭jquery

但是现在我被要求让它保持原状,直到用户点击文档上的任何位置。这如何实现?

这是什么,我现在有一个简化版本:

$(document).ready(function() { 
    $("ul.opMenu li").click(function(){ 
    $('#MainOptSubMenu',this).css('visibility', 'visible'); 
    }); 

    $("ul.opMenu li").mouseleave(function(){ 
     $('#MainOptSubMenu',this).css('visibility', 'hidden'); 
    }); 
}); 



<ul class="opMenu"> 
    <li id="footwo" class=""> 
    <span id="optImg" style="display: inline-block;"> <img src="http://localhost.vmsinfo.com:8002/insight/images/options-hover2.gif"/> </span> 
     <ul id="MainOptSubMenu" style="visibility: hidden; top: 25px; border-top: 0px solid rgb(217, 228, 250); background-color: rgb(217, 228, 250); padding-bottom: 15px;"> 
     <li>some</li> 
     <li>nav</li> 
     <li>links</li> 
     </ul> 
    </li> 
</ul> 

我想是这样的$('document[id!=MainOptSubMenu]').click(function()以为它会触发任何wasnt菜单,但它没有工作。

+0

我在这里有一个答案。 > [http:// *。COM /问题/ 152975 /怎么办 - 我 - 检测 - 一键式外一元/ 43405204#43405204(http://*.com/questions/152975/how-do-i-detect-a -click-outside-an-element/43405204#43405204) – 2017-04-14 04:29:55

+0

可能重复[如何检测元素外部的点击?](http://*.com/questions/152975/how-do-i-detect- a-click-an-element) – 2017-04-14 12:11:26

看一看的方法中使用这样的问题:

How do I detect a click outside an element?

附上一个click事件文档正文其关闭窗口。将一个单独的点击事件附加到停止传播到文档主体的窗口。
$('html').click(function() { 
    //Hide the menus if visible 
}); 

$('#menucontainer').click(function(event){ 
    event.stopPropagation(); 
}); 

+13

它非常美丽,但你应该使用$('html')。click()不是body。身体总是具有其内容的高度。它没有太多的内容,或者屏幕非常高,只能在身体填充的部分工作。复制从:http://*.com/questions/152975/how-to-detect-a-click-outside-an-element - meo Feb 2 25 '11在15:35 – NickGreen 2012-01-20 12:50:22

+0

伟大的解决方案。任何想法为什么它与.click(),而不是与.live('click',func ...? – Hat 2013-04-18 00:41:46

+3

)一起工作?这种方法唯一的问题是,已经有一个点击监听器的对象,其中stopPropagation由于其他原因没有效果。我理解为什么它是这样的,但它仍然是这个解决方案的一个局限性。 – DanH 2013-05-14 02:58:39

2,你可以调查选项:

  • 在菜单的显示,放置一个大的空DIV背后却掩盖了页面的其余部分并给予一对点击事件关闭菜单(及其本身)。这与用于单击背景的Lightbox关联的方法类似,可以在关闭菜单的主体上附加一次性单击事件处理程序。你使用jQuery的'.one()'。
+0

谢谢!我正在Wordpress网站上工作,并且第一个解决方案适用于我! – 2017-01-25 03:20:30

如果使用插件在你的情况下确定,那么我建议本Alman的clickoutside插件位于here

它的使用是如此简单:

$('#menu').bind('clickoutside', function (event) { 
    $(this).hide(); 
}); 

希望这会有所帮助。

+1

这个插件非常轻巧实用,易于实现。感谢分享链接。 – 2015-02-06 00:32:00

+0

伟大的插件,一直没有更新,但仍然很好。 – uberweb 2015-02-12 03:49:01

我想你需要的东西是这样的:http://jsfiddle.net/BeenYoung/BXaqW/3/

$(document).ready(function() { 
    $("ul.opMenu li").each(function(){ 
     $(this).click(function(){ 
      if($(this).hasClass('opened')==false){   
       $('.opMenu').find('.opened').removeClass('opened').find('ul').slideUp(); 
       $(this).addClass('opened'); 
       $(this).find("ul").slideDown(); 
      }else{ 
       $(this).removeClass('opened'); 
       $(this).find("ul").slideUp();    
      } 
     }); 
    });  
}); 

我希望对您有用!

答案是对的,但它会添加一个侦听器,每次在您的页面上发生点击时都会触发该侦听器。为了避免这种情况,您可以添加监听器只是一个时间:

$('a#menu-link').on('click', function(e) { 
    e.preventDefault(); 
    e.stopPropagation(); 

    $('#menu').toggleClass('open'); 

    $(document).one('click', function closeMenu (e){ 
     if($('#menu').has(e.target).length === 0){ 
      $('#menu').removeClass('open'); 
     } else { 
      $(document).one('click', closeMenu); 
     } 
    }); 
}); 

编辑:如果你想避免stopPropagation()初始按钮,您可以使用此

var $menu = $('#menu'); 

$('a#menu-link').on('click', function(e) { 
    e.preventDefault(); 

    if (!$menu.hasClass('active')) { 
     $menu.addClass('active'); 

     $(document).one('click', function closeTooltip(e) { 
      if ($menu.has(e.target).length === 0 && $('a#menu-link').has(e.target).length === 0) { 
       $menu.removeClass('active'); 
      } else if ($menu.hasClass('active')) { 
       $(document).one('click', closeTooltip); 
      } 
     }); 
    } else { 
     $menu.removeClass('active'); 
    } 
}); 
+0

我看到这样的代码很多,这不会为每次菜单链接添加一个新的点击功能的文档点击了吗?所以如果你单击菜单链接1000次而不刷新页面,你将有1000个函数占用内存并执行? – eselk 2013-04-08 22:10:56

+0

没关系,我没有看到“one”函数,现在我明白了为什么这样工作:http://api.jquery.com/one/ – eselk 2013-04-08 22:15:20

+2

不错的解决方案,但我不得不在Chrome中使用'e.stopPropagation()'来阻止第一个事件在'one()处理器 – antfx 2015-06-10 19:45:44

这个怎么样?

$(this).mouseleave(function(){ 
     var thisUI = $(this); 
     $('html').click(function(){ 
       thisUI.hide(); 
      $('html').unbind('click'); 
     }); 
    }); 

即使我遇到了同样的情况,我的导师之一把这个想法传达给自己。

step:1点击了我们应该显示下拉菜单的按钮。然后添加以下类名“more_wrap_background”到当前活动页面像下面

$('.ui-page-active').append("<div class='more_wrap_background' id='more-wrap-bg'> </div>"); 

步骤-2然后添加一个点击次数div标签等

$(document).on('click', '#more-wrap-bg', hideDropDown); 

示出,其中hideDropDown是函数被调用来隐藏下拉菜单

第3步和隐藏下拉菜单的重要步骤是,删除您以前添加的类如

$('#more-wrap-bg').remove(); 

我在上面的代码

.more_wrap_background { 
    top: 0; 
    padding: 0; 
    margin: 0; 
    background: rgba(0, 0, 0, 0.1); 
    position: fixed; 
    display: block; 
    width: 100% !important; 
    z-index: 999;//should be one less than the drop down menu's z-index 
    height: 100% !important; 
} 

使用ID删除我发现Grsmto's solution变体和Dennis' solution固定我的问题。

$(".MainNavContainer").click(function (event) { 
    //event.preventDefault(); // Might cause problems depending on implementation 
    event.stopPropagation(); 

    $(document).one('click', function (e) { 
     if(!$(e.target).is('.MainNavContainer')) { 
      // code to hide menus 
     } 
    }); 
}); 

$("html").click(onOutsideClick); 
onOutsideClick = function(e) 
{ 
    var t = $(e.target); 
    if (!(
     t.is("#mymenu") ||  //Where #mymenu - is a div container of your menu 
     t.parents("#mymenu").length > 0 
     ) ) 
    { 
     //TODO: hide your menu 
    } 
}; 

,更好地设定只有当你的菜单是可见的,并随时删除监听器菜单被隐藏后的监听器。

我觉得使用mousedown事件而不是点击事件更有用。如果用户使用点击事件点击页面上的其他元素,则点击事件不起作用。在与jQuery的一个()方法的组合,它看起来是这样的:

$("ul.opMenu li").click(function(event){ 

    //event.stopPropagation(); not required any more 
    $('#MainOptSubMenu').show(); 

    // add one mousedown event to html 
    $('html').one('mousedown', function(){ 
     $('#MainOptSubMenu').hide(); 
    }); 
}); 

// mousedown must not be triggered inside menu 
$("ul.opMenu li").bind('mousedown', function(evt){ 
    evt.stopPropagation(); 
}); 

我用具有相同行为的多个元素在同一个页面此解决方案:

$("html").click(function(event){ 
    var otarget = $(event.target); 
    if (!otarget.parents('#id_of element').length && otarget.attr('id')!="id_of element" && !otarget.parents('#id_of_activator').length) { 
     $('#id_of element').hide(); 
    } 
}); 

stopPropagation()是一个坏主意,这打破了很多事情的标准行为,包括按钮和链接。

+0

这很棒,但可以简化为'$ target.closest('#menu-container,#menu-activator')。length === 0' – 2014-06-19 19:43:23

stopPropagation选项不好,因为它们可能会干扰其他事件处理程序,包括其他可能附加了html元素的处理程序的菜单。

这是基于user2989143的回答一个简单的解决方案:

$("html").click(function(event) { 
    if ($(event.target).closest('#menu-container, #menu-activator').length === 0) { 
     $('#menu-container').hide(); 
    } 
}); 

使用 ':可见' 选择。 凡.menuitem是要隐藏元素(S)...

$('body').click(function(){ 
    $('.menuitem:visible').hide('fast'); 
}); 

或者,如果你已经有了一个变种的.menuitem元素(S)...

var menitems = $('.menuitem'); 
$('body').click(function(){ 
    menuitems.filter(':visible').hide('fast'); 
}); 

我有最近面临同样的问题。我写了下面的代码:

$('html').click(function(e) { 
     var a = e.target; 
     if ($(a).parents('.menu_container').length === 0) { 
     $('.ofSubLevelLinks').removeClass('active'); //hide menu item 
     $('.menu_container li > img').hide(); //hide dropdown image, if any 
    } 
    }); 

它对我来说是完美的。