为什么贝宝的智能按钮无法识别购物车中的物品?

时间:2020-04-01 21:03:00

标签: javascript paypal

我已将PayPal智能按钮集成到我的JavaScript购物车中。我有以下代码:

<script>
        paypal.Buttons({
            createOrder: function(data, actions) {
                // This function sets up the details of the transaction, including the amount and line item details.
                return actions.order.create({
                    "purchase_units": [{
                        "amount": {
                            "value": countCartTotal(),
                            "currency_code": "USD",
                            "breakdown": {
                                "item_total": {
                                    "currency_code": "USD",
                                    "value": countCartTotal()
                                },
                            },
                        },
                        "items": arrayOfItems()
                    }
                    ]
                });
            },
            onApprove: function(data, actions) {
                // This function captures the funds from the transaction.
                return actions.order.capture().then(function(details) {
                    // This function shows a transaction success message to your buyer.
                    window.location.href = "orderConfirmed.php"
                    clearCart()
                });
            }
        }).render('#paypal-button-container');
        //This function displays Smart Payment Buttons on your web page.
    </script>

此脚本使用:countCartTotal(),以便PayPal向用户收取正确的金额,并且可以正常工作,但我想向用户展示他们通过PayPal购买的商品。因此,在项目部分中,我尝试创建一个循环购物车中每个项目的数组。这是以下行:

"items": arrayOfItems()

'arrayOfItems()'类如下:

function arrayOfItems() {

        cart.forEach((cartItem, index) => {
            let currency = cartItem.price;
            let quantity = cartItem.quantity;
            let itemName = cartItem.name;

            let items = [{"unit_amount": {"currency_code": "USD","value": currency},"quantity": quantity,"name": itemName,}];

            return items;

        });

    }

当我在本地主机上运行代码时,JavaScript控制台会显示错误日志:

enter image description here

它告诉我'错误:未定义不是对象(正在评估'cartItem.name')'

我的arrayOfItems()如下:

function arrayOfItems() {

        cart.forEach((cartItem, index) => {
            let currency = cartItem.price;
            let quantity = cartItem.quantity;
            let itemName = cartItem.name;

            let items = [{"unit_amount": {"currency_code": "USD","value": currency},"quantity": quantity,"name": itemName,}];

            return items;

        });

    }

我认为错误行是:

let itemName = cartItem.name;

我的整个js文件是:

'use strict';

let cart = (JSON.parse(localStorage.getItem('cart')) || []);
const cartDOM = document.querySelector('.cart');
const addToCartButtonsDOM = document.querySelectorAll('[data-action="ADD_TO_CART"]');

if (cart.length > 0) {
    cart.forEach(cartItem => {
        const product = cartItem;
        insertItemToDOM(product);
        countCartTotal();

        addToCartButtonsDOM.forEach(addToCartButtonDOM => {
            const productDOM = addToCartButtonDOM.parentNode;

            if (productDOM.querySelector('.product__name').innerText === product.name) {
                handleActionButtons(addToCartButtonDOM, product);
            }
        });

    });
}

addToCartButtonsDOM.forEach(addToCartButtonDOM => {
    addToCartButtonDOM.addEventListener('click', () => {
        const productDOM = addToCartButtonDOM.parentNode;
        const product = {
            image: productDOM.querySelector('.product__image').getAttribute('src'),
            name: productDOM.querySelector('.product__name').innerText,
            price: productDOM.querySelector('.product__price').innerText,
            quantity: 1,
        };

        const isInCart = (cart.filter(cartItem => (cartItem.name === product.name)).length > 0);

        if (!isInCart) {
            insertItemToDOM(product);
            cart.push(product);
            saveCart();
            handleActionButtons(addToCartButtonDOM, product);
        }
    });
});

function insertItemToDOM(product) {
    cartDOM.insertAdjacentHTML('beforeend', `
    <div class="cart__item">
      <img class="cart__item__image" src="${product.image}" alt="${product.name}">
      <h3 class="cart__item__name">${product.name}</h3>
      <h3 class="cart__item__price">${product.price}</h3>
      <button class="btn btn--primary btn--small${(product.quantity === 1 ? ' btn--danger' : '')}" data-action="DECREASE_ITEM">&minus;</button>
      <h3 class="cart__item__quantity">${product.quantity}</h3>
      <button class="btn btn--primary btn--small" data-action="INCREASE_ITEM">&plus;</button>
      <button class="btn btn--danger btn--small" data-action="REMOVE_ITEM">&times;</button>
    </div>
  `);

    addCartFooter();
}

