jQuery.on не вызывается внутри другого div

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

Когда я помещаю #myCart таблицу внутри тела, товары добавляются в корзину, и кнопка удалить также работает

jsfiddle.net/Ldnjf0by

 <!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>The Boutique</title>
        <link rel="icon" href="./img/favicon.png">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
        <link rel="stylesheet" href="./css/index.css">
        <link rel="stylesheet" href="./css/layout.css">
        <script type="text/javascript" src="./js/jquery-3.3.1.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
        <link href="https://fonts.googleapis.com/css?family=Laila" rel="stylesheet">
    </head>
    <body>
        <div class="logoRow">
            <div>
                <img style="width: 80px" src="./img/logo.png">
            </div>
            <div class="topSideBar">
                <div>
                    <ul>
                        <li>Cart</li>
                        <li id="cart_container">
                            <div id="cart_counter">0</div>

                            <div id="cart_button" class="image"></div>

                            <div id="cart_items">
                                <h3>Cart</h3>
                                <div id="cart-container" style="height:300px;">

                                </div>
                            </div>
                        </li>
                        <li><a href="#">Womens</a></li>
                        <li><a href="#">Mens</a></li>
                        <li><a href="#">Boys</a></li>
                        <li><a href="#">Girls</a></li>
                        <li><a href="#">Sign in</a></li>
                        <li><a href="#">Register</a></li>
                    </ul>
                </div>
            </div>
        </div>

        <div id="main-container">
            <div class="container">
                <p class="item">Soccer Ball</p>
                <p class="price">30</p>
                Qty <input type="number" class="qty" value="1" min="1">
                <button class="add">Add to cart</button>
            </div>
            <div class="container">
                <p class="item">Soccer Shoes</p>
                <p class="price">80</p>
                Qty <input type="number" class="qty" value="1" min="1">
                <button class="add">Add to cart</button>
            </div>
            <div class="container">
                <p class="item">Soccer Jersey</p>
                <p class="price">130</p>
                Qty <input type="number" class="qty" value="1" min="1">
                <button class="add">Add to cart</button>
            </div>
        </div>


        <table id="myCart" border="1">
            <tr>
                <th>Item Name</th>
                <th>Qty</th>
                <th>Price</th>
                <th>Total</th>
                <th>Remove</th>
            </tr>
            <tr style="display: none; border-top: 2px solid black;">
                <td colspan="3">Subtotal</td>
                <td class="right subtotal"></td>
            </tr>
        </table>

        <div class="bottomNav">
            <div class="bottomNavContents">
                <div>
                    <a href="/">Home</a>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
                    <a href="/about-kfc.php">About KFC</a>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
                    <a href="/contact-us.php">Contact Us</a>amp;nbsp;amp;nbsp;amp;nbsp;
                    <a href="#">Feedback</a>
                </div>
                <div class="socialMediaIcons">
                    <a href="#"><img style="width: 30px; height: 30px;" src="./img/fb-icon.jpg" alt=""></a>
                    <a href="#"><img style="width: 30px; height: 30px;" src="./img/instagram-icon.png" alt=""></a>
                    <a href="#"><img style="width: 30px; height: 30px;" src="./img/twitter-icon.png" alt=""></a>
                </div>
            </div>
        </div>
    </body>
    <script>
    $(document).ready(function () {

        // ANIMATEDLY DISPLAY THE NOTIFICATION COUNTER.
        $('#cart_counter').animate({ top: '-2px', opacity: 1 }, 500);

        $('#cart_button').click(function () {

            // TOGGLE (SHOW OR HIDE) NOTIFICATION WINDOW.
            $('#cart_items').fadeToggle('fast', 'linear');

            return false;
        });

        // HIDE cart_items WHEN CLICKED ANYWHERE ON THE PAGE.
        $(document).click(function () {
            $('#cart_items').hide();
        });

        $('#cart_items').click(function () {
            return false;       // DO NOTHING WHEN CONTAINER IS CLICKED.
        });

        $('.add').click(function() {

            var itemsNo = parseInt($('.itemsNo').text());
            itemsNo = itemsNo   1;

            $('.itemsNo').text(itemsNo);

            $('#myCart tr:last').show();

            var item = $(this).siblings('.item').text();
            var price = $(this).siblings('.price').text();
            var qty = $(this).siblings('.qty').val();
            var total = price * qty;

            // to check if item exists in table
            if($("td:contains('"   item   "')").length > 0) {
                var lastQty = $("td:contains('"   item   "')").next().text();

                var accumQty = parseInt(lastQty)   parseInt(qty);

                $("td:contains('"   item   "')").siblings('.qty2').text(accumQty);

                total = price * accumQty;

                $("td:contains('"   item   "')").siblings('.total').text(total);

                var sum = 0;
                $(".total").each(function() {
                    var val = parseInt($(this).text());
                    sum  = val;
                });

                $(".subtotal").text(sum);
            } else {
                $("#myCart tr:last").before(
                        "<tr>"  
                            "<td class='item_name'>"   item   "</td>"  
                            "<td class='qty2'>"   qty   "</td>"  
                            "<td class='right price2'><span class='currency'>$ </span>"   price   "</td>"  
                            "<td class='right total'>"   total   "</td>"  
                            "<td><button class='remItem' onclick='remove()'>X</button></td>"  
                        "</td>"
                );

                var sum = 0;
                $(".total").each(function() {
                    var val = parseInt($(this).text());
                    sum  = val;
                });

                $(".subtotal").text(sum);
            }

            $(this).siblings('.qty').val(1);
        });

        $(document).on("click", "button.remItem" , function() {
            var totalPrice = parseInt($('.subtotal').text()) - parseInt($(this).parent().siblings('.total').text());
            $(".subtotal").text(totalPrice);
            $(this).parent().parent().remove();
        });
    });
