48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /**
 | |
|  * Dropdown
 | |
|  * Provides some simple logic to create simple dropdown menus.
 | |
|  */
 | |
| class DropDown {
 | |
| 
 | |
|     constructor(elem) {
 | |
|         this.container = elem;
 | |
|         this.menu = elem.querySelector('ul');
 | |
|         this.toggle = elem.querySelector('[dropdown-toggle]');
 | |
|         this.setupListeners();
 | |
|     }
 | |
| 
 | |
|     show() {
 | |
|         this.menu.style.display = 'block';
 | |
|         this.menu.classList.add('anim', 'menuIn');
 | |
|         this.container.addEventListener('mouseleave', this.hide.bind(this));
 | |
| 
 | |
|         // Focus on first input if existing
 | |
|         let input = this.menu.querySelector('input');
 | |
|         if (input !== null) input.focus();
 | |
|     }
 | |
| 
 | |
|     hide() {
 | |
|         this.menu.style.display = 'none';
 | |
|         this.menu.classList.remove('anim', 'menuIn');
 | |
|     }
 | |
| 
 | |
|     setupListeners() {
 | |
|         // Hide menu on option click
 | |
|         this.container.addEventListener('click', event => {
 | |
|              let possibleChildren = Array.from(this.menu.querySelectorAll('a'));
 | |
|              if (possibleChildren.indexOf(event.target) !== -1) this.hide();
 | |
|         });
 | |
|         // Show dropdown on toggle click
 | |
|         this.toggle.addEventListener('click', this.show.bind(this));
 | |
|         // Hide menu on enter press
 | |
|         this.container.addEventListener('keypress', event => {
 | |
|                 if (event.keyCode !== 13) return true;
 | |
|                 event.preventDefault();
 | |
|                 this.hide();
 | |
|                 return false;
 | |
|         });
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| module.exports = DropDown; |