首页 > 解决方案 > 为什么我的 Javascript 购物车在付款后没有重置为零?

问题描述

我有一个名为“cart”的 js 变量,它是在我的主页(main.html)中创建的。只要用户在购物车中添加产品,变量就会正确更新。在结帐页面 (checkout.html) 中,单击“付款”按钮后,我想将购物车值重置为 {}。但是是行不通的。购物车数据已正确发送到后端,但购物车值未重置为零。有人有想法吗?太感谢了。

main.html

<!DOCTYPE html>
{% load static %}
<html lang="en">

    <head>
        
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">
    
        <link rel="stylesheet" type="text/css" href=" {%  static 'css/main.css' %}">

        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css">

        <title>Titre onglet</title>

        <script type="text/javascript">
            var user = '{{request.user}}'

            function getToken(name) {
                let cookieValue = null;
                if (document.cookie && document.cookie !== '') {
                    const cookies = document.cookie.split(';');
                    for (let i = 0; i < cookies.length; i++) {
                        const cookie = cookies[i].trim();
                        // Does this cookie string begin with the name we want?
                        if (cookie.substring(0, name.length + 1) === (name + '=')) {
                            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                            break;
                        }
                    }
                }
                return cookieValue;
            }
            const csrftoken = getToken('csrftoken');

            function getCookie(name) {
                // Split cookie string and get all individual name=value paris in an array
                var cookieArr = document.cookie.split(";");

                // Loop through the array elements
                for(var i = 0; i < cookieArr.length; i++) {
                    var cookiePair = cookieArr[i].split("=");

                    // Removing whitespace at the beginning of the cookie name and compare it with the given string
                    if(name == cookiePair[0].trim()) {
                        // Decode the cookie value and return
                        return decodeURIComponent(cookiePair[1]);
                    }
                }
            
                // Return null if not found
                return null;
            }
            
            var cart = JSON.parse(getCookie('cart'));

            if(cart == undefined) {
                cart = {};
                console.log('Cart was created !!');
                document.cookie = 'cart=' + JSON.stringify(cart) + ";domain=;path=/";
            }

            console.log('Cart:', cart);

        </script>
    
    </head>

    <body>
        <header>
            <nav>
                <ul>
                    <li id="logo"> <a href="#"> Monoi </a></li>
                    <li> <a class="nav-link" href="{% url 'home' %}"> Accueil </a> </li>
                    <li> <a class="nav-link" href="#"> La marque </a> </li>
                    <li> <a class="nav-link" href="#"> La boutique </a> </li>
                    <li> <a class="nav-link" href="{% url 'products' %}"> Tous les produits </a> </li>
                    <li> <a class="nav-link" href="#"> Contact </a> </li>
                    <li> <a href="https://www.instagram.com/monoi.paris/" target="_blank" rel="noopener noreferrer"><i class="fa fa-instagram"></i> </a> </li>
                    <li> <a href="https://www.instagram.com/monoi.paris/" target="_blank" rel="noopener noreferrer"><i class="fa fa-facebook"></i> </a> </li>
                    <li> <a href="{% url 'cart' %}"><i class="fa fa-shopping-cart"></i> </a> </li>
                    <li> <span class="cart-count" id="cart-count"> {{cartItems}} </span> </li>
                    <li> <a href="#">  <button class="button" type="button">Log In</button>  </a> </li>
                </ul>
            </nav>
        </header>

        <section class="container" id="page-content">
            {% block content %}
            {% endblock content %}
        </section>

        <footer>
            <div id="copyright">
                <span>© AlexisWeb </span>
            </div>
        </footer>

        <script type="text/javascript" src="{% static 'js/cart.js' %}"> </script>

    </body>

</html>

结帐.html

{% extends 'store/main.html' %}
{% load static %}

{% block content %}

