how do i implement a java script validation that will require the user to select an item first before purchasing?

Viewed 72

I need to add some sort of validation to my javascript code that will prompt a message "please select an item before clicking purchase. i have include my html and java script code below. once the user presses ok, they will have to go back and select an item than press purchase.

<!DOCTYPE html>
    <html>
        <head>
            <title>E-SHOP</title>
            <meta name="description" content="description">
            <link rel="stylesheet" href="style.css" />
            <script src="java.js" async></script>
        </head>
        <body>
            <header class="main-header">
                <nav class="main-nav nav">
                    <ul>
                        <li><a href="sitemap.html">sitemap</a></li>
                        <li><a href="home.html">HOME</a></li>
                        <li><a href="distination.html">DESTINATION</a></li>
                        <li><a href="about.html">ABOUT US</a></li>
                        <li><a href="contactus.html">CONTACT US</a></li>
                        <li><a href="eshop.html">E-SHOP</a></li>
                        <a href="#"style="float:left">Love Travel</a>
                    </ul>
                </nav>
                <h1 class="band-name eshop-banner">E-SHOP</h1>
            </header>
            <section class="container content-section">
                <h2 class="section-header">Travel items </h2>
                <div class="shop-items">
                    <div class="shop-item">
                        <span class="shop-item-title">Black suitcase</span>
                        <img class="shop-item-image" src="Images/suitcase7.png">
                        <div class="shop-item-details">
                            <span class="shop-item-price">£54.99</span>
                            <button class="btn btn-primary shop-item-button" type="button">ADD TO CART</button>
                        </div>
                    </div>
                    <div class="shop-item">
                        <span class="shop-item-title">Red and black suitcase</span>
                        <img class="shop-item-image" src="Images/suitcase10.png">
                        <div class="shop-item-details">
                            <span class="shop-item-price">£54.99</span>
                            <button class="btn btn-primary shop-item-button"type="button">ADD TO CART</button>
                        </div>
                    </div>
                    <div class="shop-item">
                        <span class="shop-item-title">Yellow Backpack</span>
                        <img class="shop-item-image" src="Images/yellowbackpack.png">
                        <div class="shop-item-details">
                            <span class="shop-item-price">£49.99</span>
                            <button class="btn btn-primary shop-item-button" type="button">ADD TO CART</button>
                        </div>
                    </div>
                    <div class="shop-item">
                        <span class="shop-item-title">Rainbow Backpack</span>
                        <img class="shop-item-image" src="Images/rainbowbackpack.png">
                        <div class="shop-item-details">
                            <span class="shop-item-price">£49.99</span>
                            <button class="btn btn-primary shop-item-button" type="button">ADD TO CART</button>
                        </div>
                    </div>
                </div>

                <div class="shop-items">
                    <div class="shop-item">
                        <span class="shop-item-title">World T-Shirt</span>
                        <img class="shop-item-image" src="Images/shirt2.png">
                        <div class="shop-item-details">
                            <span class="shop-item-price">£19.99</span>
                            <button class="btn btn-primary shop-item-button" type="button">ADD TO CART</button>
                        </div>
                    </div>
                    <div class="shop-item">
                        <span class="shop-item-title">Portable travel mug</span>
                        <img class="shop-item-image" src="Images/travelmug.png">
                        <div class="shop-item-details">
                            <span class="shop-item-price">£14.99</span>
                            <button class="btn btn-primary shop-item-button" type="button">ADD TO CART</button>
                        </div>
                    </div>
                </div>
            </section>
            <section class="container content-section">
                <h2 class="section-header">CART</h2>
                <div class="cart-row">
                    <span class="cart-item cart-header cart-column">ITEM</span>
                    <span class="cart-price cart-header cart-column">PRICE</span>
                    <span class="cart-quantity cart-header cart-column">QUANTITY</span>
                </div>
                <div class="cart-items">
                </div>
                <div class="cart-total">
                    <strong class="cart-total-title">Total</strong>
                    <span class="cart-total-price">£0</span>
                </div>
                <button class="btn btn-primary btn-purchase" type="button">PURCHASE</button>
            </section>

                            </a>
                        </li>
                    </ul>
                </div>
            </footer>
        </body>
    </html>

My java scipt code starts here which is mainly validation. this is the bit that needs changing.

if (document.readyState == 'loading') {
    document.addEventListener('DOMContentLoaded', ready)
} else {
    ready()
}


function ready() {
    var removeCartItemButtons = document.getElementsByClassName('btn-danger')
    for (var i = 0; i < removeCartItemButtons.length; i++) {
        var button = removeCartItemButtons[i]
        button.addEventListener('click', removeCartItem)
    }

    var quantityInputs = document.getElementsByClassName('cart-quantity-input')
    for (var i = 0; i < quantityInputs.length; i++) {
        var input = quantityInputs[i]
        input.addEventListener('change', quantityChanged)
    }

    var addToCartButtons = document.getElementsByClassName('shop-item-button')
    for (var i = 0; i < addToCartButtons.length; i++) {
        var button = addToCartButtons[i]
        button.addEventListener('click', addToCartClicked)
    }

    document.getElementsByClassName('btn-purchase')[0].addEventListener('click', purchaseClicked)
}

