Bonjour,
j'essaie - vainement - de traduire un script jQuery en JS pur, pour un menu Bootstrap 5 multi-level.
voir :
Le script jQuery semble bien fonctionner
Le script JS... non :
Je n'arrive pas à refermer l'autre sous-menu (ils se superposent)
jQuery :
Tentative en JS pur :
Code js : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 // --------------------------------------------------------- // Bootstrap 5 : Responsive Dropdown Multi Submenu // (nécessite jQuery, EN ATTENTE de conversion en JS vanilla) // --------------------------------------------------------- $(function(){ $('.dropdown-menu a.dropdown-toggle').on('click', function(e) { e.stopPropagation(); e.preventDefault(); if (!$(this).next().hasClass('show')) { $(this).parents('.dropdown-menu').first().find('.show').removeClass("show"); } var subMenu = $(this).next(".dropdown-menu"); subMenu.toggleClass('show'); // appliqué au ul $(this).parent().toggleClass('show'); // appliqué au li parent $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) { $('.dropdown-submenu .show').removeClass('show'); // appliqué au ul $('.dropdown-submenu.show').removeClass('show'); // appliqué au li parent }); }); });
Code js : Sélectionner tout - Visualiser dans une fenêtre à part
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
41
42
43
44
45
46
47
48
49 // --------------------------------------------------------- // Bootstrap 5 : Responsive Dropdown Multi Submenu // --------------------------------------------------------- window.addEventListener("DOMContentLoaded", (event) => { "use strict"; document.querySelectorAll('.dropdown-menu a.dropdown-toggle').forEach( (elt) => { elt.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); /* if( elt.nextElementSibling && !elt.nextElementSibling.classList.contains('show') ){ var parents = getParents(elt,'dropdown-menu'); // nodes for (const parent of parents) { if( parent.classList && parent.classList.contains('show') ) { parent.classList.remove('show'); } } } */ if( elt.nextElementSibling ) { var subMenu = elt.nextElementSibling; subMenu.classList.toggle('show'); // appliqué au ul elt.parentNode.classList.toggle('show'); // appliqué au li parent } }); }); }); // ------------------------------ // get parents of element with specific className /* function getParents(el, parentClass) { var parentSelector = document; var parents = []; var p = el.parentNode; while (p !== parentSelector) { var o = p; if( o.classList && o.classList.contains(parentClass) ) { parents.push(o); } p = o.parentNode; } parents.push(parentSelector); return parents; } */
Si une âme charitable passe par là...
Merci.
Partager