[英]Show menu when i click on button and hide that when i click anywhere on the page or button
我有带有退出按钮等的下拉菜单配置文件小菜单。单击按钮时需要显示菜单,单击页面或按钮上的任意位置时也需要隐藏菜单。
<div id='menu'>
<ul>
<li class='has-sub'> <a class="testbutton" id="userButton" onclick="dropdown()" href="#">
<span id="buttonText">User name</span> <span id="triangleDown">▾</span>
</a>
<ul id="submenu">
<li class='has-sub'><a href='#'><span>Change password</span></a>
</li>
<li class='has-sub'><a href='logout.php?action=0'><span>Logout</span></a>
</li>
</ul>
</li>
</ul>
</div>
我用过JavaScript。 此时,仅当我单击配置文件按钮时,菜单才会显示为隐藏。 我也知道如何使用诸如document.ready之类的功能来启动功能。
我的无效代码:
function dropdown() {
if ($('#submenu').css('visibility') == 'hidden') {
$('#submenu').css('visibility', 'visible');
} else {
$('#submenu').css('visibility', 'hidden');
}
};
$(document).click(function (event) {
if ($('#submenu').css('visibility') == 'visible') {
$('#submenu').css('visibility', 'hidden');
}
});
但是,当我结合使用此方法时,它将无法正常工作。 因此,当我单击按钮以打开菜单时,什么也没发生。
对不起,我的英语:)预先感谢您的帮助。
这部分与事件传播有关。 简而言之,这意味着click事件不仅会在clicked元素上注册,还会在该元素的任何父元素或祖先元素上注册。
因此,如果您单击DIV,该事件也将在BODY上注册,因为DIV在BODY内部。 简而言之,如果厨房是犯罪现场,那么容纳该厨房的公寓也是犯罪现场。 一个在另一个里面。
这是通过防止传播来防止的-在jQuery中,通过运行自动传递给事件处理程序的evt
对象的stopPropagation()
方法来stopPropagation()
这种情况的发生。
无论如何,您的情况都可以大大简化。
var menu = $('#menu'), but = $('#menu_button');
$(document).on('click', '*', function(evt) {
evt.stopPropagation(); //<-- stop the event propagating to ancestral elements
if ($(this).is(but)) //<-- on button click, toggle visibility of menu
menu.toggle();
else if (!$(this).closest(menu).length) //<-- on click outside, hide menu
menu.hide();
});
假设:我假设切换按钮可通过选择器'#menu_button'定位。 根据需要更新。 此外,代码应在DOM就绪处理程序中运行。
该代码侦听对任何元素的点击。 如果在按钮上注册,则菜单的可见状态将被切换。 如果是菜单外的元素,则菜单被隐藏。 (在后一种情况下,如果菜单已经隐藏,则将无效。)
这是一个工作的JS小提琴 ,演示了该方法。
尝试这个:
$(function() {
$('.test-button').click(function(event) {
event.stopPropagation();
$('#submenu').toggle();
});
$('body').click(function() {
var submenu = $('#submenu');
if(submenu.is(":visible")) {
submenu.hide();
}
})
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.