我有下面的下拉菜单代码,如果菜单栏宽度不足以显示所有项目取决于屏幕宽度,则此代码用于将项目放在下拉列表中。所有工作正常,但我希望当单击out隐藏下拉菜单时,我尝试了。鼠标,但没有工作,我希望您能帮助我所有的工作良好,但我希望当单击外隐藏下拉菜单,我尝试了。鼠标,,但没有工作,代码是很大的。
<script>
var $nav = $('.greedy-nav');
var $btn = $('.greedy-nav button');
var $vlinks = $('.greedy-nav .visible-links');
var $hlinks = $('.greedy-nav .hidden-links');
var breaks = [];
function updateNav() {
var availableSpace = $btn.hasClass('hidden') ? $nav.width() : $nav.width() -
$btn.width() - 30;
if($vlinks.width() > availableSpace) {
breaks.push($vlinks.width());
$vlinks.children().last().prependTo($hlinks);
if($btn.hasClass('hidden')) {
$btn.removeClass('hidden');
}
} else {
if(availableSpace > breaks[breaks.length-1]) {
$hlinks.children().first().appendTo($vlinks);
breaks.pop();
}
if(breaks.length < 1) {
$btn.addClass('hidden');
$hlinks.addClass('hidden');
}
}
$btn.attr("count", breaks.length);
if($vlinks.width() > availableSpace) {
updateNav();
}
}
$(window).resize(function() {
updateNav();
});
$btn.on('click', function() {
$hlinks.toggleClass("hidden");
});
updateNav();
</script> <div id="shouldPin">
<div class="ItemListForMenu_shouldPin" id="CategoriesList">
<div class="MenuCategoriesList_categoriesSection">
<nav class='greedy-nav'>
<button id="mybtn">More</button>
<ul id="mainNav" class='visible-links'>
<li><a href='' class="MainCategory">Appetizers</a></li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
<li><a href='' class="MainCategory">Appetizers</a></li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
<li><a href='' class="MainCategory">Appetizers</a></li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
<li><a href='' class="MainCategory">Appetizers</a></li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
</ul>
<ul id="menu_dropdown" class='hidden-links hidden'></ul>
</nav>
</div>
</div>
</div>发布于 2018-06-21 19:20:45
您可以使用$.contains()来确定某个元素是否在另一个元素的内部。您需要在整个文档上创建一个单击处理程序,并检查单击target是否在下拉列表中:
$(document).on('click', function(e) {
const dropdown = $('.dropdown');
if(!$.contains(dropdown, e.target) {
// Close dropdown
$(dropdown).toggleClass('hidden');
}
});为了保持应用程序的性能,您只想在document下拉列表打开时将单击事件添加到中,并在下拉列表关闭时从document中删除单击事件。
编辑:这里是一个工作片段,演示了我的建议。您首先检查下拉列表是否已经隐藏,然后检查用户是否在下拉列表中单击了链接。如果这两个都不是真的,那么它将隐藏第二个下拉列表。单击菜单外部将关闭第二个下拉列表:
var $nav = $('.greedy-nav');
var $btn = $('.greedy-nav button');
var $vlinks = $('.greedy-nav .visible-links');
var $hlinks = $('.greedy-nav .hidden-links');
var breaks = [];
function updateNav() {
var availableSpace = $btn.hasClass('hidden') ? $nav.width() : $nav.width() -
$btn.width() - 30;
if ($vlinks.width() > availableSpace) {
breaks.push($vlinks.width());
$vlinks.children().last().prependTo($hlinks);
if ($btn.hasClass('hidden')) {
$btn.removeClass('hidden');
}
} else {
if (availableSpace > breaks[breaks.length - 1]) {
$hlinks.children().first().appendTo($vlinks);
breaks.pop();
}
if (breaks.length < 1) {
$btn.addClass('hidden');
$hlinks.addClass('hidden');
}
}
$btn.attr("count", breaks.length);
if ($vlinks.width() > availableSpace) {
//updateNav();
}
}
$(window).resize(function() {
//updateNav();
});
$btn.on('click', function(e) {
e.stopPropagation();
$hlinks.toggleClass("hidden");
});
updateNav();
$(document).on('click', function(e) {
// Check if the dropdown is already hidden
// Check if the clicked target exists in the hidden dropdown
// Check if the clicked target exists in the visible dropdown
// If none are true, then hide the dropdown
if (!$($hlinks).hasClass('hidden') &&
!$.contains($hlinks[0], e.target) &&
!$.contains($vlinks[0], e.target)) {
$($hlinks).addClass('hidden');
}
});.hidden {
display: none;
}
.visible-links {
background: #ededed;
}
.hidden-links {
background: #222;
}
.hidden-links a {
color: #FFF;
}
#shouldPin {
padding-bottom: 300px;
}<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="shouldPin">
<div class="ItemListForMenu_shouldPin" id="CategoriesList">
<div class="MenuCategoriesList_categoriesSection">
<nav class='greedy-nav'>
<button id="mybtn">More</button>
<ul id="mainNav" class='visible-links'>
<li>Appetizers</li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
<li><a href='' class="MainCategory">Appetizers</a></li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
<li><a href='' class="MainCategory">Appetizers</a></li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
<li><a href='' class="MainCategory">Appetizers</a></li>
<li><a href='' class="MainCategory">Soups</a></li>
<li><a href='' class="MainCategory">Salads</a></li>
<li><a href='' class="MainCategory">Sashimi or Sushi</a></li>
</ul>
<ul id="menu_dropdown" class='hidden-links hidden'></ul>
</nav>
</div>
</div>
</div>
https://stackoverflow.com/questions/50973688
复制相似问题