<div class="checkout-page">
    <form id="form">
        {% csrf_token %}
        <div class="order-summary">
            <div> <a class="back-to-button button" href="{% url 'cart' %}">&#x2190; Back to Cart</a> </div>
            <div> <h3> Order Summary </h3> </div>
            <div class = "order-summary-list"> 
            {% for item in items %}
            <div class="order-list">
                <div class="order-table"> <img class="thumbnail-small" src="{{item.product.imageURL}}"> </div>
                <div class="order-table"> <h5> // {{item.product.name}} // </h5></div>
                <div class="order-table"> <h5> // {{item.product.price|floatformat:2}} € // </h5> </div>
                <div class="order-table"> <h5> // {{item.quantity}} // </h5> </div>
            </div>
            {% endfor %}
            </div>
            <div> <h4> Items : {{order.get_cart_items}} <h4> </div>
            <div> <h4> Total : {{order.get_cart_total|floatformat:2}} € <h4> </div>
        </div>

        <div class="customer-info">
            <div id="customer-basic-info" class="customer-basic-info">  
                <div class="text-box-name"> <input required class="form text-box" type="text" name="name" placeholder="Name.."> </div>
                <div class="text-box-email"> <input required class="form text-box" type="email" name="email" placeholder="Email.."> </div>
            </div>
            <div> <h4> Shipping information </h4> </div>
            <div class="customer-shipping-info-1">
                <div class="text-box-address"> <input required class="form text-box" type="text" name="address" placeholder="Address.."> </div>
                <div class="text-box-postcode"> <input required class="form text-box" type="text" name="postcode" placeholder="Code postal"> </div>
            </div>
            <div class="customer-shipping-info-2">  
                <div class="text-box-city"> <input required class="form text-box" type="text" name="city" placeholder="Ville.."> </div>
                <div class="text-box-country"> <input required class="form text-box" type="text" name="country" placeholder="Pays.."> </div>
            </div>
        </div>

        <div class="payment-options">
            <div> <h4> Paiement <h4> </div>
            <div> <input class="button" type="submit" value="PayPal" > </div>
            <div> <button class="button" id="make-payment"> MAKE PAYMENT </button> </div>
        </div>
    </form>
</div>

<script type="text/javascript">

    var total = '{{order.get_cart_total}}';
    var shipping = '{{order.shipping}}';
    var form = document.getElementById("form");

    form.addEventListener('submit', function(e){
        e.preventDefault();
        console.log('Form submitted.....');
    })


    if (user != 'AnonymousUser'){
        document.getElementById('customer-basic-info').innerHTML = ''
    }

    document.getElementById("make-payment").addEventListener('click', function(e){
        submitFormData();
    })

    // Bug avec cette fonction car quand le cart n'est pas remis à zéro. Voir part 4 à 51.25. 
    function submitFormData(){
        console.log('Payment button clicked');

        var userFormData = {
            'name':null,
            'email':null,
            'total':total,
        };

        var shippingInfo = {
            'address':null,
            'postcode':null,
            'city':null,
            'country':null,
        };

        shippingInfo.address = form.address.value; 
        shippingInfo.city = form.city.value; 
        shippingInfo.postcode = form.postcode.value; 
        shippingInfo.country = form.country.value; 


        if(user == 'AnonymousUser'){
            userFormData.name = form.name.value;
            userFormData.email = form.email.value;
        }

        var url = '/process_order/';

        fetch(url,{
            method:'POST',
            headers:{
                'Content-Type':'application/json',
                'X-CSRFToken':csrftoken,
            },
            body:JSON.stringify({'form':userFormData, 'shipping':shippingInfo})
        })
        .then(response => response.json())
        .then(data => {
            console.log('Success:', data);
            alert('Transaction completed');

            cart = {};

            document.cookie = 'cart' + JSON.stringify(cart) + ";domain=;path=/";

            window.location.href = "{% url 'products' %}";
        })

    }

</script>

{% endblock content %}

标签: javascriptjsoncookiesfetch

解决方案


推荐阅读