</script>
</html>
  

Но когда таблица #myCart помещается в #cart-container, кнопка удалить не работает. Но все добавить в корзину работает. Что вызывает такое поведение?

https://jsfiddle.net/Ldnjf0by/1/

 <!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>The Boutique</title>
        <link rel="icon" href="./img/favicon.png">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
        <link rel="stylesheet" href="./css/index.css">
        <link rel="stylesheet" href="./css/layout.css">
        <script type="text/javascript" src="./js/jquery-3.3.1.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
        <link href="https://fonts.googleapis.com/css?family=Laila" rel="stylesheet">
    </head>
    <body>
        <div class="logoRow">
            <div>
                <img style="width: 80px" src="./img/logo.png">
            </div>
            <div class="topSideBar">
                <div>
                    <ul>
                        <li>Cart</li>
                        <li id="cart_container">
                            <div id="cart_counter">0</div>

                            <div id="cart_button" class="image"></div>

                            <div id="cart_items">
                                <h3>Cart</h3>
                                <div id="cart-container" style="height:300px;">
                                    <table id="myCart" border="1">
                                        <tr>
                                            <th>Item Name</th>
                                            <th>Qty</th>
                                            <th>Price</th>
                                            <th>Total</th>
                                            <th>Remove</th>
                                        </tr>
                                        <tr style="display: none; border-top: 2px solid black;">
                                            <td colspan="3">Subtotal</td>
                                            <td class="right subtotal"></td>
                                        </tr>
                                    </table>
                                </div>
                            </div>
                        </li>
                        <li><a href="#">Womens</a></li>
                        <li><a href="#">Mens</a></li>
                        <li><a href="#">Boys</a></li>
                        <li><a href="#">Girls</a></li>
                        <li><a href="#">Sign in</a></li>
                        <li><a href="#">Register</a></li>
                    </ul>
                </div>
            </div>
        </div>

        <div id="main-container">
            <div class="container">
                <p class="item">Soccer Ball</p>
                <p class="price">30</p>
                Qty <input type="number" class="qty" value="1" min="1">
                <button class="add">Add to cart</button>
            </div>
            <div class="container">
                <p class="item">Soccer Shoes</p>
                <p class="price">80</p>
                Qty <input type="number" class="qty" value="1" min="1">
                <button class="add">Add to cart</button>
            </div>
            <div class="container">
                <p class="item">Soccer Jersey</p>
                <p class="price">130</p>
                Qty <input type="number" class="qty" value="1" min="1">
                <button class="add">Add to cart</button>
            </div>
        </div>




        <div class="bottomNav">
            <div class="bottomNavContents">
                <div>
                    <a href="/">Home</a>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
                    <a href="/about-kfc.php">About KFC</a>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;
                    <a href="/contact-us.php">Contact Us</a>amp;nbsp;amp;nbsp;amp;nbsp;
                    <a href="#">Feedback</a>
                </div>
                <div class="socialMediaIcons">
                    <a href="#"><img style="width: 30px; height: 30px;" src="./img/fb-icon.jpg" alt=""></a>
                    <a href="#"><img style="width: 30px; height: 30px;" src="./img/instagram-icon.png" alt=""></a>
                    <a href="#"><img style="width: 30px; height: 30px;" src="./img/twitter-icon.png" alt=""></a>
                </div>
            </div>
        </div>
    </body>
    <script>
    $(document).ready(function () {

        // ANIMATEDLY DISPLAY THE NOTIFICATION COUNTER.
        $('#cart_counter').animate({ top: '-2px', opacity: 1 }, 500);

        $('#cart_button').click(function () {

            // TOGGLE (SHOW OR HIDE) NOTIFICATION WINDOW.
            $('#cart_items').fadeToggle('fast', 'linear');

            return false;
        });

        // HIDE cart_items WHEN CLICKED ANYWHERE ON THE PAGE.
        $(document).click(function () {
            $('#cart_items').hide();
        });

        $('#cart_items').click(function () {
            return false;       // DO NOTHING WHEN CONTAINER IS CLICKED.
        });

        $('.add').click(function() {

            var itemsNo = parseInt($('.itemsNo').text());
            itemsNo = itemsNo   1;

            $('.itemsNo').text(itemsNo);

            $('#myCart tr:last').show();

            var item = $(this).siblings('.item').text();
            var price = $(this).siblings('.price').text();
            var qty = $(this).siblings('.qty').val();
            var total = price * qty;

            // to check if item exists in table
            if($("td:contains('"   item   "')").length > 0) {
                var lastQty = $("td:contains('"   item   "')").next().text();

                var accumQty = parseInt(lastQty)   parseInt(qty);

                $("td:contains('"   item   "')").siblings('.qty2').text(accumQty);

                total = price * accumQty;

                $("td:contains('"   item   "')").siblings('.total').text(total);

                var sum = 0;
                $(".total").each(function() {
                    var val = parseInt($(this).text());
                    sum  = val;
                });

                $(".subtotal").text(sum);
            } else {
                $("#myCart tr:last").before(
                        "<tr>"  
                            "<td class='item_name'>"   item   "</td>"  
                            "<td class='qty2'>"   qty   "</td>"  
                            "<td class='right price2'><span class='currency'>$ </span>"   price   "</td>"  
                            "<td class='right total'>"   total   "</td>"  
                            "<td><button class='remItem' onclick='remove()'>X</button></td>"  
                        "</td>"
                );

                var sum = 0;
                $(".total").each(function() {
                    var val = parseInt($(this).text());
                    sum  = val;
                });

                $(".subtotal").text(sum);
            }

            $(this).siblings('.qty').val(1);
        });

        $(document).on("click", "button.remItem" , function() {
            var totalPrice = parseInt($('.subtotal').text()) - parseInt($(this).parent().siblings('.total').text());
            $(".subtotal").text(totalPrice);
            $(this).parent().parent().remove();
        });
    });
