Программно переключать компонент сворачивания Bootstrap 5

Я использую "коллапс" boostrap 5, используя подход атрибутов данных. Он работает так, как ожидалось. Я могу нажать кнопку, чтобы свернуть/развернуть складные элементы.

Состояние документов Я могу переключать состояние вручную, например так:

let element = document.querySelector('#my-collapse');
bootstrap.Collapse.getInstance(element).toggle();

Однако это не удается, так как getInstance возвращает null.

Странно, если я нажму кнопку свернуть, а затем использую этот код, он работает.

Как убедиться, что код работает без предварительной «заправки» компонента свертывания?

Попробуйте выбрать элемент с помощью id вместо использования класса collapse. Например: document.querySelector('#my-collapse-element');

Dimitris Maragkos 03.12.2022 08:31

@DimitrisMaragkos Спасибо! Это не проблема, я могу найти элемент без проблем (element не равно null), но getInstance возвращает null. Кроме того, этот код работает как есть, когда я вручную нажимаю кнопку свернуть. Странный.

lonix 03.12.2022 09:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, что при использовании атрибутов данных компонент начальной загрузки создается только по запросу, то есть при первом нажатии кнопки свертывания. Это объясняет поведение, которое я отметил выше.

Таким образом, решение состоит в том, чтобы использовать вместо этого getOrCreateInstance:

let element = document.querySelector('#my-collapse');
bootstrap.Collapse.getOrCreateInstance(element).toggle();

Приведенный ниже код гарантирует, что экземпляр сворачивания не равен нулю:

let element = document.querySelector('#my-collapse');
// try to get collapse instance
let bsCollapse = bootstrap.Collapse.getInstance(element);
// if the instance is not yet initialized then create new collapse
if (bsCollapse === null) {
    bsCollapse = new bootstrap.Collapse(element, {
        toggle: false   // this parameter is important!
    })
}
bsCollapse.show();

Спасибо. Однако это излишне сложно — getOrCreateInstance делает все это в одной строке. Его возвращаемое значение может быть нулевым только в том случае, если селектор недействителен, и в этом случае у вас большие проблемы (и вопрос касается создания компонента с помощью атрибутов данных, что означает, что у вас уже есть действительный селектор).

lonix 09.12.2022 05:04

@lonix - вы могли бы подумать, что getOrCreateInstance достаточно, но в моем случае это было не так. Этот bootstrap.Collapse.getOrCreateInstance('#my-collapse').show(‌​); свернет уже открытый Collapsable вместо того, чтобы показать, что пользователь еще не взаимодействовал с ним. Единственное решение для меня - это код выше.

Ross 09.12.2022 16:37

Если вы считаете, что это ошибка, я предлагаю вам открыть проблему в репо и отправить мне ссылку, чтобы я мог проголосовать за нее.

lonix 10.12.2022 00:55

Другие вопросы по теме