Не удается заставить мою функцию JS выполняться на нескольких продуктах

#javascript #html #dom #bootstrap-4

#javascript #HTML #dom #bootstrap-4

Вопрос:

Я новичок в Javascript.

Вы можете увидеть кнопку. Я хочу открыть «окно» поверх. Работает для продукта 1 (масло чили). Это своего рода временная шкала, на которой пользователь наводит курсор (см. Заголовок / Цену товара), нажимает вниз (маленькая черная рамка), затем наводит курсор мыши (который отображает окно).

Я пытаюсь выяснить, почему это не работает на продукте 2. Функция была в первом экземпляре, вызывая button / divs с их идентификаторами. Я изменил фактическую кнопку на вызов class .btn и оставил div в качестве id zoom .

В конце концов я хочу открыть div, который вы видите, щелкнув product 1, и заполнить его описанием элемента, хранящимся в объекте javascript, в зависимости от того, какой элемент был нажат. Подумал, что это самый эффективный способ сделать это, если в итоге у нас будет 100 продуктов на сайте, но я уверен, что может быть лучший способ (есть предложения?).

HTML

             <div class="liqueursContainer">
            <!--Product 1-->
            <div class="product" style="border-bottom: 0px;">
                <div class="overlay">
                    <img src="images/chillioil.jpg" class="image" alt="Chili Oil">
                    <div class="middle">
                        <div><p class="abt-product-desc-sm" id="pr-desc-clk1">
                            <a onmousedown="prMouseDown()" onmouseup="prMouseUp()" id="product-zoom" class="btn btn-default">Chiliamp;nbsp;Oil<br>35cl<br>
                            £8.99</a>
                        </p></div>
                    </div>
                </div>
                <a class="add-cart cart1" href="#"><p class="cart-but-txt">Add to Cart</p></a>
            </div>
            <!--Product 2-->
            <div class="product" style="border-bottom: 0px;">
                <div class="overlay">
                    <img src="images/raspratafia.jpg" class="image" alt="Raspberry Ratafia">
                    <div class="middle">
                        <div><p class="abt-product-desc-sm" id="pr-desc-clk2" style="left: -55px; top: -78px;">
                            <a onmousedown="prMouseDown()" onmouseup="prMouseUp()" id="product-zoom" class="btn btn-default" style="width: 100%; height: 100%; background-color: rgb(78, 78, 78); color: white">Raspberry<br>Ratafia<br>50cl<br>
                            £15.99</a>
                        </p></div>
                    </div>
                </div>
                <a class="add-cart cart2" href="#"><p class="cart-but-txt">Add to Cart</p></a>
            </div>
         </div>

        <div id="zoom" class="container d-none"> 
            <p></p>
        </div>
  

CSS

     .middle {
transition: .5s ease;
position: absolute;
top: 50%;
left: 50%;
text-align: center;
opacity: 0;
margin-bottom: 150px;
}
.product {
width: 45%;
display: flex;
justify-content: space-around;
text-align: right;
align-items: center;
border-bottom: 2px solid #660000;
display: flex;
}
.product {
width: 100%;
display: flex;
flex-wrap: wrap;
}
.liqueursContainer {
display: flex;
justify-content: center;
flex-wrap: wrap;
margin-top: 25px;
}
#product-zoom {
background-color: azure;
font-weight: bold;
line-height: 1.5;
font-size: 17px;
color: black;
height: 85px;
top: -150px;
opacity: 0.5;
}
.abt-product-desc-sm {
position: relative;
top: -70px;
left: -50px;
color: rgb(133, 133, 133);
font-weight: 550;
font-size: 20px;
text-align: center;
cursor: pointer;
}
#zoom {
position: relative; 
width: 75%;
background-color: white;
margin: 0 auto;
height: 500px;
top: -700px;
border-radius: 15px;
border: 1px solid black;
}
  

Javascript

                 const button = document.querySelector('.btn');           // This is the main script to view the div

            button.addEventListener('click', function() {                  
                const zoom = document.getElementById('zoom');
                
                if (zoom.classList.contains('d-none')) {             // Using a bootstrap operation to hide/show div with 'd-none' class
                    zoom.classList.remove('d-none');
                    
                } else {
                    zoom.classList.add('d-none');     
                }
                                
            });

            function prMouseDown() {
                document.getElementById("pr-desc-clk1").style.border = "1px solid black";     //This is an attempt to get the black border around each products click
                document.getElementById("pr-desc-clk1").style.borderRadius = "3px";           // But I haven't yet worked out how to do this from a couple of lines (using a class did not seem to work)
                 
                document.getElementById("pr-desc-clk2").style.border = "1px solid black";
                document.getElementById("pr-desc-clk2").style.borderRadius = "3px";
                document.getElementById("pr-desc-clk2").style.left = "-56px";
       
  

Комментарии:

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

Ответ №1:

Потому что, document.querySelector вернет только первый элемент. Таким образом, событие будет привязано только к первому.

Вы должны использовать document .querySelectorAll для извлечения более одного элемента. Он вернется Array nodes[] , затем придется перебирать массив для обработки одного узла.

 const buttons = document.querySelectorAll('.btn');
  
  for(let i = 0; i < buttons.length; i  ){
    buttons[i].addEventListener('click', function() {                  
        const zoom = document.getElementById('zoom');
                
        if (zoom.classList.contains('d-none')) {
            zoom.classList.remove('d-none');
        } else {
            zoom.classList.add('d-none');     
        }
                                
    });
  }
  

Комментарии:

1. Это работает, спасибо!! Это было так просто 🙂 Я вернусь к учебным пособиям и курсам, которые я думаю, хахаха