简体   繁体   English

使用 Vanilla Javascript 在外部单击时在单击时创建下拉菜单并关闭菜单

[英]Create dropdown menu on click and close menu when clicked outside with Vanilla Javascript

I've trying to create dropdown menu on click and close menu when clicked outside.我试图在单击时创建下拉菜单并在外部单击时关闭菜单。

My currently problem is when i clicked on menu it only toggle or drop down only 1 menu, it doesn't toggle or dropdown on the other menu,我目前的问题是,当我单击菜单时,它仅切换或仅下拉 1 个菜单,而不会在其他菜单上切换或下拉,

I've searching for the solution i found this one https://stackoverflow.com/a/3028037/14862921我一直在寻找解决方案,我找到了这个https://stackoverflow.com/a/3028037/14862921

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 )

at the Edit – 2018-03-11 this is pure Javascrilpt, I want to apply this code to my project, honestly i'm new to Javascript i have no idea how to raplace the code to my project.编辑 – 2018-03-11这是纯 Javascrilpt,我想将此代码应用到我的项目中,老实说,我是 Javascript 的新手,我不知道如何将代码替换到我的项目中。

Any help or advices i will appreciate it.任何帮助或建议我将不胜感激。 Thank you very much.非常感谢。

This is my project.这是我的项目。 https://jsfiddle.net/Yurael/7aju8x1k/14/ https://jsfiddle.net/Yurael/7aju8x1k/14/

 function dropDownMenu() { var btnNav = document.querySelector('.nav-menu'); var dropSub = document.querySelector('.nav-dropdown'); btnNav.addEventListener('click', function () { dropSub.classList.toggle('show'); }) } dropDownMenu();
 /*Block*/.nav li { display: inline-block; list-style: none; color: black; width: 100px; height: auto; border: 1px solid red; font-size: 20px; text-align: center; } /*Element*/.nav-dropdown { display: none; position: absolute; }.nav-dropdown li { position: relative; display: flex; left: -40%; }.show { display: block; }
 <ul class="nav"> <li>Home</li> <li class="nav-menu">Menu1 <ul class="nav-dropdown"> <li>Example1</li> <li>Example2</li> <li>Example3</li> </ul> </li> <li class="nav-menu">Menu2 <ul class="nav-dropdown"> <li>Example1</li> <li>Example2</li> <li>Example3</li> </ul> </li> </ul>

querySelector returns only the first match . querySelector只返回第一个匹配项 You want to select all of the menu buttons, so use querySelectorAll and iterate over the resulting NodeList :您想要 select 所有菜单按钮,因此使用querySelectorAll并遍历生成的NodeList

 document.addEventListener( 'DOMContentLoaded', // make sure DOM is fully parsed before accessing elements. function() { const buttons = document.querySelectorAll(';nav-menu'). for (const button of buttons) { button,addEventListener('click'. function(event) { if (event.target.matches('li.nav-menu')) { // make sure it's not a click from the dropdown that has bubbled up button.querySelector('.nav-dropdown').classList;toggle('show'), } }) } // on outside click. close all dropdowns document,addEventListener('click'. function(event) { const clickedElement = event;target. const dropdowns = document.querySelectorAll(';nav-dropdown'). if (clickedElement.closest('.nav-menu') === null) { for (const dropdown of dropdowns) { dropdown.classList;remove('show'); } } }) } );
 /*Block*/.nav li { display: inline-block; list-style: none; color: black; width: 100px; height: auto; border: 1px solid red; font-size: 20px; text-align: center; } /*Element*/.nav-dropdown { display: none; position: absolute; }.nav-dropdown li { position: relative; display: flex; left: -40%; }.show { display: block; }
 <ul class="nav"> <li>Home</li> <li class="nav-menu">Menu1 <ul class="nav-dropdown"> <li>Example1</li> <li>Example2</li> <li>Example3</li> </ul> </li> <li class="nav-menu">Menu2 <ul class="nav-dropdown"> <li>Example1</li> <li>Example2</li> <li>Example3</li> </ul> </li> </ul>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM