James Min Ответов: 1

Проблема в корзине покупок в javascript (ES6)


У меня есть простая проблема: функция добавления в корзину работает не так, как должна. Когда я нажимаю кнопку Удалить, он добавляет что-то в корзину. Но когда я нажимаю кнопку Добавить в корзину, она ничего не выводит.


const products = [];
const carts = [];
const inputs = {
    productId: document.getElementById("productID"),
    desc: document.getElementById("product_desc"),
    qty: document.getElementById("quantity"),
    price: document.getElementById("price")
};
const productsTable = document.getElementById("products-table");
const cartsTable = document.getElementById("carts-table");
document.getElementById('btnAddProduct').onclick = addProduct;

function renderProductsTable(e) {
    // delete all entries
    [...productsTable.children].slice(1).forEach(entry => productsTable.removeChild(entry));
        for (product of products) {
            let tr = document.createElement('tr');
            tr.innerHTML = `<td>${ product.id }</td>
                            <td>${ product.desc }</td>
                            <td>${ product.qty }</td>
                            <td>${ product.price }</td>
                            <td>
                                <button id="${ product.id }">Delete</button>
                                <button id="${ product.id }">Add to Cart</button>
                            </td>`;

            productsTable.appendChild(tr);
            document.getElementById(product.id).addEventListener("click", removeProduct);
            document.getElementById(product.id).addEventListener("click", addCart);

            
        }

}
function renderCartsTable(e) {
    // delete all entries
    [...cartsTable.children].slice(1).forEach(entry => cartsTable.removeChild(entry));
        for (cart of carts) {
            let tr = document.createElement('tr');
            tr.innerHTML = `<td>${ product.id }</td>
                            <td>${ product.desc }</td>
                            <td>${ product.qty }</td>
                            <td>${ product.price }</td>
                             <td>${ product.price * product.qty }</td>
                            <td>
                                <button id="${ product.id }">Delete</button>
                            </td>`;
            cartsTable.appendChild(tr);
        }
         console.log(carts);
}
function addProduct() {
    const product = {
        id: inputs.productId.value,
        desc: inputs.desc.value,
        qty: Number(inputs.qty.value),
        price: Number(inputs.price.value)
    };
    if (product.id === '') {
        alert('Please enter a product id');
    return;
    }
        let existing = products.find(item => item.id === product.id);
            if (existing) {
                existing.qty += product.qty;
            } 
            else {
                products.push(product);
            }
            renderProductsTable();
            document.getElementById('order').reset();
    }
function removeProduct(product_id) {
    const index = products.findIndex(p => p.id === product_id);
    products.splice(index, 1);
    renderProductsTable();
}
function addCart(product_id) {
    const product = products.find(p => p.id === product_id);
    const cartItem = carts.find(c => c.product === product);
    if(cartItem) {
        cartItem.qty ++;
    }
    else {
            carts.push(product);
        }
        renderCartsTable();        
}



<body>
<form name="order" id="order">
    <table>
        <tr>
            <td>
                <label for="productID">Product ID:</label>
            </td>
            <td>
                <input id="productID" name="product" type="text" size="28" required/>
            </td>
        </tr>
        <tr>
            <td>
                <label for="product">Product Desc:</label>
            </td>
            <td>
                <input id="product_desc" name="product" type="text" size="28" required/>
            </td>
        </tr>
        <tr>
            <td>
                <label for="quantity">Quantity:</label>
            </td>
            <td>
                <input id="quantity" name="quantity" width="196px" required/>
            </td>
        </tr>
        <tr>
            <td>
                <label for="price">Price:</label>
            </td>
            <td>
                <input id="price" name="price" size="28" required/>
            </td>
        </tr>
    </table>
    <input type="reset" class="resetbtn" value="Reset" />
    <input type="button" id="btnAddProduct" value="Add New Product" >
</form>
<table border="1|1" id="products-table">
    <tr>
        <th>Product ID</th>
        <th>Product Description</th>
        <th>Quantity</th>
        <th>Price</th>
        <th>Action</th>
    </tr>
