Моя цель - создать элемент сворачивания, когда данные формы были обработаны сервером, чтобы уведомить пользователя о том, были ли данные успешно отправлены на сервер или произошла ошибка.
function sendForm(event, form) {
const wrapper=document.createElement('div');
wrapper.setAttribute('role', 'alert');
wrapper.classList.add('alert', 'alert-dismissible', 'alert-success');
wrapper.innerHTML='<span>Success!</span><button type = "button" class = "btn-close" data-bs-dismiss = "alert"></button>';
form.prepend(wrapper);
const bsWrapperCollapse = bootstrap.Collapse.getOrCreateInstance(wrapper);
bsWrapperCollapse.show();
setTimeout(() => {
bsWrapperCollapse.hide();
}, 4000);
setTimeout(() => {
wrapper.remove();
}, 7000);
form.reset();
event.preventDefault();
}<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1">
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" integrity = "sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin = "anonymous">
</head>
<body>
<main class = "container-fluid my-5" style = "max-width:300px">
<form action = "#" method = "post" onsubmit = "sendForm(event, this)">
<button type = "submit" class = "btn btn-primary">My form submit btn</button>
</form>
<button class = "btn btn-primary" data-bs-toggle = "collapse" data-bs-target = "#collapseExample" aria-expanded = "false" aria-controls = "collapseExample">
Button with data-bs-target
</button>
<div class = "collapse" id = "collapseExample">
<div class = "alert alert-dismissible alert-success" role = "alert">
<span>Success!</span>
<button type = "button" class = "btn-close" data-bs-dismiss = "alert"></button>
</div>
</div>
</main>
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity = "sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin = "anonymous"></script>
</body>
</html>Добавил в тестовый html две реализации - первая кнопка вызывает мою реализацию, которая есть в форме и при ее нажатии должны отправляться данные, но анимация появления и скрытия дергается. Вторая кнопка взята из документации бутстрапа, с правильной анимацией, чего я и хочу добиться в своей реализации с помощью js.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, проблема в том, что элемент, созданный в js, не имеет класса collapse, переход применяется только в том случае, если элемент имеет класс collapse. Я изменил код, добавил класс collapse в оболочку и добавил классы предупреждений в div внутри элемента оболочки. Теперь кажется, что анимация работает правильно.
function sendForm(event, form) {
const wrapper=document.createElement('div');
wrapper.setAttribute('role', 'alert');
wrapper.classList.add("collapse");
wrapper.innerHTML='<div class = "alert alert-dismissible alert-success"><span>Success!</span><button type = "button" class = "btn-close" data-bs-dismiss = "alert"></button> </div>';
form.prepend(wrapper);
const bsWrapperCollapse = bootstrap.Collapse.getOrCreateInstance(wrapper);
bsWrapperCollapse.show();
setTimeout(() => {
bsWrapperCollapse.hide();
}, 4000);
setTimeout(() => {
wrapper.remove();
}, 7000);
form.reset();
event.preventDefault();
}<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1">
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" integrity = "sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin = "anonymous">
</head>
<body>
<main class = "container-fluid my-5" style = "max-width:300px">
<form action = "#" method = "post" onsubmit = "sendForm(event, this)">
<button type = "submit" class = "btn btn-primary">My form submit btn</button>
</form>
<button class = "btn btn-primary" data-bs-toggle = "collapse" data-bs-target = "#collapseExample" aria-expanded = "false" aria-controls = "collapseExample">
Button with data-bs-target
</button>
<div class = "collapse" id = "collapseExample">
<div class = "alert alert-dismissible alert-success" role = "alert">
<span>Success!</span>
<button type = "button" class = "btn-close" data-bs-dismiss = "alert"></button>
</div>
</div>
</main>
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity = "sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin = "anonymous"></script>
</body>
</html>Итак, я понял, как сделать анимацию нормальной, даже не проверяя ответы здесь. Я заметил, что контейнер предупреждений в html-коде завернут в другой контейнер. Но когда я создал оповещение через js, я его не обернул. После того, как я завернул этот элемент, анимация заработала как надо. @Nick предположил, что анимация не работает должным образом из-за отсутствия класса collapse, но я протестировал его код без него, и анимация все еще работает. Причина, по которой анимация работает правильно, заключается в том, что он завернул мой код в контейнер через innerHTML, по сути, делая то же самое, что и я. Вот что у меня получилось.
function sendForm(event, form) {
const alert=document.createElement('div');
alert.setAttribute('role', 'alert');
alert.classList.add('alert', 'alert-dismissible', 'alert-success');
alert.innerHTML='<span>Success!</span><button type = "button" class = "btn-close" data-bs-dismiss = "alert"></button>';
const alertWrapper=document.createElement('div');
alertWrapper.append(alert);
form.prepend(alertWrapper);
const alertWrapperCollapse = bootstrap.Collapse.getOrCreateInstance(alertWrapper);
alertWrapperCollapse.show();
setTimeout(() => {
alertWrapperCollapse.hide();
}, 4000);
setTimeout(() => {
alertWrapper.remove();
}, 7000);
form.reset();
event.preventDefault();
}<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1">
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" integrity = "sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin = "anonymous">
</head>
<body>
<main class = "container-fluid my-5" style = "max-width:300px">
<form action = "#" method = "post" onsubmit = "sendForm(event, this)">
<button type = "submit" class = "btn btn-primary">My form submit btn</button>
</form>
<button class = "btn btn-primary" data-bs-toggle = "collapse" data-bs-target = "#collapseExample" aria-expanded = "false" aria-controls = "collapseExample">
Button with data-bs-target
</button>
<div class = "collapse" id = "collapseExample">
<div class = "alert alert-dismissible alert-success" role = "alert">
<span>Success!</span>
<button type = "button" class = "btn-close" data-bs-dismiss = "alert"></button>
</div>
</div>
</main>
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity = "sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin = "anonymous"></script>
</body>
</html>В любом случае, я отметил ответ @Nick как полезный.