Skip to content

Commit 0a55a76

Browse files
committed
#1250: Refactor dropdown handling to target toggle elements
Update dropdown JS logic to operate on the child element with data-bs-toggle="dropdown" when present, ensuring Bootstrap methods and event listeners are attached to the correct toggle button. Falls back to the parent if no toggle is found, improving alignment with Bootstrap's expected usage.
1 parent d4321fc commit 0a55a76

1 file changed

Lines changed: 27 additions & 15 deletions

File tree

blazorbootstrap/wwwroot/blazor.bootstrap.js

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -399,48 +399,60 @@ window.blazorBootstrap = {
399399
dropdown: {
400400
dispose: (elementId) => {
401401
let dropdownEl = document.getElementById(elementId);
402-
if (dropdownEl != null)
403-
bootstrap?.Dropdown?.getOrCreateInstance(dropdownEl)?.dispose();
402+
if (dropdownEl != null) {
403+
let toggleEl = dropdownEl.querySelector('[data-bs-toggle="dropdown"]') ?? dropdownEl;
404+
bootstrap?.Dropdown?.getOrCreateInstance(toggleEl)?.dispose();
405+
}
404406
},
405407
hide: (elementId) => {
406408
let dropdownEl = document.getElementById(elementId);
407-
if (dropdownEl != null)
408-
bootstrap?.Dropdown?.getOrCreateInstance(dropdownEl)?.hide();
409+
if (dropdownEl != null) {
410+
let toggleEl = dropdownEl.querySelector('[data-bs-toggle="dropdown"]') ?? dropdownEl;
411+
bootstrap?.Dropdown?.getOrCreateInstance(toggleEl)?.hide();
412+
}
409413
},
410414
initialize: (elementId, dotNetHelper) => {
411415
let dropdownEl = document.getElementById(elementId);
412416
if (dropdownEl == null)
413417
return;
414418

415-
dropdownEl.addEventListener('hide.bs.dropdown', function () {
419+
let toggleEl = dropdownEl.querySelector('[data-bs-toggle="dropdown"]') ?? dropdownEl;
420+
421+
toggleEl.addEventListener('hide.bs.dropdown', function () {
416422
dotNetHelper.invokeMethodAsync('bsHideDropdown');
417423
});
418-
dropdownEl.addEventListener('hidden.bs.dropdown', function () {
424+
toggleEl.addEventListener('hidden.bs.dropdown', function () {
419425
dotNetHelper.invokeMethodAsync('bsHiddenDropdown');
420426
});
421-
dropdownEl.addEventListener('show.bs.dropdown', function () {
427+
toggleEl.addEventListener('show.bs.dropdown', function () {
422428
dotNetHelper.invokeMethodAsync('bsShowDropdown');
423429
});
424-
dropdownEl.addEventListener('shown.bs.dropdown', function () {
430+
toggleEl.addEventListener('shown.bs.dropdown', function () {
425431
dotNetHelper.invokeMethodAsync('bsShownDropdown');
426432
});
427433

428-
bootstrap?.Dropdown?.getOrCreateInstance(dropdownEl);
434+
bootstrap?.Dropdown?.getOrCreateInstance(toggleEl);
429435
},
430436
show: (elementId) => {
431437
let dropdownEl = document.getElementById(elementId);
432-
if (dropdownEl != null)
433-
bootstrap?.Dropdown?.getOrCreateInstance(dropdownEl)?.show();
438+
if (dropdownEl != null) {
439+
let toggleEl = dropdownEl.querySelector('[data-bs-toggle="dropdown"]') ?? dropdownEl;
440+
bootstrap?.Dropdown?.getOrCreateInstance(toggleEl)?.show();
441+
}
434442
},
435443
toggle: (elementId) => {
436444
let dropdownEl = document.getElementById(elementId);
437-
if (dropdownEl != null)
438-
bootstrap?.Dropdown?.getOrCreateInstance(dropdownEl)?.toggle();
445+
if (dropdownEl != null) {
446+
let toggleEl = dropdownEl.querySelector('[data-bs-toggle="dropdown"]') ?? dropdownEl;
447+
bootstrap?.Dropdown?.getOrCreateInstance(toggleEl)?.toggle();
448+
}
439449
},
440450
update: (elementId) => {
441451
let dropdownEl = document.getElementById(elementId);
442-
if (dropdownEl != null)
443-
bootstrap?.Dropdown?.getOrCreateInstance(dropdownEl)?.update();
452+
if (dropdownEl != null) {
453+
let toggleEl = dropdownEl.querySelector('[data-bs-toggle="dropdown"]') ?? dropdownEl;
454+
bootstrap?.Dropdown?.getOrCreateInstance(toggleEl)?.update();
455+
}
444456
}
445457
},
446458
googlemaps: {

0 commit comments

Comments
 (0)