</table>
<h2>Shopping Cart</h2>
<table border="1|1" id="carts-table">
    <tr>
        <th>Product ID</th>
        <th>Product Description</th>
        <th>Quantity</th>
        <th>Price</th>
        <th>Total</th>
        <th>Action</th>
    </tr>
</table>
<br />
</body>
<script src="script.js"></script>


Что я уже пробовал:

Я попробовал несколько шагов, как это исправить, но, похоже, это все еще не работает. Надеюсь, вы сможете помочь. Спасибо.

Andy Lanng

Привет :)

1 Ответов

Рейтинг:
2

Andy Lanng

Хорошо-идентификаторы ваших динамических кнопок все одинаковы. Ты не можешь этого сделать. Это вызывает массу проблем.

Попробуйте этот сценарий. У него все еще есть проблемы, но идентификаторы, по крайней мере, уникальны:

const products = [];
const carts = [];
const inputs = {
    productId: document.getElementById("productID"),
    desc: document.getElementById("product_desc"),
    qty: document.getElementById("quantity"),
    price: document.getElementById("price")
};
const productsTable = document.getElementById("products-table");
const cartsTable = document.getElementById("carts-table");
document.getElementById('btnAddProduct').onclick = addProduct;

function renderProductsTable(e) {
    // delete all entries
    [...productsTable.children].slice(1).forEach(entry => productsTable.removeChild(entry));
        for (product of products) {
            let tr = document.createElement('tr');
            tr.innerHTML = `<td>${ product.id }</td>
                            <td>${ product.desc }</td>
                            <td>${ product.qty }</td>
                            <td>${ product.price }</td>
                            <td>
                                <button id="${ "del_" + product.id }">Delete</button>
                                <button id="${ "add_" + product.id }">Add to Cart</button>
                            </td>`;
							
            productsTable.appendChild(tr);
            document.getElementById("del_" + product.id).addEventListener("click", removeProduct);
            document.getElementById("add_" + product.id).addEventListener("click", addCart);
			
        }
		
}
function renderCartsTable(e) {
    // delete all entries
    [...cartsTable.children].slice(1).forEach(entry => cartsTable.removeChild(entry));
        for (cart of carts) {
            let tr = document.createElement('tr');
            tr.innerHTML = `<td>${ product.id }</td>
                            <td>${ product.desc }</td>
                            <td>${ product.qty }</td>
                            <td>${ product.price }</td>
                             <td>${ product.price * product.qty }</td>
                            <td>
                                <button id="${ "c_del_" + product.id }">Delete</button>
                            </td>`;
            cartsTable.appendChild(tr);
        }
         console.log(carts);
}
function addProduct() {
    const product = {
        id: inputs.productId.value,
        desc: inputs.desc.value,
        qty: Number(inputs.qty.value),
        price: Number(inputs.price.value)
    };
    if (product.id === '') {
        alert('Please enter a product id');
    return;
    }
        let existing = products.find(item => item.id === product.id);
            if (existing) {
                existing.qty += product.qty;
            } 
            else {
                products.push(product);
            }
            renderProductsTable();
            document.getElementById('order').reset();
    }
function removeProduct(product_id) {
    const index = products.findIndex(p => p.id === product_id);
    products.splice(index, 1);
    renderProductsTable();
}
function addCart(product_id) {
    const product = products.find(p => p.id === product_id);
    const cartItem = carts.find(c => c.product === product);
    if(cartItem) {
        cartItem.qty ++;
    }
    else {
            carts.push(product);
        }
        renderCartsTable();        
}


James Min

Есть еще одна проблема. Я не могу добавить второй товар в корзину

Andy Lanng

Вы знаете, как отлаживать сценарий?

Есть несколько ошибок, которые вы должны уметь находить. В Chrome и IE вы можете нажать клавишу F12,чтобы открыть окно отладки. Вы можете увидеть ошибки в скрипте и даже пройти через него с точками останова, чтобы проверить значения.

Для Firefox вам нужно расширение под названием FireBug, но оно работает почти так же, как и два других

James Min

@Andy Lanng