function purchaseClicked() {
    alert('Thank you for your purchase. You will receive your purchased items within 3 working days')
    var cartItems = document.getElementsByClassName('cart-items')[0]
    while (cartItems.hasChildNodes()) {
        cartItems.removeChild(cartItems.firstChild)
    }
    updateCartTotal()
}

function removeCartItem(event) {
    var buttonClicked = event.target
    buttonClicked.parentElement.parentElement.remove()
    updateCartTotal()
}

function quantityChanged(event) {
    var input = event.target
    if (isNaN(input.value) || input.value <= 0) {
        input.value = 1
    }
    updateCartTotal()
}

function addToCartClicked(event) {
    var button = event.target
    var shopItem = button.parentElement.parentElement
    var title = shopItem.getElementsByClassName('shop-item-title')[0].innerText
    var price = shopItem.getElementsByClassName('shop-item-price')[0].innerText
    var imageSrc = shopItem.getElementsByClassName('shop-item-image')[0].src
    addItemToCart(title, price, imageSrc)
    updateCartTotal()
}

function addItemToCart(title, price, imageSrc) {
    var cartRow = document.createElement('div')
    cartRow.classList.add('cart-row')
    var cartItems = document.getElementsByClassName('cart-items')[0]
    var cartItemNames = cartItems.getElementsByClassName('cart-item-title')
    for (var i = 0; i < cartItemNames.length; i++) {
        if (cartItemNames[i].innerText == title) {
            alert('This item is already added to the cart')
            return
        }
    }
    var cartRowContents = `
        <div class="cart-item cart-column">
            <img class="cart-item-image" src="${imageSrc}" width="100" height="100">
            <span class="cart-item-title">${title}</span>
        </div>
        <span class="cart-price cart-column">${price}</span>
        <div class="cart-quantity cart-column">
            <input class="cart-quantity-input" type="number" value="1">
            <button class="btn btn-danger" type="button">REMOVE</button>
        </div>`
    cartRow.innerHTML = cartRowContents
    cartItems.append(cartRow)
    cartRow.getElementsByClassName('btn-danger')[0].addEventListener('click', removeCartItem)
    cartRow.getElementsByClassName('cart-quantity-input')[0].addEventListener('change', quantityChanged)
}

function updateCartTotal() {
    var cartItemContainer = document.getElementsByClassName('cart-items')[0]
    var cartRows = cartItemContainer.getElementsByClassName('cart-row')
    var total = 0
    for (var i = 0; i < cartRows.length; i++) {
        var cartRow = cartRows[i]
        var priceElement = cartRow.getElementsByClassName('cart-price')[0]
        var quantityElement = cartRow.getElementsByClassName('cart-quantity-input')[0]
        var price = parseFloat(priceElement.innerText.replace('£', ''))
        var quantity = quantityElement.value
        total = total + (price * quantity)
    }
    total = Math.round(total * 100) / 100
    document.getElementsByClassName('cart-total-price')[0].innerText = '£' + total;
}
1 Answers

All you have to do is to make the cart variable global to check it length on submission and also updated the purchaseClicked function accordingly. If the length of cart is 0 then its empty else its not. Also i would recommend using let variables instead of var because there isnt any need for var in your code.

Let are blocked-Scope variables hence they are limited to a specific block, saving you the trouble of worrying about them being replace or reinitialized as you do in Var.

let cartRows = 0;   //-------------> Added it here from bottom to make it globally accessible
if (document.readyState == 'loading') {
 document.addEventListener('DOMContentLoaded', ready)
} else {
 ready()
}


function purchaseClicked() {
  if(cartRows && cartRows.length >0){
    alert('Thank you for your purchase. You will receive your purchased items within 3 working days')
    var cartItems = document.getElementsByClassName('cart-items')[0]

    while (cartItems.hasChildNodes()) {
      cartItems.removeChild(cartItems.firstChild)
    }
    updateCartTotal()    
  }else{
    alert('please select an item before clicking purchase');
  }

}




function updateCartTotal() {
  let cartItemContainer = document.getElementsByClassName('cart-items')[0]
  cartRows = cartItemContainer.getElementsByClassName('cart-row') //------>Here i removed the var type and pasted it above
  let total = 0;
  for (var i = 0; i < cartRows.length; i++) {
    let priceElement = cartRow.getElementsByClassName('cart-price')[0]
    let quantityElement = cartRow.getElementsByClassName('cart-quantity-input')[0]
    let price = parseFloat(priceElement.innerText.replace('£', ''))
    let quantity = quantityElement.value;
    total = total + (price * quantity)
  }
  total = Math.round(total * 100) / 100
  document.getElementsByClassName('cart-total-price')[0].innerText = '£' + total;
}
Related