-
-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
dropdown.js
40 lines (30 loc) · 940 Bytes
/
dropdown.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { Dropdown } from 'bootstrap';
/*
Core dropdowns
*/
let dropdownTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="dropdown"]'));
dropdownTriggerList.map(function (dropdownTriggerEl) {
return new Dropdown(dropdownTriggerEl);
});
/*
Nested dropdowns
*/
const selectors = '.dropdown, .dropup, .dropend, .dropstart',
dropdowns = document.querySelectorAll(selectors);
let currentTarget = undefined;
dropdowns.forEach(dropdown => {
dropdown.addEventListener('mousedown', (e) => {
e.stopPropagation();
if (e.target.dataset.bsToggle && e.target.dataset.bsToggle === 'dropdown') {
currentTarget = e.currentTarget;
}
});
dropdown.addEventListener('hide.bs.dropdown', (e) => {
e.stopPropagation();
const parent = currentTarget ? currentTarget.parentElement.closest(selectors) : undefined;
if (parent && parent === dropdown) {
e.preventDefault();
}
currentTarget = undefined;
});
});