У меня есть раскрывающееся меню Bootstrap 5, состоящее из флажков с метками data-bs-auto-close = "outside"
, так что меню закрывается при внешнем щелчке.
<div class = "dropdown">
<button type = "button" class = "btn btn-success dropdown-toggle" data-bs-toggle = "dropdown" data-bs-auto-close = "outside" aria-expanded = "false">
Dropdown button
</button>
<div class = "dropdown-menu">
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option1" name = "filter">
<label for = "option1">Option 1</label>
</div>
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option2" name = "filter">
<label for = "option2">Option 2</label>
</div>
<div class = "btn-group px-1 mt-2 w-100">
<button onclick = "closeFilter()" type = "button" class = "apply btn btn-sm btn-success">Apply</button>
<button onclick = "closeFilter()" type = "button" class = "reset btn btn-sm btn-success">Reset</button>
</div>
</div>
</div>
Я хочу, чтобы меню закрывалось при нажатии любой из кнопок «Применить» и «Сброс». Для этой цели у меня есть функция ниже:
function closeFilter() {
let dropDown = event.target.closest('.dropdown');
let dropDownButton = dropDown.querySelector('.dropdown-toggle');
dropDownButton.style.border = '1px solid red';
dropDownButton.dropdown('toggle');
}
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" />
<div class = "dropdown">
<button type = "button" class = "btn btn-success dropdown-toggle" data-bs-toggle = "dropdown" data-bs-auto-close = "outside" aria-expanded = "false">
Dropdown button
</button>
<div class = "dropdown-menu">
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option1" name = "filter">
<label for = "option1">Option 1</label>
</div>
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option2" name = "filter">
<label for = "option2">Option 2</label>
</div>
<div class = "btn-group px-1 mt-2 w-100">
<button onclick = "closeFilter()" type = "button" class = "apply btn btn-sm btn-success">Apply</button>
<button onclick = "closeFilter()" type = "button" class = "reset btn btn-sm btn-success">Reset</button>
</div>
</div>
</div>
Однако приведенная выше функция выдает ошибку:
dropDownButton.dropdown is not a function
Где моя ошибка?
Для этого вам нужно будет явно определить элемент dropDownButton как раскрывающийся список Bootstrap.
и после этого вы сможете использовать для этого метод toggle
const dropdown = new bootstrap.Dropdown(dropDownButton);
dropdown.toggle();
function closeFilter() {
let dropDown = event.target.closest('.dropdown');
let dropDownButton = dropDown.querySelector('.dropdown-toggle');
dropDownButton.style.border = '1px solid red';
const dropdown = new bootstrap.Dropdown(dropDownButton);
dropdown.toggle();
}
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" />
<div class = "dropdown">
<button type = "button" class = "btn btn-success dropdown-toggle" data-bs-toggle = "dropdown" data-bs-auto-close = "outside" aria-expanded = "false">
Dropdown button
</button>
<div class = "dropdown-menu">
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option1" name = "filter">
<label for = "option1">Option 1</label>
</div>
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option2" name = "filter">
<label for = "option2">Option 2</label>
</div>
<div class = "btn-group px-1 mt-2 w-100">
<button onclick = "closeFilter()" type = "button" class = "apply btn btn-sm btn-success">Apply</button>
<button onclick = "closeFilter()" type = "button" class = "reset btn btn-sm btn-success">Reset</button>
</div>
</div>
</div>
Вам нужно получить экземпляр конкретного раскрывающегося списка. Для этого вы можете использовать bootstrap.Dropdown.getInstance(element).
function closeFilter() {
let dropDown = event.target.closest('.dropdown');
let dropDownButton = dropDown.querySelector('.dropdown-toggle');
dropDownButton.style.border = '1px solid red';
bootstrap.Dropdown.getInstance(dropDownButton).toggle();
}
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" />
<div class = "dropdown">
<button type = "button" class = "btn btn-success dropdown-toggle" data-bs-toggle = "dropdown" data-bs-auto-close = "outside" aria-expanded = "false">
Dropdown button
</button>
<div class = "dropdown-menu">
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option1" name = "filter">
<label for = "option1">Option 1</label>
</div>
<div class = "px-1">
<input class = "form-check-input" type = "checkbox" id = "option2" name = "filter">
<label for = "option2">Option 2</label>
</div>
<div class = "btn-group px-1 mt-2 w-100">
<button onclick = "closeFilter()" type = "button" class = "apply btn btn-sm btn-success">Apply</button>
<button onclick = "closeFilter()" type = "button" class = "reset btn btn-sm btn-success">Reset</button>
</div>
</div>
</div>