function handleActionButtons(addToCartButtonDOM, product) {
    addToCartButtonDOM.innerText = 'In Cart';
    addToCartButtonDOM.disabled = true;

    const cartItemsDOM = cartDOM.querySelectorAll('.cart__item');
    cartItemsDOM.forEach(cartItemDOM => {
        if (cartItemDOM.querySelector('.cart__item__name').innerText === product.name) {
            cartItemDOM.querySelector('[data-action="INCREASE_ITEM"]').addEventListener('click', () => increaseItem(product, cartItemDOM));
            cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').addEventListener('click', () => decreaseItem(product, cartItemDOM, addToCartButtonDOM));
            cartItemDOM.querySelector('[data-action="REMOVE_ITEM"]').addEventListener('click', () => removeItem(product, cartItemDOM, addToCartButtonDOM));
        }
    });
}

function increaseItem(product, cartItemDOM) {
    cart.forEach(cartItem => {
        if (cartItem.name === product.name) {
            cartItemDOM.querySelector('.cart__item__quantity').innerText = ++cartItem.quantity;
            cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.remove('btn--danger');
            saveCart();
        }
    });
}

function decreaseItem(product, cartItemDOM, addToCartButtonDOM) {
    cart.forEach(cartItem => {
        if (cartItem.name === product.name) {
            if (cartItem.quantity > 1) {
                cartItemDOM.querySelector('.cart__item__quantity').innerText = --cartItem.quantity;
                saveCart();
            } else {
                removeItem(product, cartItemDOM, addToCartButtonDOM);
            }

            if (cartItem.quantity === 1) {
                cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.add('btn--danger');
            }
        }
    });
}

function removeItem(product, cartItemDOM, addToCartButtonDOM) {
    cartItemDOM.classList.add('cart__item--removed');
    setTimeout(() => cartItemDOM.remove(), 250);
    cart = cart.filter(cartItem => cartItem.name !== product.name);
    saveCart();
    addToCartButtonDOM.innerText = 'Add To Cart';
    addToCartButtonDOM.disabled = false;

    if (cart.length < 1) {
        document.querySelector('.cart-footer').remove();
    }
}

function addCartFooter() {
    if (document.querySelector('.cart-footer') === null) {
        cartDOM.insertAdjacentHTML('afterend', `
      <div class="cart-footer">
        <button data-action="CLEAR_CART">Clear Cart</button>
        <p data-action="CHECKOUT">Total:</p>
      </div>
    `);

        document.querySelector('[data-action="CLEAR_CART"]').addEventListener('click', () => clearCart());
    }
}

function clearCart() {
    cartDOM.querySelectorAll('.cart__item').forEach(cartItemDOM => {
        cartItemDOM.classList.add('cart__item--removed');
        setTimeout(() => cartItemDOM.remove(), 250);
    });

    cart = [];
    localStorage.removeItem('cart');
    document.querySelector('.cart-footer').remove();

    addToCartButtonsDOM.forEach(addToCartButtonDOM => {
        addToCartButtonDOM.innerText = 'Add To Cart';
        addToCartButtonDOM.disabled = false;
    });
}

function countCartTotal() {
    let cartTotal = 0;
    cart.forEach(cartItem => cartTotal += cartItem.quantity * cartItem.price);
    document.querySelector('[data-action="CHECKOUT"]').innerText = `Pay $${cartTotal}`;
    return cartTotal;
}

function saveCart() {
    localStorage.setItem('cart', JSON.stringify(cart));
    countCartTotal();
}

