@illiatovpeko
Самолепный ВебдевелопЁр

Почему функция, связанная с addEventListener, Не срабатывает больше одного раза?

Речь о функции, закрывающей модальное окно (поп-ап).
JS-файл генерирует контент из списка (объект). Может быть возникшая проблема связана с тем, что модальное окно, в функции закрытия которого (modalCloser) и возникла проблема, Не появляется в DOM-дереве сразу. Пытался делать проверку, на почему-то не срабатывает. Остановился на ниже приведённом, но функция закрывает поп-ап лишь единожды.

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="dist/css/main.css">
    <title>AbacPress</title>
</head>
<body>
    <main>
        <ul></ul>
    </main>
    <script src="src/js/main.js"></script>
</body>
</html>


Javascript:

//list of products

let products = new Object();

products = {
        
    baden: {
        title: "Диван Баден-Баден",
        price: "20 000 рублей",
        link: "src/img/baden-baden.jpg",
        id: "baden"
    },

    dubay: {
        title: "Диван Дубай",
        price: "19 000 рублей",
        link: "src/img/dubay.jpg",
        id: "dubay"
    },

    lion: {
        title: "Диван Лион",
        price: "21 000 рублей",
        link: "src/img/lion.jpg",
        id: "lion"
    },

    stephani: {
        title: "Диван Стефани",
        price: "40 000 рублей",
        link: "src/img/stephani.jpg",
        id: "stephani"
    }


}


// insert products into the page

for (key in products){
    //console.log(key, products[key]);
    document.querySelector('ul').insertAdjacentHTML('beforeend',

    `<li>
    <div class="item ${products[key]["id"]}">
        <img src="${products[key]["link"]}" alt="" class="img">
        <div class="description">
            <h3 class="title">${products[key]["title"]}</h3>
            <p class="price">${products[key]["price"]}</p>
        </div>
        <div class="buttons">
            <button class="order" onclick="toOrder(this.parentElement.parentElement)">Заказать</button>
            <button class="cart" onclick="toCart(this.parentElement.parentElement)">В корзину</button>
        </div>
    </div>
</li>`)
}

// making order

function toOrder(elem){
    console.log(elem);
    //console.log(elem.classList[1]);
    elem.insertAdjacentHTML('beforeend',
    
    `<div class="modal">
    <div class="order-modal">
        <button class="close-btn">+</button>
        <h3 class="title">${elem.children[1].children[0].innerText}</h3>
        <div class="container">
            <div class="description">
                <img src="${elem.children[0].currentSrc}" alt="" class="img">
                <p class="price">${elem.children[1].children[1].innerText}</p>
            </div>
            <form action="">
                <p><label for="order-form--comment">Комментарий к заказу:</label><input type="text" name="order-form-comment" id="order-form--comment"></p>
                <p><label for="order-form--phone-number">Ваш телефон*:</label><input type="text" name="order-form--phone-number" id="order-form--phone-number"></p>
                <button type="submit">Отправить</button>
    
            </form>
        </div></div>
    
</div>`);
    modalCloser();
    
};

//adding to cart

//utilities:

  // modal-close
function modalCloser(){
  let closeBtn = document.querySelector(".close-btn");
  let modal = document.querySelector(".modal");
    closeBtn.addEventListener("click", function(){
    modal.style.display = "none";
                });
    };


PS
Консоль ошибок не выдаёт
  • Вопрос задан
  • 331 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
"Не срабатывает" - это вам так кажется. Будете жать на нужную кнопку - всё сработает. Почему кнопка не та? Потому что при открытии окна вы каждый раз создаёте новое. А querySelector возвращает первый подходящий элемент, так что обработчик закрытия всегда цепляется к кнопке того окна, которое было создано при первом открытии.

Правильно будет заранее создать окно и при открытии вписывать в него нужные данные; или же, в случае создания заново при каждом открытии, вместо скрытия удалять его. Короче, вместо modal.style.display = "none" делайте modal.remove(), и всё будет окей.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы