Performance: Dropdown events and methods
This affects interaction responsiveness and visual stability when users open or close dropdown menus.
const dropdownElementList = [].slice.call(document.querySelectorAll('.dropdown-toggle')); const dropdownList = dropdownElementList.map(dropdownToggleEl => new bootstrap.Dropdown(dropdownToggleEl));
document.querySelectorAll('.dropdown-toggle').forEach(el => { el.addEventListener('click', () => { // heavy logic or multiple DOM changes console.log('Dropdown toggled'); // manually toggle dropdown const menu = el.nextElementSibling; menu.classList.toggle('show'); }); });
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Manual event listeners with class toggling | Multiple event listeners per dropdown | Multiple reflows per toggle | High paint cost due to forced layout | [X] Bad |
| Bootstrap Dropdown methods | Single event delegation per dropdown | Single reflow per toggle | Minimal paint cost with optimized CSS | [OK] Good |
show.bs.dropdown event fires just before the dropdown menu appears.shown.bs.dropdown fires after showing; hide.bs.dropdown and hidden.bs.dropdown relate to closing.show.bs.dropdown -> Option Dtoggle() toggles the dropdown menu open or closed programmatically.open() and display() are not Bootstrap dropdown methods; show() is not a method on the dropdown instance.const dropdownElement = document.querySelector('#myDropdown');
const dropdown = bootstrap.Dropdown.getOrCreateInstance(dropdownElement);
dropdownElement.addEventListener('shown.bs.dropdown', () => console.log('Dropdown opened'));
dropdown.show();shown.bs.dropdown event and logs 'Dropdown opened' when fired.dropdown.show() opens the dropdown and triggers the shown.bs.dropdown event, causing the log.const dropdownElement = document.querySelector('#menu');
const dropdown = new bootstrap.Dropdown(dropdownElement);
dropdown.close();close() method; it uses toggle() or dispose().new bootstrap.Dropdown() is valid; the error is not here.hidden.bs.dropdown event fires after the dropdown is fully closed.dropdown.hide() to close the dropdown menu.hidden.bs.dropdown event and call dropdown.hide() -> Option Bhide.bs.dropdown instead of hidden.bs.dropdowntoggle() which toggles state instead of specifically closingdispose() which removes dropdown instancePass the test and this pattern moves unknown