function arrayOfItems (cartItem, product) {
    let cartItemName = cartItem.name;
    'use strict';

    let cart = (JSON.parse(localStorage.getItem('cart')) || []);
    const cartDOM = document.querySelector('.cart');
    const addToCartButtonsDOM = document.querySelectorAll('[data-action="ADD_TO_CART"]');

    if (cart.length > 0) {
        cart.forEach(cartItem => {
            const product = cartItem;
            insertItemToDOM(product);
            countCartTotal();

            addToCartButtonsDOM.forEach(addToCartButtonDOM => {
                const productDOM = addToCartButtonDOM.parentNode;

                if (productDOM.querySelector('.product__name').innerText === product.name) {
                    handleActionButtons(addToCartButtonDOM, product);
                }
            });

        });
    }

    addToCartButtonsDOM.forEach(addToCartButtonDOM => {
        addToCartButtonDOM.addEventListener('click', () => {
            const productDOM = addToCartButtonDOM.parentNode;
            const product = {
                image: productDOM.querySelector('.product__image').getAttribute('src'),
                name: productDOM.querySelector('.product__name').innerText,
                price: productDOM.querySelector('.product__price').innerText,
                quantity: 1,
            };

            const isInCart = (cart.filter(cartItem => (cartItem.name === product.name)).length > 0);

            if (!isInCart) {
                insertItemToDOM(product);
                cart.push(product);
                saveCart();
                handleActionButtons(addToCartButtonDOM, product);
            }
        });
    });

    function insertItemToDOM(product) {
        cartDOM.insertAdjacentHTML('beforeend', `
    <div class="cart__item">
      <img class="cart__item__image" src="${product.image}" alt="${product.name}">
      <h3 class="cart__item__name">${product.name}</h3>
      <h3 class="cart__item__price">${product.price}</h3>
      <button class="btn btn--primary btn--small${(product.quantity === 1 ? ' btn--danger' : '')}" data-action="DECREASE_ITEM">&minus;</button>
      <h3 class="cart__item__quantity">${product.quantity}</h3>
      <button class="btn btn--primary btn--small" data-action="INCREASE_ITEM">&plus;</button>
      <button class="btn btn--danger btn--small" data-action="REMOVE_ITEM">&times;</button>
    </div>
  `);

        addCartFooter();
    }

    function handleActionButtons(addToCartButtonDOM, product) {
        addToCartButtonDOM.innerText = 'In Cart';
        addToCartButtonDOM.disabled = true;

        const cartItemsDOM = cartDOM.querySelectorAll('.cart__item');
        cartItemsDOM.forEach(cartItemDOM => {
            if (cartItemDOM.querySelector('.cart__item__name').innerText === product.name) {
                cartItemDOM.querySelector('[data-action="INCREASE_ITEM"]').addEventListener('click', () => increaseItem(product, cartItemDOM));
                cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').addEventListener('click', () => decreaseItem(product, cartItemDOM, addToCartButtonDOM));
                cartItemDOM.querySelector('[data-action="REMOVE_ITEM"]').addEventListener('click', () => removeItem(product, cartItemDOM, addToCartButtonDOM));
            }
        });
    }

    function increaseItem(product, cartItemDOM) {
        cart.forEach(cartItem => {
            if (cartItem.name === product.name) {
                cartItemDOM.querySelector('.cart__item__quantity').innerText = ++cartItem.quantity;
                cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.remove('btn--danger');
                saveCart();
            }
        });
    }

    function decreaseItem(product, cartItemDOM, addToCartButtonDOM) {
        cart.forEach(cartItem => {
            if (cartItem.name === product.name) {
                if (cartItem.quantity > 1) {
                    cartItemDOM.querySelector('.cart__item__quantity').innerText = --cartItem.quantity;
                    saveCart();
                } else {
                    removeItem(product, cartItemDOM, addToCartButtonDOM);
                }

                if (cartItem.quantity === 1) {
                    cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.add('btn--danger');
                }
            }
        });
    }

    function removeItem(product, cartItemDOM, addToCartButtonDOM) {
        cartItemDOM.classList.add('cart__item--removed');
        setTimeout(() => cartItemDOM.remove(), 250);
        cart = cart.filter(cartItem => cartItem.name !== product.name);
        saveCart();
        addToCartButtonDOM.innerText = 'Add To Cart';
        addToCartButtonDOM.disabled = false;

        if (cart.length < 1) {
            document.querySelector('.cart-footer').remove();
        }
    }

    function addCartFooter() {
        if (document.querySelector('.cart-footer') === null) {
            cartDOM.insertAdjacentHTML('afterend', `
      <div class="cart-footer">
        <button data-action="CLEAR_CART">Clear Cart</button>
        <p data-action="CHECKOUT">Total:</p>
      </div>
    `);

            document.querySelector('[data-action="CLEAR_CART"]').addEventListener('click', () => clearCart());
        }
    }

    function clearCart() {
        cartDOM.querySelectorAll('.cart__item').forEach(cartItemDOM => {
            cartItemDOM.classList.add('cart__item--removed');
            setTimeout(() => cartItemDOM.remove(), 250);
        });

        cart = [];
        localStorage.removeItem('cart');
        document.querySelector('.cart-footer').remove();

        addToCartButtonsDOM.forEach(addToCartButtonDOM => {
            addToCartButtonDOM.innerText = 'Add To Cart';
            addToCartButtonDOM.disabled = false;
        });
    }

    function countCartTotal() {
        let cartTotal = 0;
        cart.forEach(cartItem => cartTotal += cartItem.quantity * cartItem.price);
        document.querySelector('[data-action="CHECKOUT"]').innerText = `Pay $${cartTotal}`;
        return cartTotal;
    }

    function saveCart() {
        localStorage.setItem('cart', JSON.stringify(cart));
        countCartTotal();
    }

    function arrayOfItems() {

        cart.forEach((cartItem, index) => {
            let currency = cartItem.price;
            let quantity = cartItem.quantity;
            let itemName = cartItem.name;

            let items = [{"unit_amount": {"currency_code": "USD","value": currency},"quantity": quantity,"name": itemName,}];

            return items;

        });

    }
}

我已经使用了这段代码的较早部分,试图为此找到解决方案,并且我使用了“ .name;”。它已经奏效了。

0 个答案:

没有答案
相关问题