</script>
</html>
  

Комментарии:

1. можете ли вы создать скрипку

2. @CognitiveDesire Вот скрипка для кода 1 jsfiddle.net/Ldnjf0by

3. @CognitiveDesire Вот скрипка для кода 2 jsfiddle.net/Ldnjf0by/1

Ответ №1:

Проблема в

 $('#cart_items').click(function () {
    return false;       // DO NOTHING WHEN CONTAINER IS CLICKED.
});
  

Этот код будет вызываться return false при #cart_items нажатии перед событием кнопки удаления, и это остановит событие удаления из триггера .. [1] удалите return false

[2] Также вместо $(this).parent().parent().remove(); использования $(this).closest('tr').remove()

Примечание: С .remove вам потребуется немного поработать, чтобы проверить, есть ли в списке только один элемент, чтобы также удалить общую строку

Смотрите скрипке

Ответ №2:

удалите onClick из этой строки, поскольку он уже реализован в коде

 <td><button class='remItem' onclick='remove()'>X</button></td>
  

Также, поскольку td добавляются динамически, вывод событий не происходит должным образом. Изменен целевой щелчок, чтобы отобразить событие

Исправлено, проверьте это https://jsfiddle.net/ujf3e42r /

Комментарии:

1. @S.Sandeep добавил новую скрипку