Bootstrap Carousel не будет работать с динамически созданными элементами из JS

Я пытаюсь создать ленту социальных сетей, например LinkedIn, где каждый элемент div представляет собой карусель, которая отображает изображения так же, как лента социальных сетей. В JS на основе ответа API я динамически создаю следующий элемент с изображениями для карусели:

  <div  class = "carousel slide" data-bs-ride = "carousel">
    <div class = "linkedin_left">
      <div class = "user-cred_main">
        <div class = "img_main"> <img src = "company_logo.jpg" alt = "company_logo"></div>
        <div class = "user_cred">
          <h3>Company Name</h3>
        </div>
      </div>
      <div class = "linkedin_right">
        <img src = "linkedin_logo.png" alt = "linked-in_logo">
      </div>
    </div>
    <p class = "linkedin_content">Caption for social media post</p>
    <div class = "carousel-inner">
      <div class = "carousel-item active">
        <img src = "img.jpg" class = "d-block w-100" alt = "...">
      </div>
      <div class = "carousel-item">
        <img src = "img.jpg" class = "d-block w-100" alt = "...">
      </div>
      <div class = "carousel-item">
        <img src = "img.jpg" class = "d-block w-100" alt = "...">
      </div>
    </div>

Вышеупомянутый фрагмент динамически создается из JS и отображается как сообщение в социальных сетях, которое содержит логотип компании, название, заголовок и изображения, которые отображаются в виде карусели. Я использовал следующий cdn для включения Bootstrap:

<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" integrity = "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin = "anonymous">

<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity = "sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin = "anonymous"></script>  

Проблема в том, что загрузочная карусель просто не работает с указанным выше динамически отображаемым элементом. Если я жестко закодирую приведенный выше фрагмент прямо в тело html, карусель начнет работать, но она не будет работать с тем же фрагментом, который генерируется динамически. Я проверил в инструментах разработчика Chrome, динамически сгенерированный элемент точно такой же, как жестко закодированный элемент, но он работает только для последнего. Я пытался возиться с атрибутом "data-bs-ride=carousel", но это не помогает. Я новичок в Bootstrap, поэтому у меня не так много решений. Любой вклад действительно поможет мне.

Обновлено: функция сценария, которая добавляет слайды карусели к телу

function Posts1(obj){
requestBody.companyId=obj.companyId;
requestBody.accessToken=obj.accessToken;
console.info(requestBody);
const options = {
    method:'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: requestBody
}
var xmlhttp = new XMLHttpRequest();   // Get Ugc Posts api call 
theUrl = "https://localhost:44346/api/GetUgcPosts";
xmlhttp.open("POST", theUrl);
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.send(JSON.stringify(requestBody));
xmlhttp.onload=()=>{
    if (xmlhttp.status==200){
        let i=0;
        data=JSON.parse(xmlhttp.response);
        data.post.slice().forEach(element => {
            const linkedin_sec=document.createElement('div');
            linkedin_sec.className = "carousel slide";
            linkedin_sec.setAttribute("data-bs-ride","carousel")
            let link = "";
            let caption = "";           
            const pfp_name='<div class = "linkedin_left"><div class = "user-cred_main"><div class = "img_main"> <img src = "'+data.pfp+'" alt = "user_avatar"></div><div class = "user_cred"><h3>'+data.orgName+'</h3></div></div><div class = "linkedin_right"><img src = "/img/linkedin.png" alt = "linked-in_avatar"></div></div>';                
            if (element.caption.includes('https')){
                link=element.caption.split('https')[1].split(' ')[0];
                caption='<p class = "linkin_content">'+element.caption+'</p><a href = "https'+link+'">Follow Link</a>'
            }
            else{
                caption='<p class = "linkin_content">'+element.caption+'</p>'
            }
            const slides=document.createElement('div');
            slides.className = "carousel-inner";
            let i=0;
            element.imgUrl.forEach(img=>{
                
                const imgSlide='<div class = "carousel-item active"><img src = "'+img+'" class = "d-block w-100" alt = "..."></div>';
                i++;
                slides.insertAdjacentHTML("afterbegin",imgSlide);
            })
            if ((element.imgUrl[0])&&(element.imgUrl.length>1)){
            }
            
            linkedin_sec.innerHTML=pfp_name+caption;
            linkedin_sec.appendChild(slides);
            document.body.insertBefore(linkedin_sec, document.body.firstChild);
    })
    }
    else{
        console.info("Error")
    }
    
}

}

