首页 > 解决方案 > 当我有时点击购物按钮时,它不起作用 javascript

问题描述

我编写了一个将商品添加到购物车的代码(.products-container 类)。代码效果很好,但是有时当我单击按钮时,它不起作用!. 这非常随机发生,我查看了浏览器控制台是否有错误,但没有给出!(我认为这与脚本加载有关)

let cartNumStr = document.querySelector('.counter-eclipse-num').innerText;
let cartNum = Number(cartNumStr);
let sumPrice = document.querySelector('.sum-price').innerText;
sumPrice = Number(sumPrice);

document.querySelector(".polygon-cart").addEventListener("click", function(e) {
    const tgt = e.target;
    if (tgt.classList.contains("fa-trash")) {
      const container = tgt.closest(".cart-content-container");
      let qty = container.querySelector(".cart-qty").value;
      if (qty < 2){
        container.remove();
        cartNum = cartNum - 1;
        document.querySelector('.counter-eclipse-num').innerText = cartNum;
      }    
      else {
        qty = qty -1;
        container.querySelector(".cart-qty").value = qty;
        cartNum = cartNum - 1;
        document.querySelector('.counter-eclipse-num').innerText = cartNum;
        if (cartNum <10) {
          document.querySelector('.counter-eclipse-num').style.right = "5.2px";
        }
      }
    }
  });

function addCartNum() {
    cartNum = cartNum + 1;
    document.querySelector('.counter-eclipse-num').innerText = cartNum;
    if (cartNum > 9){
      document.querySelector('.counter-eclipse-num').style.right = "2.2px";
    }
}

document.querySelector(".products-container").addEventListener("click", function(f){
  fgt = f.target;
  if (fgt.classList.contains("fa-shopping-cart")){
    const container = fgt.closest(".product-1")
    let title = container.querySelector(".product-title").innerText;
    let price = container.querySelector(".product-price").innerText;
    let img = container.querySelector(".product-img").src;
    let cartContentContainer = document.createElement("div")
    cartContentContainer.classList.add('cart-content-container');
    let motherElement = document.querySelector(".main-cart-content-container");
    let cartItemContent =
    ` <p class="cart-price" dir="rtl">${price}</p>
      <div class="cart-qty-container">
          <input dir="rtl" type="number" min="1" value="1" class='cart-qty' id="cart-qty"oninput="this.value = 
          !!this.value && Math.abs(this.value) >= 0 ? Math.abs(this.value) : null">
          <label class="cart-qty-label" dir="rtl">تعداد &nbsp : &nbsp</label>
      </div>
      <a href="#" dir="rtl" class="cart-title">${title}</a>
      <i class="fas fa-trash" id = "trash-icon"></i>
      <div class="cart-product-img-container">
          <img src="${img}" class="cart-product-img">
      </div>
    `
    cartContentContainer.innerHTML = cartItemContent;
    motherElement.append(cartContentContainer);
    let realPrice = container.querySelector('.real-price').innerText;
    realPrice = Number(realPrice);
    sumPrice = sumPrice + realPrice;
    document.querySelector('.sum-price').innerText = sumPrice;
    addCartNum();
  }
})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="Header.CSS">
    <link rel="stylesheet" href="Style.CSS">
    <link rel="stylesheet" href="Footer.CSS">
    <script src="https://kit.fontawesome.com/38b3678073.js" crossorigin="anonymous"></script>
    <script src="/JS/main.js" async></script>
    <title>خانه | PCGA</title>
</head>
<body>
<header>
    <div class="polygon-cart" id = "cart">
        <i class="fas fa-shopping-cart" id="cart-icon"></i>
        <div class="counter-eclipse">
            <p class="counter-eclipse-num">0</p>
        </div>
        <div class="main-cart-content-container" id = "main-cart-content-container">
            
        </div>
        <div class="cart-info-top">
            <button class="cart-checkout-btn">تسویه نهایی</button>
            <span class="cart-whole-price">جمع مبلغ سبد خرید شما : <span class = "sum-price">0</span> هزارتومان</span>
        </div>
    </div>
    <img src="img/Final-Logo.png" alt="Final-Logo" class="Final-Logo" height="171px" width="500px">
    <div class="SearchContainer">
        <table class="SearchTable">
            <tr>
                <td>
                    <input type="text" placeholder="Search" class="SearchBar">
                </td>
                <td>
                    <a href="#"><i class="SearchIcon"></i></a>
                </td>
            </tr>
        </table>
    </div>
    <nav class="nav-top">
        <ul>
            <a href="/index.html"><li>خانه</li></a>
            <div class="nav-products">
                <a href="#"><li>محصولات</li></a>
                <ul class = products-dropdown-content>
                    <a href="/Products-Origin.html"><li>(Origin) اوریجین</li></a>
                    <a href="/Products-Steam.html"><li>(Steam) استیم</li></a>
                    <a href="/Products-Uplay.html"><li>(Uplay) یوپلی</li></a>
                </ul>
            </div>
            <a href="#"><li>تماس با ما</li></a>
            <a href="#"><li>درباره ما</li></a>
        </ul>
    </nav>   
