我有一些 HTML 菜单,当用户单击这些菜单的头部时,我会完全显示这些菜单。我想当用户在菜单区域之外单击时隐藏这些元素。
使用 jQuery 可以实现这样的功能吗?
$("#menuscontainer").clickOutsideThisElement(function() {
// Hide the menus
});
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
您可以侦听
document上的 click 事件,然后确保#menucontainer不是被单击元素的祖先或目标通过使用.closest()。如果不是,则单击的元素位于
#menucontainer之外,您可以安全地将其隐藏。$(document).click(function(event) { var $target = $(event.target); if(!$target.closest('#menucontainer').length && $('#menucontainer').is(":visible")) { $('#menucontainer').hide(); } });编辑 – 2017 年 6 月 23 日
如果您打算关闭菜单并想要停止侦听事件,您还可以在事件侦听器之后进行清理。此函数将仅清理新创建的侦听器,保留
document上的任何其他点击侦听器。使用 ES2015 语法:export function hideOnClickOutside(selector) { const outsideClickListener = (event) => { const $target = $(event.target); if (!$target.closest(selector).length && $(selector).is(':visible')) { $(selector).hide(); removeClickListener(); } } const removeClickListener = () => { document.removeEventListener('click', outsideClickListener); } document.addEventListener('click', outsideClickListener); }编辑 – 2018 年 11 月 3 日
对于那些不想使用 jQuery 的人。这是上面的普通 vanillaJS (ECMAScript6) 代码。
function hideOnClickOutside(element) { const outsideClickListener = event => { if (!element.contains(event.target) && isVisible(element)) { // or use: event.target.closest(selector) === null element.style.display = 'none'; removeClickListener(); } } const removeClickListener = () => { document.removeEventListener('click', outsideClickListener); } document.addEventListener('click', outsideClickListener); } const isVisible = elem => !!elem && !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); // source (2018-03-11): https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js注意: 这是基于 Alex 的评论,仅使用
!element.contains(event.target)而不是 jQuery 部分。但是
element.closest()现在也可在所有主要浏览器中使用(W3C 版本与 jQuery 版本略有不同)。 Polyfill 可以在这里找到:Element.closest()编辑 – 2020-05-21
如果您希望用户能够在元素内部单击并拖动,然后在元素外部释放鼠标,而不关闭元素:
... let lastMouseDownX = 0; let lastMouseDownY = 0; let lastMouseDownWasOutside = false; const mouseDownListener = (event: MouseEvent) => { lastMouseDownX = event.offsetX; lastMouseDownY = event.offsetY; lastMouseDownWasOutside = !$(event.target).closest(element).length; } document.addEventListener('mousedown', mouseDownListener);在
outsideClickListener中:const outsideClickListener = event => { const deltaX = event.offsetX - lastMouseDownX; const deltaY = event.offsetY - lastMouseDownY; const distSq = (deltaX * deltaX) + (deltaY * deltaY); const isDrag = distSq > 3; const isDragException = isDrag && !lastMouseDownWasOutside; if (!element.contains(event.target) && isVisible(element) && !isDragException) { // or use: event.target.closest(selector) === null element.style.display = 'none'; removeClickListener(); document.removeEventListener('mousedown', mouseDownListener); // Or add this line to removeClickListener() } }将单击事件附加到关闭窗口的文档正文。将单独的单击事件附加到容器,以停止传播到文档正文。
$(window).click(function() { //Hide the menus if visible }); $('#menucontainer').click(function(event){ event.stopPropagation(); });