Также добавлен следующий скрипт

<script>
$(window).load(function(){
$('.carousel').carousel({
  interval:1000
});
console.info("window is loaded");
})
</script>

Включите JQuery перед начальной загрузкой Js.

Felix Tenn 13.12.2022 19:31

@FelixTenn извините, если это звучит глупо, но я не использую jquery, я использую только vanilla js для бэкэнда. Будет ли работать добавление jquery?

r7k 13.12.2022 21:05

Вы должны добавить JQuery перед вашим Bootstrap JS. Я уже испытал это. JQuery также является частью того, чего вы пытаетесь достичь.

Felix Tenn 13.12.2022 21:10

@FelixTenn, привет, можешь объяснить, что именно я должен делать?

r7k 13.12.2022 21:27
const объявления имеют блочную область видимости, используйте var
user1844933 14.12.2022 13:41
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пожалуйста, проверьте это

<!DOCTYPE html>
<html lang = "en">

<head>
    <meta charset = "UTF-8">
    <meta http-equiv = "X-UA-Compatible" content = "IE=edge">
    <meta name = "viewport" content = "width=\, initial-scale=1.0">
    <link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" integrity = "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin = "anonymous">
    <title>Document</title>
</head>

<body>
    <div class = "carousel slide" data-bs-ride = "carousel">
        <div class = "linkedin_left">
            <div class = "user-cred_main">
                <div class = "img_main"> <img src = "https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8TE9HT3xlbnwwfHwwfHw%3D&auto=format&fit=crop&w=500&q=60" alt = "company_logo"></div>
                <div class = "user_cred">
                    <h3>Company Name</h3>
                </div>
            </div>
            <div class = "linkedin_right">
                <img src = "https://images.unsplash.com/photo-1611944212129-29977ae1398c?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8TElOS0VESU58ZW58MHx8MHx8&auto=format&fit=crop&w=500&q=60" alt = "linked-in_logo">
            </div>
        </div>
        <p class = "linkedin_content">Caption for social media post</p>
        <div class = "carousel-inner">
            <div class = "carousel-item active">
                <img src = "https://images.unsplash.com/photo-1520209759809-a9bcb6cb3241?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80" class = "d-block w-100" alt = "...">
            </div>
            <div class = "carousel-item">
                <img src = "https://images.unsplash.com/photo-1520209759809-a9bcb6cb3241?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80" class = "d-block w-100" alt = "...">
            </div>
            <div class = "carousel-item">
                <img src = "https://images.unsplash.com/photo-1520209759809-a9bcb6cb3241?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80" class = "d-block w-100" alt = "...">
            </div>
        </div>
    <script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
    <script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity = "sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin = "anonymous"></script>  
</body>

</html>

Добавил, все равно не работает. Как я уже сказал, он не работает для динамически отображаемых элементов, добавленных к телу, но работает для жестко запрограммированных элементов в теле.

r7k 14.12.2022 04:41

Можете ли вы показать свой сценарий динамического добавления элементов?

Felix Tenn 14.12.2022 08:39

Привет, добавил скрипт в вопрос.

r7k 14.12.2022 09:11

Еще одно странное обновление: я добавил фрагмент jquery (отредактированный в вопросе), после чего потребовалось некоторое время для загрузки изображений в жестко запрограммированной карусели, а затем карусель начала работать и для всех динамически отображаемых элементов. Я был вне себя от радости и думал, что решил проблему, пока я просто не обновил страницу, и она перестала работать. :'-(

r7k 14.12.2022 09:21

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

r7k 14.12.2022 13:21
Ответ принят как подходящий

Я думаю, что, возможно, я сделал очень глупую ошибку здесь. Таким образом, загрузочная карусель теперь применяется ко всем статическим и динамическим элементам. Все, что мне нужно было сделать, это переместить следующий фрагмент jQuery из html-файла в мой script.js в конце после того, как все динамические элементы будут добавлены в тело html.

<script>
      $(window).load(function(){
      $('.carousel').carousel({
      interval:1000
    });
    console.info("window is loaded");
  })
</script>

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