</header>
<div class = 'products-container'>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">150000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button  class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">520000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button  class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">750000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">50000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">24000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">36000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
</div>

<div class="pagination">
    <a href="#">&laquo;</a>
    <a href="#">1</a>
    <a href="#" class="active">2</a>
    <a href="#">3</a>
    <a href="#">4</a>
    <a href="#">5</a>
    <a href="#">6</a>
    <a href="#">&raquo;</a>
</div>

<footer class = 'footer-main'>
    <div class='footer-content'>
        <div class='col-1'>
            <h3>محصولات</h3>
            <ul>
                <li><a href="/Products-Origin.html">(Origin) اوریجین</a></li>
                <li><a href="/Products-Steam.html">(Steam) استیم</a></li>
                <li><a href="/Products-Uplay.html">(Uplay) یوپلی</a></li>
            </ul>
        </div>
        <div class='col-2'>
            <h3>حساب&nbsp کاربری</h3>
            <ul>
                <li><a href="/page/login.html">ورود</a></li>
                <li><a href="/page/register.html">ثبت نام</a></li>
                <li><a href="/page/orders.html">سفارشات من</a></li>
            </ul>
        </div>
        <div class='col-3'>
            <h3>پشتیبانی</h3>
            <ul>
                <li><a href="#">سوالات متداول</a></li>
                <li><a href="#">قوانین</a></li>
                <li><a href="#">تماس با ما</a></li>
                <li><a href="#">درباره ما</a></li>
            </ul>
        </div>
        <div class='col-4'>
            <img src="/img/bonyad-mojavez.png" class="mojavez-pic">
        </div>
    </div>
    <div class='footer-copyright' dir="rtl">Copyright PCGA.info 2021, all rights reserved | تمامی حقوق برای فروشگاه پی سی جی ای محفوظ است <br> طراحی و توسعه توسط نیما صیادی</div>
</footer>

</body>
</html>

标签: javascripthtmlcss

解决方案


因为事件只包含在类中,所以当你点击标签fa-shopping-cart的外线标签时,事件不会被执行。iconbutton

所以我从下面添加了事件,

if (fgt.classList.contains("fa-shopping-cart")){
...
}

到下面这个,

if (fgt.classList.contains("buy-btn")||fgt.classList.contains("fa-shopping-cart")){
...
}

因此,每当您单击按钮时都会执行按钮事件。

let cartNumStr = document.querySelector('.counter-eclipse-num').innerText;
let cartNum = Number(cartNumStr);
let sumPrice = document.querySelector('.sum-price').innerText;
sumPrice = Number(sumPrice);

document.querySelector(".polygon-cart").addEventListener("click", function(e) {
    const tgt = e.target;
    if (tgt.classList.contains("fa-trash")) {
      const container = tgt.closest(".cart-content-container");
      let qty = container.querySelector(".cart-qty").value;
      if (qty < 2){
        container.remove();
        cartNum = cartNum - 1;
        document.querySelector('.counter-eclipse-num').innerText = cartNum;
      }    
      else {
        qty = qty -1;
        container.querySelector(".cart-qty").value = qty;
        cartNum = cartNum - 1;
        document.querySelector('.counter-eclipse-num').innerText = cartNum;
        if (cartNum <10) {
          document.querySelector('.counter-eclipse-num').style.right = "5.2px";
        }
      }
    }
  });

function addCartNum() {
    cartNum = cartNum + 1;
    document.querySelector('.counter-eclipse-num').innerText = cartNum;
    if (cartNum > 9){
      document.querySelector('.counter-eclipse-num').style.right = "2.2px";
    }
}

document.querySelector(".products-container").addEventListener("click", function(f){
  fgt = f.target;
  ///// I edited this condition
  //// from if (fgt.classList.contains("fa-shopping-cart")){
  //// to this below
  if (fgt.classList.contains("buy-btn")||fgt.classList.contains("fa-shopping-cart")){
  ///// I edited this condition
    const container = fgt.closest(".product-1")
    let title = container.querySelector(".product-title").innerText;
    let price = container.querySelector(".product-price").innerText;
    let img = container.querySelector(".product-img").src;
    let cartContentContainer = document.createElement("div")
    cartContentContainer.classList.add('cart-content-container');
    let motherElement = document.querySelector(".main-cart-content-container");
    let cartItemContent =
    ` <p class="cart-price" dir="rtl">${price}</p>
      <div class="cart-qty-container">
          <input dir="rtl" type="number" min="1" value="1" class='cart-qty' id="cart-qty"oninput="this.value = 
          !!this.value && Math.abs(this.value) >= 0 ? Math.abs(this.value) : null">
          <label class="cart-qty-label" dir="rtl">تعداد &nbsp : &nbsp</label>
      </div>
      <a href="#" dir="rtl" class="cart-title">${title}</a>
      <i class="fas fa-trash" id = "trash-icon"></i>
      <div class="cart-product-img-container">
          <img src="${img}" class="cart-product-img">
      </div>
    `
    cartContentContainer.innerHTML = cartItemContent;
    motherElement.append(cartContentContainer);
    let realPrice = container.querySelector('.real-price').innerText;
    realPrice = Number(realPrice);
    sumPrice = sumPrice + realPrice;
    document.querySelector('.sum-price').innerText = sumPrice;
    addCartNum();
  }
})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="Header.CSS">
    <link rel="stylesheet" href="Style.CSS">
    <link rel="stylesheet" href="Footer.CSS">
    <script src="https://kit.fontawesome.com/38b3678073.js" crossorigin="anonymous"></script>
    <script src="/JS/main.js" async></script>
    <title>خانه | PCGA</title>
