Reputation: 35
I have this drop-down menu that I am doing, it works through clicks and is almost finished, but I have a problem and it is that when I click on one of the options that contains a link I would like the menu to close completely, in my example, the link with "Hello" is the one that I want to close the menu after clicking, thank you very much in advance who can help me with my problem.
var menu = $('.dropdown li a')
$('.dropdown li a').on("click", function(e) {
e.stopPropagation();
let current = $(this).next('ul');
$(this).closest('ul').find('ul').each((index, item) => {
if($(item)[0] != $(current)[0]) {
$(item).hide();
}
});
current.toggle();
});
$(document).on("click", function(e){
if(!menu.is(e.target) && !menu.has(e.target).length){
menu.next('ul').hide();
}
});
*{margin:0; padding:0; outline:0; box-sizing:border-box;}
.dropdown{background:#333; display:block; height:28px;}
.dropdown li{position:relative; float:left; list-style:none; white-space:nowrap; background:#34353a;}
.dropdown li a{display:block; height:28px; line-height:28px; padding:0 8px; text-decoration:none; color:#ccc;}
.dropdown ul{position:absolute; display:none;}
.dropdown li ul ul{left:100%; top:0;}
.dropdown li ul li{float:none;}
.dropdown img{margin-right:5px; position:relative; top:2px;}
.dropdown li:hover{background:#2e4e89;}
.dropdown li a:hover{color:#eee;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class="dropdown">
<li><a href="#">Menu 1</a>
<ul>
<li><a href="#">Option 1 ></a>
<ul>
<li><a href="#">Option 4</a></li>
<li><a href="#">Option 5 ></a>
<ul>
<li><a href="#">Option 7</a></li>
</ul>
</li>
<li><a href="#">Option 6 ></a>
<ul>
<li><a href="#">Option 8</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Option 2</a></li>
<li><a href="#hello">Hello</a></li>
</ul>
</li>
<li><a href="#">Menu 2</a>
<ul>
<li><a href="#">Option 1</a></li>
<li><a href="#">Option 2</a></li>
</ul>
</li>
</ul>
<h1 id="hello" style="margin-top:500px; padding:100px;">Hello World!</h1>
Upvotes: 1
Views: 45
Reputation: 6554
Check if element has following sibling using .next()
var menu = $('.dropdown li a')
$('.dropdown li a').on("click", function(e) {
e.stopPropagation();
let current = $(this).next('ul');
$(this).closest('ul').find('ul').each((index, item) => {
if ($(item)[0] != $(current)[0]) {
$(item).hide();
}
});
console.log($(this).next().length)
if ($(this).next().length > 0) {
current.toggle();
} else {
menu.next('ul').hide();
}
});
$(document).on("click", function(e) {
if (!menu.is(e.target) && !menu.has(e.target).length) {
menu.next('ul').hide();
}
});
* {
margin: 0;
padding: 0;
outline: 0;
box-sizing: border-box;
}
.dropdown {
background: #333;
display: block;
height: 28px;
}
.dropdown li {
position: relative;
float: left;
list-style: none;
white-space: nowrap;
background: #34353a;
}
.dropdown li a {
display: block;
height: 28px;
line-height: 28px;
padding: 0 8px;
text-decoration: none;
color: #ccc;
}
.dropdown ul {
position: absolute;
display: none;
}
.dropdown li ul ul {
left: 100%;
top: 0;
}
.dropdown li ul li {
float: none;
}
.dropdown img {
margin-right: 5px;
position: relative;
top: 2px;
}
.dropdown li:hover {
background: #2e4e89;
}
.dropdown li a:hover {
color: #eee;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class="dropdown">
<li><a href="#">Menu 1</a>
<ul>
<li><a href="#">Option 1 ></a>
<ul>
<li><a href="#">Option 4</a></li>
<li><a href="#">Option 5 ></a>
<ul>
<li><a href="#">Option 7</a></li>
</ul>
</li>
<li><a href="#">Option 6 ></a>
<ul>
<li><a href="#">Option 8</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Option 2</a></li>
<li><a href="#hello">Hello</a></li>
</ul>
</li>
<li><a href="#">Menu 2</a>
<ul>
<li><a href="#">Option 1</a></li>
<li><a href="#">Option 2</a></li>
</ul>
</li>
</ul>
<h1 id="hello" style="margin-top:500px; padding:100px;">Hello World!</h1>
Upvotes: 1