Этот метод, вероятно, не самый лучший (один с размытием / фокусом лучше imo), но есть много разных способов сделать это, так что здесь идет другой.
function openModal(){
var x = document.getElementById('myLinks');
if(x.style.display != 'block'){
x.style.display = 'block';
window.addEventListener('click', closeMenu, {capture: true});
}
}
function closeMenu(event){
var el = document.getElementById('myLinks');
if(el.style.display == 'block' && event.target != el){
window.removeEventListener('click', closeMenu, {capture: true});
el.style.display = 'none';
}
}
div#myLinks{
display: none;
}
<div class="topnav">
<a href="#home" class="nt"><strong>NELSON TRAILS</strong></a>
<div id="myLinks">
<a class="sub">SHORT WALKS</a>
<a class="sub">DAY TRIPS</a>
<a class="sub">MULTI-DAY</a>
<a class="sub">MAP EXPLORER</a>
<a class="sub">TRAIL SEARCH AND FILTER</a>
<a class="sub">TRAIL ALERTS</a>
<a class="sub">ABOUT</a>
</div>
<p class="icon" onclick="openModal()">Menu</p>
</div>
Нам нужна опция capture
для прослушивателя событий, чтобы она не срабатывала после первого щелчка. Этот метод намного меньше загрязняет window
, потому что наш слушатель существует только при открытом меню.
Также не следует использовать javascript:void(0)
для предотвращения перенаправления.
Что вы должны сделать, это что-то вроде этого:
document.addEventListener('DOMContentLoaded', function(){
document.querySelectorAll('a.prevent-default').forEach(function(el, i){
el.addEventListener('click', preventDefault);
});
});
function preventDefault(event){
event.preventDefault();
}
<a href="google.com" class="my-class prevent-default">Can't go through me!</a>
Это найдет все элементы a
с классом prevent-default
и предотвратит перенаправление. Использование href="javascript:void(0);"
- это то, что осталось в прошлом.