</head>
<body>
<header>
    <div class="polygon-cart" id = "cart">
        <i class="fas fa-shopping-cart" id="cart-icon"></i>
        <div class="counter-eclipse">
            <p class="counter-eclipse-num">0</p>
        </div>
        <div class="main-cart-content-container" id = "main-cart-content-container">
        </div>
        <div class="cart-info-top">
            <button class="cart-checkout-btn">تسویه نهایی</button>
            <span class="cart-whole-price">جمع مبلغ سبد خرید شما : <span class = "sum-price">0</span> هزارتومان</span>
        </div>
    </div>
    <img src="img/Final-Logo.png" alt="Final-Logo" class="Final-Logo" height="171px" width="500px">
    <div class="SearchContainer">
        <table class="SearchTable">
            <tr>
                <td>
                    <input type="text" placeholder="Search" class="SearchBar">
                </td>
                <td>
                    <a href="#"><i class="SearchIcon"></i></a>
                </td>
            </tr>
        </table>
    </div>
    <nav class="nav-top">
        <ul>
            <a href="/index.html"><li>خانه</li></a>
            <div class="nav-products">
                <a href="#"><li>محصولات</li></a>
                <ul class = products-dropdown-content>
                    <a href="/Products-Origin.html"><li>(Origin) اوریجین</li></a>
                    <a href="/Products-Steam.html"><li>(Steam) استیم</li></a>
                    <a href="/Products-Uplay.html"><li>(Uplay) یوپلی</li></a>
                </ul>
            </div>
            <a href="#"><li>تماس با ما</li></a>
            <a href="#"><li>درباره ما</li></a>
        </ul>
    </nav>   
</header>
<div class = 'products-container'>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">150000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button  class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">520000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button  class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">750000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">50000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">24000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
    <div class='product-1'>
        <div class="product-img-container">
            <img src="/img/BFV.jpg" class='product-img'>
            <div class = 'product-price'>قیمت : <span class="real-price">36000</span> تومان</div>
        </div>
        <section class='product-title'>
            <h1 dir="rtl"><a href="#">اکانت بازی  Battlefield V Deluxe Edition</a></h1>
        </section>
        <div class="product-des">
            <table class="info-table">
                <tr>
                    <th>ضمانت</th>
                    <th>قابلیت تغییر اطلاعات</th>
                    <th>پلتفرم</th>
                </tr>
                <tr>
                    <td>5 ساله سبز</td>
                    <td>دارد</td>
                    <td>یوپلی</td>
                </tr>
            </table>
            <button class="buy-btn" ><i class="fas fa-shopping-cart" id= "addcartbtn"></i></button>
        </div>
    </div>
</div>

<div class="pagination">
    <a href="#">&laquo;</a>
    <a href="#">1</a>
    <a href="#" class="active">2</a>
    <a href="#">3</a>
    <a href="#">4</a>
    <a href="#">5</a>
    <a href="#">6</a>
    <a href="#">&raquo;</a>
</div>

<footer class = 'footer-main'>
    <div class='footer-content'>
        <div class='col-1'>
            <h3>محصولات</h3>
            <ul>
                <li><a href="/Products-Origin.html">(Origin) اوریجین</a></li>
                <li><a href="/Products-Steam.html">(Steam) استیم</a></li>
                <li><a href="/Products-Uplay.html">(Uplay) یوپلی</a></li>
            </ul>
        </div>
        <div class='col-2'>
            <h3>حساب&nbsp کاربری</h3>
            <ul>
                <li><a href="/page/login.html">ورود</a></li>
                <li><a href="/page/register.html">ثبت نام</a></li>
                <li><a href="/page/orders.html">سفارشات من</a></li>
            </ul>
        </div>
        <div class='col-3'>
            <h3>پشتیبانی</h3>
            <ul>
                <li><a href="#">سوالات متداول</a></li>
                <li><a href="#">قوانین</a></li>
                <li><a href="#">تماس با ما</a></li>
                <li><a href="#">درباره ما</a></li>
            </ul>
        </div>
        <div class='col-4'>
            <img src="/img/bonyad-mojavez.png" class="mojavez-pic">
        </div>
    </div>
    <div class='footer-copyright' dir="rtl">Copyright PCGA.info 2021, all rights reserved | تمامی حقوق برای فروشگاه پی سی جی ای محفوظ است <br> طراحی و توسعه توسط نیما صیادی</div>
</footer>

</body>
</html>


推荐阅读